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

ppkarwasz pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/commons-xml.git

commit 5cdc5b1504410d915a1a2df33e3141c664b7d3ee
Author: Piotr P. Karwasz <[email protected]>
AuthorDate: Sat Jun 20 22:07:23 2026 +0200

    Repackage as org.apache.commons:commons-xml
    
    Revert the Copernik rebrand and restore the project as an Apache Commons
    (Sandbox) component.
    
    Code and coordinates:
    - Rename the package eu.copernik.xml.factory to org.apache.commons.xml
      (collapsing the .factory segment to match commons.module.name and the
      OSGi export), including the AndroidProvider class-name string literal.
    - Set name "Apache Commons XML", url, and the description; fix the SCM url
      that still pointed at commons-configuration.
    
    Licensing and ASF scaffolding:
    - Replace the SPDX/Copernik file headers with the standard ASF license
      header across all sources and config.
    - Restore LICENSE.txt (renamed back from LICENSE) and add NOTICE.txt.
    - Add .asf.yaml, .gitattributes, src/changes/changes.xml, src/site/site.xml,
      and the .github files (pull_request_template.md, GH-ROBOTS.txt,
      dependency-review.yml, scorecards-analysis.yml).
    - Add a Sandbox warning to the README and the site index.
    
    Build and release model:
    - Bump commons-parent from 99 to 102.
    - Set commons.jira.id=COMMONSXML and use JIRA (issueManagement,
      ciManagement, and dist-staging now inherit from the parent); keep only
      commons.scmPubUrl explicit for the sandbox site path.
    - Remove the Sonatype Central publishing setup (central.publishing.version,
      cyclonedx.skipNotDeployed, assembly.skipAssembly, flatten-maven-plugin)
      and revert to the standard ASF release flow.
    
    Assisted-By: Claude Opus 4.8 (1M context) <[email protected]>
---
 .asf.yaml                                          |  30 ++++
 .gitattributes                                     |  24 +++
 .github/GH-ROBOTS.txt                              |  19 +++
 .github/dependabot.yml                             |  16 +-
 .github/pull_request_template.md                   |  30 ++++
 .github/workflows/codeql-analysis.yml              |  16 +-
 .github/workflows/dependency-review.yml            |  31 ++++
 .github/workflows/maven.yml                        |  16 +-
 .github/workflows/scorecards-analysis.yml          |  69 +++++++++
 AGENTS.md                                          |  18 ++-
 LICENSE => LICENSE.txt                             |   0
 NOTICE.txt                                         |   5 +
 README.md                                          |  45 ++++--
 android-tests/README.md                            |  18 ++-
 android-tests/build.gradle.kts                     |  18 ++-
 android-tests/gradle.properties                    |  16 +-
 .../gradle/wrapper/gradle-wrapper.properties       |  16 +-
 android-tests/settings.gradle.kts                  |  18 ++-
 android-tests/src/main/AndroidManifest.xml         |  18 ++-
 pom.xml                                            | 166 +++++----------------
 src/changes/changes.xml                            |  41 +++++
 .../copernik/xml/factory/DelegatingTemplates.java  |  34 -----
 .../apache/commons/xml}/AndroidProvider.java       |  18 ++-
 .../xml}/DelegatingDocumentBuilderFactory.java     |  18 ++-
 .../apache/commons/xml}/DelegatingSAXParser.java   |  18 ++-
 .../commons/xml}/DelegatingSAXParserFactory.java   |  18 ++-
 .../commons/xml}/DelegatingSchemaFactory.java      |  18 ++-
 .../apache/commons/xml/DelegatingTemplates.java    |  46 ++++++
 .../apache/commons/xml}/DelegatingTransformer.java |  18 ++-
 .../commons/xml}/DelegatingTransformerFactory.java |  18 ++-
 .../apache/commons/xml}/DelegatingXMLReader.java   |  18 ++-
 .../apache/commons/xml}/HardeningException.java    |  18 ++-
 .../commons/xml}/HardeningSAXParserFactory.java    |  18 ++-
 .../apache/commons/xml}/HardeningSchema.java       |  18 ++-
 .../commons/xml}/HardeningSchemaFactory.java       |  18 ++-
 .../apache/commons/xml}/HardeningTemplates.java    |  18 ++-
 .../apache/commons/xml}/HardeningTransformer.java  |  18 ++-
 .../commons/xml}/HardeningTransformerFactory.java  |  18 ++-
 .../apache/commons/xml}/HardeningValidator.java    |  18 ++-
 .../apache/commons/xml}/JaxpSetters.java           |  18 ++-
 .../factory => org/apache/commons/xml}/Limits.java |  22 ++-
 .../apache/commons/xml}/Resolvers.java             |  18 ++-
 .../apache/commons/xml}/SaxonProvider.java         |  18 ++-
 .../apache/commons/xml}/StockJdkProvider.java      |  24 ++-
 .../apache/commons/xml}/WoodstoxProvider.java      |  18 ++-
 .../apache/commons/xml}/XalanProvider.java         |  20 ++-
 .../apache/commons/xml}/XercesProvider.java        |  20 ++-
 .../apache/commons/xml}/XmlFactories.java          |  20 ++-
 src/site/markdown/index.md                         |  42 ++++--
 src/site/resources/profile.japicmp                 |  16 +-
 src/site/site.xml                                  |  29 ++++
 .../eu/copernik/xml/factory/SchemaImportTest.java  |  29 ----
 .../eu/copernik/xml/factory/SchemaIncludeTest.java |  29 ----
 .../copernik/xml/factory/SchemaRedefineTest.java   |  29 ----
 .../copernik/xml/factory/TemplatesImportTest.java  |  22 ---
 .../copernik/xml/factory/TemplatesIncludeTest.java |  22 ---
 .../xml/factory/TransformerDocumentTest.java       |  22 ---
 .../apache/commons/xml}/AttackTestSupport.java     |   2 +-
 .../apache/commons/xml}/BillionLaughsTest.java     |  18 ++-
 .../apache/commons/xml}/DoctypeOnlyTest.java       |  18 ++-
 .../apache/commons/xml}/ExternalDtdTest.java       |  18 ++-
 .../commons/xml}/ExternalGeneralEntityTest.java    |  18 ++-
 .../commons/xml}/ExternalParameterEntityTest.java  |  18 ++-
 .../apache/commons/xml}/NoDoctypeTest.java         |  18 ++-
 .../commons/xml}/SaxonXPathExternalCallsTest.java  |  18 ++-
 .../org/apache/commons/xml/SchemaImportTest.java   |  41 +++++
 .../org/apache/commons/xml/SchemaIncludeTest.java  |  41 +++++
 .../org/apache/commons/xml/SchemaRedefineTest.java |  41 +++++
 .../apache/commons/xml/TemplatesImportTest.java    |  34 +++++
 .../apache/commons/xml/TemplatesIncludeTest.java   |  34 +++++
 .../commons/xml/TransformerDocumentTest.java       |  34 +++++
 .../xml}/UnsupportedXmlImplementationTest.java     |  18 ++-
 .../apache/commons/xml}/XmlFactoriesTest.java      |  18 ++-
 .../apache/commons/xml}/DescriptorIT.java          |  18 ++-
 74 files changed, 1342 insertions(+), 481 deletions(-)

diff --git a/.asf.yaml b/.asf.yaml
new file mode 100644
index 0000000..c06ba11
--- /dev/null
+++ b/.asf.yaml
@@ -0,0 +1,30 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+github:
+  description: "Apache Commons XML"
+  homepage: https://commons.apache.org/sandbox/commons-xml/
+
+notifications:
+    commits:      [email protected]
+    issues:       [email protected]
+    pullrequests: [email protected]
+    jira_options: link label
+    jobs:         [email protected]
+    # commits_bot_dependabot: [email protected]
+    issues_bot_dependabot: [email protected]
+    pullrequests_bot_dependabot: [email protected]
+    issues_bot_codecov-commenter: [email protected]
+    pullrequests_bot_codecov-commenter: [email protected]
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..715c926
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,24 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+# Auto detect text files and perform LF normalization
+*        text=auto
+
+*.java   text diff=java
+*.html   text diff=html
+*.css    text
+*.js     text
+*.sql    text
diff --git a/.github/GH-ROBOTS.txt b/.github/GH-ROBOTS.txt
new file mode 100644
index 0000000..64a8867
--- /dev/null
+++ b/.github/GH-ROBOTS.txt
@@ -0,0 +1,19 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# Keeps on creating FUD PRs in test code
+# Does not follow Apache disclosure policies
+User-agent: JLLeitschuh/security-research
+Disallow: *
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index 42685f2..7125dd4 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -1,5 +1,17 @@
-# SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-# SPDX-License-Identifier: Apache-2.0
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 version: 2
 updates:
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
new file mode 100644
index 0000000..9ff35c8
--- /dev/null
+++ b/.github/pull_request_template.md
@@ -0,0 +1,30 @@
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+    https://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+-->
+
+Thanks for your contribution to [Apache Commons](https://commons.apache.org/)! 
Your help is appreciated!
+
+Before you push a pull request, review this list:
+
+- [ ] Read the [contribution guidelines](CONTRIBUTING.md) for this project.
+- [ ] Read the [ASF Generative Tooling 
Guidance](https://www.apache.org/legal/generative-tooling.html) if you use 
Artificial Intelligence (AI).
+- [ ] I used AI to create any part of, or all of, this pull request. Which AI 
tool was used to create this pull request, and to what extent did it contribute?
+- [ ] Run a successful build using the default 
[Maven](https://maven.apache.org/) goal with `mvn`; that's `mvn` on the command 
line by itself.
+- [ ] Write unit tests that match behavioral changes, where the tests fail if 
the changes to the runtime are not applied. This may not always be possible, 
but it is a best practice.
+- [ ] Write a pull request description that is detailed enough to understand 
what the pull request does, how, and why.
+- [ ] Each commit in the pull request should have a meaningful subject line 
and body. Note that a maintainer may squash commits during the merge process.
diff --git a/.github/workflows/codeql-analysis.yml 
b/.github/workflows/codeql-analysis.yml
index e4ff2b7..fff0865 100644
--- a/.github/workflows/codeql-analysis.yml
+++ b/.github/workflows/codeql-analysis.yml
@@ -1,5 +1,17 @@
-# SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-# SPDX-License-Identifier: Apache-2.0
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 name: CodeQL
 
diff --git a/.github/workflows/dependency-review.yml 
b/.github/workflows/dependency-review.yml
new file mode 100644
index 0000000..f0d8ca9
--- /dev/null
+++ b/.github/workflows/dependency-review.yml
@@ -0,0 +1,31 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+
+name: 'Dependency Review'
+on: [pull_request]
+
+permissions:
+  contents: read
+
+jobs:
+  dependency-review:
+    runs-on: ubuntu-latest
+    steps:
+      - name: 'Checkout Repository'
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # 
v6.0.2
+      - name: 'Dependency Review PR'
+        uses: 
actions/dependency-review-action@2031cfc080254a8a887f58cffee85186f0e49e48 # 
v4.9.0
diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index 34a3f7a..f757817 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -1,5 +1,17 @@
-# SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-# SPDX-License-Identifier: Apache-2.0
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 name: Java CI
 
diff --git a/.github/workflows/scorecards-analysis.yml 
b/.github/workflows/scorecards-analysis.yml
new file mode 100644
index 0000000..90aea06
--- /dev/null
+++ b/.github/workflows/scorecards-analysis.yml
@@ -0,0 +1,69 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache license, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the license for the specific language governing permissions and
+# limitations under the license.
+
+name: "Scorecards supply-chain security"
+
+on:
+  branch_protection_rule:
+  schedule:
+    - cron: "30 1 * * 6"    # Weekly on Saturdays
+  push:
+    branches: [ "main" ]
+
+permissions: read-all
+
+jobs:
+
+  analysis:
+
+    name: "Scorecards analysis"
+    runs-on: ubuntu-latest
+    permissions:
+      # Needed to upload the results to the code-scanning dashboard.
+      security-events: write
+      actions: read
+      id-token: write # This is required for requesting the JWT
+      contents: read  # This is required for actions/checkout
+
+    steps:
+
+      - name: "Checkout code"
+        uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd   # 
6.0.2
+        with:
+          persist-credentials: false
+
+      - name: "Run analysis"
+        uses: ossf/scorecard-action@4eaacf0543bb3f2c246792bd56e8cdeffafb205a   
 # 2.4.3
+        with:
+          results_file: results.sarif
+          results_format: sarif
+          # A read-only PAT token, which is sufficient for the action to 
function.
+          # The relevant discussion: 
https://github.com/ossf/scorecard-action/issues/188
+          repo_token: ${{ secrets.GITHUB_TOKEN }}
+          # Publish the results for public repositories to enable scorecard 
badges.
+          # For more details: 
https://github.com/ossf/scorecard-action#publishing-results
+          publish_results: true
+
+      - name: "Upload artifact"
+        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a 
# v7.0.1
+        with:
+          name: SARIF file
+          path: results.sarif
+          retention-days: 5
+
+      - name: "Upload to code-scanning"
+        uses: 
github/codeql-action/upload-sarif@95e58e9a2cdfd71adc6e0353d5c52f41a045d225 # 
v4.35.2
+        with:
+          sarif_file: results.sarif
diff --git a/AGENTS.md b/AGENTS.md
index 474a7e1..c0b0db0 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,7 +1,19 @@
 <!--
-  ~ SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-  ~ SPDX-License-Identifier: Apache-2.0
-  -->
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 
 # AGENTS.md
 
diff --git a/LICENSE b/LICENSE.txt
similarity index 100%
rename from LICENSE
rename to LICENSE.txt
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..9365449
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Commons XML
+Copyright 2026 The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (https://www.apache.org/).
diff --git a/README.md b/README.md
index e3befe6..40d0807 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,26 @@
 <!--
-  ~ SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-  ~ SPDX-License-Identifier: Apache-2.0
-  -->
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
 
-# Copernik XML Factory
+     https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
+
+# Apache Commons XML
+
+> [!WARNING]
+> **Sandbox component.** Apache Commons XML is part of the
+> [Apache Commons Sandbox](https://commons.apache.org/sandbox/). It is a work 
in progress, has not been formally
+> released, and its API, coordinates, and behaviour may change without notice. 
Do not rely on it in production.
 
 Secure-by-default JAXP factory creation for Java.
 A single method call returns a hardened JAXP factory that can be used to 
**safely** parse XML files.
@@ -33,9 +50,9 @@ Add the library to your build:
 
 ```xml
 <dependency>
-  <groupId>eu.copernik</groupId>
-  <artifactId>copernik-xml-factory</artifactId>
-  <version>0.1.0</version>
+  <groupId>org.apache.commons</groupId>
+  <artifactId>commons-xml</artifactId>
+  <version>0.1.0-SNAPSHOT</version>
 </dependency>
 ```
 
@@ -44,7 +61,7 @@ other configuration is required. On hardened factories any 
attempt to resolve an
 stylesheet) is blocked, and DOCTYPE input is rejected wherever the underlying 
implementation allows it.
 
 Each method is documented in the
-[`XmlFactories` 
Javadoc](https://javadoc.io/doc/eu.copernik/copernik-xml-factory/latest/eu/copernik/xml/factory/XmlFactories.html),
+[`XmlFactories` 
Javadoc](https://javadoc.io/doc/org.apache.commons/commons-xml/latest/org/apache/commons/xml/XmlFactories.html),
 hosted on javadoc.io.
 
 ### Supported implementations
@@ -66,7 +83,7 @@ requires a code change to this library.
 
 ```java
 import org.w3c.dom.Document;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 Document doc = 
XmlFactories.newDocumentBuilderFactory().newDocumentBuilder().parse(inputStream);
 ```
@@ -74,7 +91,7 @@ Document doc = 
XmlFactories.newDocumentBuilderFactory().newDocumentBuilder().par
 **SAX parsing** via `SAXParserFactory`:
 
 ```java
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 XmlFactories.newSAXParserFactory().newSAXParser().parse(inputStream, 
myDefaultHandler);
 ```
@@ -83,7 +100,7 @@ 
XmlFactories.newSAXParserFactory().newSAXParser().parse(inputStream, myDefaultHa
 
 ```java
 import javax.xml.stream.XMLStreamReader;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 XMLStreamReader reader = 
XmlFactories.newXMLInputFactory().createXMLStreamReader(inputStream);
 ```
@@ -92,7 +109,7 @@ XMLStreamReader reader = 
XmlFactories.newXMLInputFactory().createXMLStreamReader
 
 ```java
 import javax.xml.transform.stream.StreamSource;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 XmlFactories.newTransformerFactory()
         .newTransformer(new StreamSource(stylesheet))
         .transform(new StreamSource(inputStream), new 
StreamResult(outputStream));
@@ -103,7 +120,7 @@ XmlFactories.newTransformerFactory()
 ```java
 import javax.xml.xpath.XPathConstants;
 import org.w3c.dom.NodeList;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 NodeList hits = (NodeList) XmlFactories.newXPathFactory()
         .newXPath()
@@ -114,7 +131,7 @@ NodeList hits = (NodeList) XmlFactories.newXPathFactory()
 
 ```java
 import javax.xml.transform.stream.StreamSource;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 XmlFactories.newSchemaFactory()
         .newSchema(new StreamSource(xsdStream))
diff --git a/android-tests/README.md b/android-tests/README.md
index dbf0267..729af19 100644
--- a/android-tests/README.md
+++ b/android-tests/README.md
@@ -1,7 +1,19 @@
 <!--
-  ~ SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-  ~ SPDX-License-Identifier: Apache-2.0
-  -->
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 
 # Android instrumented tests
 
diff --git a/android-tests/build.gradle.kts b/android-tests/build.gradle.kts
index f76d3a1..d827047 100644
--- a/android-tests/build.gradle.kts
+++ b/android-tests/build.gradle.kts
@@ -1,6 +1,18 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
 import com.android.build.api.dsl.ManagedVirtualDevice
@@ -14,7 +26,7 @@ val libraryVersion = "0.2.0-SNAPSHOT"
 val libraryJar = 
rootProject.file("../target/copernik-xml-factory-${libraryVersion}.jar")
 
 android {
-    namespace = "eu.copernik.xml.factory.androidtests"
+    namespace = "org.apache.commons.xml.androidtests"
     compileSdk = 34
 
     defaultConfig {
diff --git a/android-tests/gradle.properties b/android-tests/gradle.properties
index 9bd491b..69bbe55 100644
--- a/android-tests/gradle.properties
+++ b/android-tests/gradle.properties
@@ -1,5 +1,17 @@
-# SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-# SPDX-License-Identifier: Apache-2.0
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
 android.useAndroidX=true
diff --git a/android-tests/gradle/wrapper/gradle-wrapper.properties 
b/android-tests/gradle/wrapper/gradle-wrapper.properties
index 2d1208e..f238904 100644
--- a/android-tests/gradle/wrapper/gradle-wrapper.properties
+++ b/android-tests/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,17 @@
-# SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-# SPDX-License-Identifier: Apache-2.0
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
diff --git a/android-tests/settings.gradle.kts 
b/android-tests/settings.gradle.kts
index 6fef1d6..b3bef23 100644
--- a/android-tests/settings.gradle.kts
+++ b/android-tests/settings.gradle.kts
@@ -1,6 +1,18 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
 pluginManagement {
@@ -19,4 +31,4 @@ dependencyResolutionManagement {
     }
 }
 
-rootProject.name = "copernik-xml-factory-android-tests"
+rootProject.name = "commons-xml-android-tests"
diff --git a/android-tests/src/main/AndroidManifest.xml 
b/android-tests/src/main/AndroidManifest.xml
index a10945c..8ab83bd 100644
--- a/android-tests/src/main/AndroidManifest.xml
+++ b/android-tests/src/main/AndroidManifest.xml
@@ -1,7 +1,19 @@
 <?xml version="1.0" encoding="utf-8"?>
 <!--
-  ~ SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-  ~ SPDX-License-Identifier: Apache-2.0
-  -->
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 
 <manifest />
diff --git a/pom.xml b/pom.xml
index eb7a2db..caea7d8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,91 +1,71 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-  ~ SPDX-License-Identifier: Apache-2.0
-  -->
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+     https://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+-->
 
 <project xmlns="http://maven.apache.org/POM/4.0.0"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 
https://maven.apache.org/maven-v4_0_0.xsd";>
   <modelVersion>4.0.0</modelVersion>
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-parent</artifactId>
-    <version>99</version>
+    <version>102</version>
   </parent>
-  <groupId>eu.copernik</groupId>
-  <artifactId>copernik-xml-factory</artifactId>
-  <version>0.2.0-SNAPSHOT</version>
-  <name>Copernik XML Factory</name>
-  <url>https://github.com/copernik-eu/copernik-xml-factory/</url>
+  <artifactId>commons-xml</artifactId>
+  <version>0.1.0-SNAPSHOT</version>
+  <name>Apache Commons XML</name>
+  <url>https://commons.apache.org/sandbox/commons-xml/</url>
   <inceptionYear>2026</inceptionYear>
-  <description>XML Factory provides secure-by-default JAXP factory creation, 
abstracting over
+  <description>Apache Commons XML provides secure-by-default JAXP factory 
creation, abstracting over
     implementation-specific XXE hardening differences between the stock JDK 
and external JAXP implementations
     (Android, Apache Xalan, Apache Xerces, Woodstox, Saxon-HE).</description>
 
-  <organization>
-    <name>Copernik</name>
-    <url>https://oss.copernik.eu</url>
-  </organization>
-
   <developers>
     <developer>
       <id>ppkarwasz</id>
       <name>Piotr P. Karwasz</name>
-      <email>[email protected]</email>
-      <organization>Copernik</organization>
-      <organizationUrl>https://oss.copernik.eu</organizationUrl>
+      <email>[email protected]</email>
     </developer>
   </developers>
 
   <scm>
-    
<connection>scm:git:https://github.com/copernik-eu/copernik-xml-factory.git</connection>
-    
<developerConnection>scm:git:[email protected]:copernik-eu/copernik-xml-factory.git</developerConnection>
-    <url>https://github.com/copernik-eu/copernik-xml-factory</url>
-    <tag>v${project.version}</tag>
+    
<connection>scm:git:https://gitbox.apache.org/repos/asf/commons-xml.git</connection>
+    
<developerConnection>scm:git:https://gitbox.apache.org/repos/asf/commons-xml.git</developerConnection>
+    <url>https://gitbox.apache.org/repos/asf?p=commons-xml.git</url>
+    <tag>rel/commons-xml-${project.version}</tag>
   </scm>
 
-  <issueManagement>
-    <system>GitHub Issues</system>
-    <url>https://github.com/copernik-eu/copernik-xml-factory/issues</url>
-  </issueManagement>
-
-  <ciManagement>
-    <system>GitHub Actions</system>
-    <url>https://github.com/copernik-eu/copernik-xml-factory/actions</url>
-  </ciManagement>
-
-  <!-- Issue tracking and discussion happen on GitHub. -->
-  <mailingLists>
-    <mailingList/>
-  </mailingLists>
-
-  <distributionManagement>
-    <repository>
-      <id>central</id>
-      <url>https://central.sonatype.com</url>
-    </repository>
-    <snapshotRepository>
-      <id>central</id>
-      <url>https://central.sonatype.com/repository/maven-snapshots/</url>
-    </snapshotRepository>
-  </distributionManagement>
-
   <properties>
     <!-- Release-related properties -->
     <commons.release.version>0.1.1</commons.release.version>
     <commons.release.desc>(Java 8+)</commons.release.desc>
     <commons.rc.version>RC1</commons.rc.version>
-    <!-- japicmp baseline: compare the API against the previous release. -->
-    <commons.bc.version>0.1.1</commons.bc.version>
+    <!-- japicmp baseline: disable for first release
+    <commons.bc.version>0.1.1</commons.bc.version> -->
+    <japicmp.skip>true</japicmp.skip>
     <commons.release.next>0.1.2</commons.release.next>
-    <commons.componentid>copernik-xml-factory</commons.componentid>
-    <commons.packageId>xml.factory</commons.packageId>
-    <commons.module.name>eu.copernik.xml.factory</commons.module.name>
-    <commons.distSvnStagingUrl/>
-    <commons.scmPubUrl/>
+    <commons.componentid>xml</commons.componentid>
+    <commons.packageId>xml</commons.packageId>
+    <commons.module.name>org.apache.commons.xml</commons.module.name>
+    <commons.jira.id>COMMONSXML</commons.jira.id>
+    <!-- Sandbox component: publish the site under the sandbox tree (the 
parent defaults to proper/). -->
+    
<commons.scmPubUrl>https://svn.apache.org/repos/infra/websites/production/commons/content/sandbox/commons-xml</commons.scmPubUrl>
 
     <!-- OSGi bundle metadata: override commons-parent's org.apache.commons.* 
defaults. -->
-    
<commons.osgi.symbolicName>eu.copernik.xml.factory</commons.osgi.symbolicName>
-    
<commons.osgi.export>eu.copernik.xml.factory.*;version=${project.version};-noimport:=true</commons.osgi.export>
+    
<commons.osgi.symbolicName>org.apache.commons.xml</commons.osgi.symbolicName>
+    
<commons.osgi.export>org.apache.commons.xml.*;version=${project.version};-noimport:=true</commons.osgi.export>
     <commons.osgi.import>
       net.sf.saxon.*;resolution:=optional,
       org.apache.xerces.*;resolution:=optional,
@@ -93,9 +73,6 @@
     </commons.osgi.import>
     
<project.build.outputTimestamp>2026-04-22T00:00:00Z</project.build.outputTimestamp>
 
-    <!-- No JIRA: tracked in GitHub Issues. -->
-    <changes.jira.skip>true</changes.jira.skip>
-
     <!-- Java baseline -->
     <maven.compiler.source>1.8</maven.compiler.source>
     <maven.compiler.target>1.8</maven.compiler.target>
@@ -105,27 +82,13 @@
     <commons.woodstox.version>7.1.1</commons.woodstox.version>
     <commons.xalan.version>2.7.3</commons.xalan.version>
     <commons.xerces.version>2.12.2</commons.xerces.version>
-
-    <!-- Sonatype Central Publishing -->
-    <central.publishing.version>0.10.0</central.publishing.version>
-    <!-- We use Central and the `deploy` goal auto-detection does not 
currently work with it -->
-    <cyclonedx.skipNotDeployed>false</cyclonedx.skipNotDeployed>
-
-    <!--
-      Skip the source-release assembly inherited from the release profile: it 
expects the ASF
-      src/assembly/src.xml descriptor, and we publish to Central rather than 
cutting an ASF release.
-    -->
-    <assembly.skipAssembly>true</assembly.skipAssembly>
-
-    <!-- Flatten Maven plugin: produces a consumer POM at deploy time. -->
-    <flatten-maven-plugin.version>1.7.3</flatten-maven-plugin.version>
   </properties>
 
   <dependencies>
     <!--
       Saxon-HE supplies types we reference at compile time (the Saxon 
provider). It is not part of the consumer
-      contract: callers who want Saxon-HE for XSLT/XPath bring it themselves, 
and the flatten plugin drops every
-      provided-scope dependency from the published POM.
+      contract: it is declared in provided scope, so callers who want Saxon-HE 
for XSLT/XPath bring it themselves
+      and it is never pulled in transitively.
     -->
     <dependency>
       <groupId>net.sf.saxon</groupId>
@@ -325,7 +288,7 @@
       <!--
         commons-parent's create-source-jar execution attaches both the main 
sources (jar-no-fork) and the test
         sources (test-jar-no-fork) in one execution. Disable it and re-bind a 
main-sources-only execution, so the
-        published artifact keeps the Central-required sources jar but drops 
the test-sources jar.
+        published artifact keeps the required sources jar but drops the 
test-sources jar.
       -->
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
@@ -366,55 +329,6 @@
         </executions>
       </plugin>
 
-      <!-- Publish to the new Sonatype Central API. -->
-      <plugin>
-        <groupId>org.sonatype.central</groupId>
-        <artifactId>central-publishing-maven-plugin</artifactId>
-        <version>${central.publishing.version}</version>
-        <extensions>true</extensions>
-        <configuration>
-          <publishingServerId>central</publishingServerId>
-          <autoPublish>false</autoPublish>
-        </configuration>
-      </plugin>
-
-      <!--
-        Flatten the POM at install/deploy time so the published artifact 
carries only the metadata Maven Central
-        requires (groupId, artifactId, version, name, description, url, 
license, scm, developers, dependencies)
-        and drops everything inherited from commons-parent that is not 
relevant to a consumer (mailing lists,
-        ciManagement, distribution properties, plugin management, etc.).
-      -->
-      <plugin>
-        <groupId>org.codehaus.mojo</groupId>
-        <artifactId>flatten-maven-plugin</artifactId>
-        <version>${flatten-maven-plugin.version}</version>
-        <configuration>
-          <flattenMode>oss</flattenMode>
-          <pomElements>
-            <!-- Placeholder kept locally only to override commons-parent's 
mailing lists; not consumer-relevant. -->
-            <mailingLists>remove</mailingLists>
-            <!-- Where the artifact is published is not consumer-relevant. -->
-            <distributionManagement>remove</distributionManagement>
-          </pomElements>
-        </configuration>
-        <executions>
-          <execution>
-            <id>flatten</id>
-            <phase>process-resources</phase>
-            <goals>
-              <goal>flatten</goal>
-            </goals>
-          </execution>
-          <execution>
-            <id>flatten-clean</id>
-            <phase>clean</phase>
-            <goals>
-              <goal>clean</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-
     </plugins>
   </build>
 
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
new file mode 100644
index 0000000..2f0a67e
--- /dev/null
+++ b/src/changes/changes.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     Licensed to the Apache Software Foundation (ASF) under one or more
+     contributor license agreements.  See the NOTICE file distributed with
+     this work for additional information regarding copyright ownership.
+     The ASF licenses this file to You under the Apache License, Version 2.0
+     (the "License"); you may not use this file except in compliance with
+     the License.  You may obtain a copy of the License at
+
+          https://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+  -->
+
+<!--
+This file is used by the maven-changes-plugin to generate the release notes.
+To generate the release notes from this file:
+
+mvn changes:announcement-generate -Prelease-notes [-Dchanges.version=nnn]
+
+The <action> type attribute can be add, update, fix, or remove.
+-->
+<document xmlns="http://maven.apache.org/changes/2.0.0";
+          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
+          xsi:schemaLocation="http://maven.apache.org/changes/2.0.0 
https://maven.apache.org/xsd/changes-2.0.0.xsd";>
+  <properties>
+    <title>Apache Commons XML - Changes</title>
+  </properties>
+  <body>
+    <release version="0.1.0" date="YYYY-MM-DD" description="First release.">
+      <action type="add" dev="ppkarwasz">
+        Secure-by-default JAXP factory creation via XmlFactories, with 
implementation-specific hardening recipes for the
+        stock JDK, Android, Apache Xalan, Apache Xerces, Woodstox, and 
Saxon-HE.
+      </action>
+    </release>
+  </body>
+</document>
diff --git a/src/main/java/eu/copernik/xml/factory/DelegatingTemplates.java 
b/src/main/java/eu/copernik/xml/factory/DelegatingTemplates.java
deleted file mode 100644
index 6197d79..0000000
--- a/src/main/java/eu/copernik/xml/factory/DelegatingTemplates.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package eu.copernik.xml.factory;
-
-import java.util.Properties;
-
-import javax.xml.transform.Templates;
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerConfigurationException;
-
-/**
- * {@link Templates} wrapper that forwards every method to a wrapped delegate.
- */
-class DelegatingTemplates implements Templates {
-
-    private final Templates delegate;
-
-    DelegatingTemplates(final Templates delegate) {
-        this.delegate = delegate;
-    }
-
-    @Override
-    public Properties getOutputProperties() {
-        return delegate.getOutputProperties();
-    }
-
-    @Override
-    public Transformer newTransformer() throws 
TransformerConfigurationException {
-        return delegate.newTransformer();
-    }
-}
diff --git a/src/main/java/eu/copernik/xml/factory/AndroidProvider.java 
b/src/main/java/org/apache/commons/xml/AndroidProvider.java
similarity index 90%
rename from src/main/java/eu/copernik/xml/factory/AndroidProvider.java
rename to src/main/java/org/apache/commons/xml/AndroidProvider.java
index 88a336b..34abb5d 100644
--- a/src/main/java/eu/copernik/xml/factory/AndroidProvider.java
+++ b/src/main/java/org/apache/commons/xml/AndroidProvider.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.util.Objects;
 
diff --git 
a/src/main/java/eu/copernik/xml/factory/DelegatingDocumentBuilderFactory.java 
b/src/main/java/org/apache/commons/xml/DelegatingDocumentBuilderFactory.java
similarity index 79%
rename from 
src/main/java/eu/copernik/xml/factory/DelegatingDocumentBuilderFactory.java
rename to 
src/main/java/org/apache/commons/xml/DelegatingDocumentBuilderFactory.java
index ae2a8ff..d641f87 100644
--- 
a/src/main/java/eu/copernik/xml/factory/DelegatingDocumentBuilderFactory.java
+++ b/src/main/java/org/apache/commons/xml/DelegatingDocumentBuilderFactory.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
diff --git a/src/main/java/eu/copernik/xml/factory/DelegatingSAXParser.java 
b/src/main/java/org/apache/commons/xml/DelegatingSAXParser.java
similarity index 69%
rename from src/main/java/eu/copernik/xml/factory/DelegatingSAXParser.java
rename to src/main/java/org/apache/commons/xml/DelegatingSAXParser.java
index e3fa908..26dc125 100644
--- a/src/main/java/eu/copernik/xml/factory/DelegatingSAXParser.java
+++ b/src/main/java/org/apache/commons/xml/DelegatingSAXParser.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.parsers.SAXParser;
 import javax.xml.validation.Schema;
diff --git 
a/src/main/java/eu/copernik/xml/factory/DelegatingSAXParserFactory.java 
b/src/main/java/org/apache/commons/xml/DelegatingSAXParserFactory.java
similarity index 71%
rename from 
src/main/java/eu/copernik/xml/factory/DelegatingSAXParserFactory.java
rename to src/main/java/org/apache/commons/xml/DelegatingSAXParserFactory.java
index b1fe7ee..bb5323f 100644
--- a/src/main/java/eu/copernik/xml/factory/DelegatingSAXParserFactory.java
+++ b/src/main/java/org/apache/commons/xml/DelegatingSAXParserFactory.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.parsers.SAXParser;
diff --git a/src/main/java/eu/copernik/xml/factory/DelegatingSchemaFactory.java 
b/src/main/java/org/apache/commons/xml/DelegatingSchemaFactory.java
similarity index 73%
rename from src/main/java/eu/copernik/xml/factory/DelegatingSchemaFactory.java
rename to src/main/java/org/apache/commons/xml/DelegatingSchemaFactory.java
index 14a18fb..797d8ce 100644
--- a/src/main/java/eu/copernik/xml/factory/DelegatingSchemaFactory.java
+++ b/src/main/java/org/apache/commons/xml/DelegatingSchemaFactory.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.transform.Source;
 import javax.xml.validation.Schema;
diff --git a/src/main/java/org/apache/commons/xml/DelegatingTemplates.java 
b/src/main/java/org/apache/commons/xml/DelegatingTemplates.java
new file mode 100644
index 0000000..f20d5a9
--- /dev/null
+++ b/src/main/java/org/apache/commons/xml/DelegatingTemplates.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.xml;
+
+import java.util.Properties;
+
+import javax.xml.transform.Templates;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+
+/**
+ * {@link Templates} wrapper that forwards every method to a wrapped delegate.
+ */
+class DelegatingTemplates implements Templates {
+
+    private final Templates delegate;
+
+    DelegatingTemplates(final Templates delegate) {
+        this.delegate = delegate;
+    }
+
+    @Override
+    public Properties getOutputProperties() {
+        return delegate.getOutputProperties();
+    }
+
+    @Override
+    public Transformer newTransformer() throws 
TransformerConfigurationException {
+        return delegate.newTransformer();
+    }
+}
diff --git a/src/main/java/eu/copernik/xml/factory/DelegatingTransformer.java 
b/src/main/java/org/apache/commons/xml/DelegatingTransformer.java
similarity index 72%
rename from src/main/java/eu/copernik/xml/factory/DelegatingTransformer.java
rename to src/main/java/org/apache/commons/xml/DelegatingTransformer.java
index d47a03b..189f3b0 100644
--- a/src/main/java/eu/copernik/xml/factory/DelegatingTransformer.java
+++ b/src/main/java/org/apache/commons/xml/DelegatingTransformer.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.util.Properties;
 
diff --git 
a/src/main/java/eu/copernik/xml/factory/DelegatingTransformerFactory.java 
b/src/main/java/org/apache/commons/xml/DelegatingTransformerFactory.java
similarity index 81%
rename from 
src/main/java/eu/copernik/xml/factory/DelegatingTransformerFactory.java
rename to src/main/java/org/apache/commons/xml/DelegatingTransformerFactory.java
index 88d5f44..e3069b4 100644
--- a/src/main/java/eu/copernik/xml/factory/DelegatingTransformerFactory.java
+++ b/src/main/java/org/apache/commons/xml/DelegatingTransformerFactory.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.transform.ErrorListener;
 import javax.xml.transform.Source;
diff --git a/src/main/java/eu/copernik/xml/factory/DelegatingXMLReader.java 
b/src/main/java/org/apache/commons/xml/DelegatingXMLReader.java
similarity index 75%
rename from src/main/java/eu/copernik/xml/factory/DelegatingXMLReader.java
rename to src/main/java/org/apache/commons/xml/DelegatingXMLReader.java
index fe9aed4..9b50614 100644
--- a/src/main/java/eu/copernik/xml/factory/DelegatingXMLReader.java
+++ b/src/main/java/org/apache/commons/xml/DelegatingXMLReader.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.io.IOException;
 
diff --git a/src/main/java/eu/copernik/xml/factory/HardeningException.java 
b/src/main/java/org/apache/commons/xml/HardeningException.java
similarity index 53%
rename from src/main/java/eu/copernik/xml/factory/HardeningException.java
rename to src/main/java/org/apache/commons/xml/HardeningException.java
index 8690016..c549428 100644
--- a/src/main/java/eu/copernik/xml/factory/HardeningException.java
+++ b/src/main/java/org/apache/commons/xml/HardeningException.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 /**
  * Thrown when a factory cannot be hardened.
diff --git 
a/src/main/java/eu/copernik/xml/factory/HardeningSAXParserFactory.java 
b/src/main/java/org/apache/commons/xml/HardeningSAXParserFactory.java
similarity index 56%
rename from src/main/java/eu/copernik/xml/factory/HardeningSAXParserFactory.java
rename to src/main/java/org/apache/commons/xml/HardeningSAXParserFactory.java
index b8dee07..a096c04 100644
--- a/src/main/java/eu/copernik/xml/factory/HardeningSAXParserFactory.java
+++ b/src/main/java/org/apache/commons/xml/HardeningSAXParserFactory.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.util.function.UnaryOperator;
 
diff --git a/src/main/java/eu/copernik/xml/factory/HardeningSchema.java 
b/src/main/java/org/apache/commons/xml/HardeningSchema.java
similarity index 61%
rename from src/main/java/eu/copernik/xml/factory/HardeningSchema.java
rename to src/main/java/org/apache/commons/xml/HardeningSchema.java
index 3064642..3dcc109 100644
--- a/src/main/java/eu/copernik/xml/factory/HardeningSchema.java
+++ b/src/main/java/org/apache/commons/xml/HardeningSchema.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.util.function.UnaryOperator;
 
diff --git a/src/main/java/eu/copernik/xml/factory/HardeningSchemaFactory.java 
b/src/main/java/org/apache/commons/xml/HardeningSchemaFactory.java
similarity index 76%
rename from src/main/java/eu/copernik/xml/factory/HardeningSchemaFactory.java
rename to src/main/java/org/apache/commons/xml/HardeningSchemaFactory.java
index da37d07..ece9494 100644
--- a/src/main/java/eu/copernik/xml/factory/HardeningSchemaFactory.java
+++ b/src/main/java/org/apache/commons/xml/HardeningSchemaFactory.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.util.function.UnaryOperator;
 
diff --git a/src/main/java/eu/copernik/xml/factory/HardeningTemplates.java 
b/src/main/java/org/apache/commons/xml/HardeningTemplates.java
similarity index 66%
rename from src/main/java/eu/copernik/xml/factory/HardeningTemplates.java
rename to src/main/java/org/apache/commons/xml/HardeningTemplates.java
index 5b058a3..f7b947d 100644
--- a/src/main/java/eu/copernik/xml/factory/HardeningTemplates.java
+++ b/src/main/java/org/apache/commons/xml/HardeningTemplates.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.transform.Templates;
 import javax.xml.transform.Transformer;
diff --git a/src/main/java/eu/copernik/xml/factory/HardeningTransformer.java 
b/src/main/java/org/apache/commons/xml/HardeningTransformer.java
similarity index 52%
rename from src/main/java/eu/copernik/xml/factory/HardeningTransformer.java
rename to src/main/java/org/apache/commons/xml/HardeningTransformer.java
index cee653d..7e77f2e 100644
--- a/src/main/java/eu/copernik/xml/factory/HardeningTransformer.java
+++ b/src/main/java/org/apache/commons/xml/HardeningTransformer.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.transform.Result;
 import javax.xml.transform.Source;
diff --git 
a/src/main/java/eu/copernik/xml/factory/HardeningTransformerFactory.java 
b/src/main/java/org/apache/commons/xml/HardeningTransformerFactory.java
similarity index 82%
rename from 
src/main/java/eu/copernik/xml/factory/HardeningTransformerFactory.java
rename to src/main/java/org/apache/commons/xml/HardeningTransformerFactory.java
index 86b0b86..2e54465 100644
--- a/src/main/java/eu/copernik/xml/factory/HardeningTransformerFactory.java
+++ b/src/main/java/org/apache/commons/xml/HardeningTransformerFactory.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.transform.Source;
 import javax.xml.transform.Templates;
diff --git a/src/main/java/eu/copernik/xml/factory/HardeningValidator.java 
b/src/main/java/org/apache/commons/xml/HardeningValidator.java
similarity index 75%
rename from src/main/java/eu/copernik/xml/factory/HardeningValidator.java
rename to src/main/java/org/apache/commons/xml/HardeningValidator.java
index e8400a8..3df9596 100644
--- a/src/main/java/eu/copernik/xml/factory/HardeningValidator.java
+++ b/src/main/java/org/apache/commons/xml/HardeningValidator.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.io.IOException;
 
diff --git a/src/main/java/eu/copernik/xml/factory/JaxpSetters.java 
b/src/main/java/org/apache/commons/xml/JaxpSetters.java
similarity index 84%
rename from src/main/java/eu/copernik/xml/factory/JaxpSetters.java
rename to src/main/java/org/apache/commons/xml/JaxpSetters.java
index f9e4101..55c7f62 100644
--- a/src/main/java/eu/copernik/xml/factory/JaxpSetters.java
+++ b/src/main/java/org/apache/commons/xml/JaxpSetters.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.SAXParser;
diff --git a/src/main/java/eu/copernik/xml/factory/Limits.java 
b/src/main/java/org/apache/commons/xml/Limits.java
similarity index 94%
rename from src/main/java/eu/copernik/xml/factory/Limits.java
rename to src/main/java/org/apache/commons/xml/Limits.java
index a83d1f4..9760b32 100644
--- a/src/main/java/eu/copernik/xml/factory/Limits.java
+++ b/src/main/java/org/apache/commons/xml/Limits.java
@@ -1,11 +1,23 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
-import static eu.copernik.xml.factory.JaxpSetters.setAttribute;
-import static eu.copernik.xml.factory.JaxpSetters.setProperty;
+import static org.apache.commons.xml.JaxpSetters.setAttribute;
+import static org.apache.commons.xml.JaxpSetters.setProperty;
 
 import java.util.Collections;
 import java.util.LinkedHashMap;
diff --git a/src/main/java/eu/copernik/xml/factory/Resolvers.java 
b/src/main/java/org/apache/commons/xml/Resolvers.java
similarity index 87%
rename from src/main/java/eu/copernik/xml/factory/Resolvers.java
rename to src/main/java/org/apache/commons/xml/Resolvers.java
index 85d8ef7..33867df 100644
--- a/src/main/java/eu/copernik/xml/factory/Resolvers.java
+++ b/src/main/java/org/apache/commons/xml/Resolvers.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
diff --git a/src/main/java/eu/copernik/xml/factory/SaxonProvider.java 
b/src/main/java/org/apache/commons/xml/SaxonProvider.java
similarity index 83%
rename from src/main/java/eu/copernik/xml/factory/SaxonProvider.java
rename to src/main/java/org/apache/commons/xml/SaxonProvider.java
index a825d22..2a5d98b 100644
--- a/src/main/java/eu/copernik/xml/factory/SaxonProvider.java
+++ b/src/main/java/org/apache/commons/xml/SaxonProvider.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.transform.TransformerFactory;
 import javax.xml.transform.TransformerFactoryConfigurationError;
diff --git a/src/main/java/eu/copernik/xml/factory/StockJdkProvider.java 
b/src/main/java/org/apache/commons/xml/StockJdkProvider.java
similarity index 89%
rename from src/main/java/eu/copernik/xml/factory/StockJdkProvider.java
rename to src/main/java/org/apache/commons/xml/StockJdkProvider.java
index 05a237d..fa31557 100644
--- a/src/main/java/eu/copernik/xml/factory/StockJdkProvider.java
+++ b/src/main/java/org/apache/commons/xml/StockJdkProvider.java
@@ -1,13 +1,25 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
-import static eu.copernik.xml.factory.JaxpSetters.setAttribute;
-import static eu.copernik.xml.factory.JaxpSetters.setFeature;
-import static eu.copernik.xml.factory.JaxpSetters.setProperty;
+import static org.apache.commons.xml.JaxpSetters.setAttribute;
+import static org.apache.commons.xml.JaxpSetters.setFeature;
+import static org.apache.commons.xml.JaxpSetters.setProperty;
 
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilderFactory;
diff --git a/src/main/java/eu/copernik/xml/factory/WoodstoxProvider.java 
b/src/main/java/org/apache/commons/xml/WoodstoxProvider.java
similarity index 83%
rename from src/main/java/eu/copernik/xml/factory/WoodstoxProvider.java
rename to src/main/java/org/apache/commons/xml/WoodstoxProvider.java
index 7b3206f..c843615 100644
--- a/src/main/java/eu/copernik/xml/factory/WoodstoxProvider.java
+++ b/src/main/java/org/apache/commons/xml/WoodstoxProvider.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLResolver;
diff --git a/src/main/java/eu/copernik/xml/factory/XalanProvider.java 
b/src/main/java/org/apache/commons/xml/XalanProvider.java
similarity index 78%
rename from src/main/java/eu/copernik/xml/factory/XalanProvider.java
rename to src/main/java/org/apache/commons/xml/XalanProvider.java
index 403a5e6..21a3f7c 100644
--- a/src/main/java/eu/copernik/xml/factory/XalanProvider.java
+++ b/src/main/java/org/apache/commons/xml/XalanProvider.java
@@ -1,11 +1,23 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
-import static eu.copernik.xml.factory.JaxpSetters.setFeature;
+import static org.apache.commons.xml.JaxpSetters.setFeature;
 
 import javax.xml.XMLConstants;
 import javax.xml.transform.TransformerFactory;
diff --git a/src/main/java/eu/copernik/xml/factory/XercesProvider.java 
b/src/main/java/org/apache/commons/xml/XercesProvider.java
similarity index 91%
rename from src/main/java/eu/copernik/xml/factory/XercesProvider.java
rename to src/main/java/org/apache/commons/xml/XercesProvider.java
index 78c1620..7b89be1 100644
--- a/src/main/java/eu/copernik/xml/factory/XercesProvider.java
+++ b/src/main/java/org/apache/commons/xml/XercesProvider.java
@@ -1,11 +1,23 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
-import static eu.copernik.xml.factory.JaxpSetters.setFeature;
+import static org.apache.commons.xml.JaxpSetters.setFeature;
 
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilder;
diff --git a/src/main/java/eu/copernik/xml/factory/XmlFactories.java 
b/src/main/java/org/apache/commons/xml/XmlFactories.java
similarity index 93%
rename from src/main/java/eu/copernik/xml/factory/XmlFactories.java
rename to src/main/java/org/apache/commons/xml/XmlFactories.java
index 74b18ea..b97c59f 100644
--- a/src/main/java/eu/copernik/xml/factory/XmlFactories.java
+++ b/src/main/java/org/apache/commons/xml/XmlFactories.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import javax.xml.XMLConstants;
 import javax.xml.parsers.DocumentBuilderFactory;
@@ -173,7 +185,7 @@ public static XMLReader harden(final XMLReader reader) {
             case 
"com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser":
                 return StockJdkProvider.configure(reader);
             case "org.apache.harmony.xml.ExpatReader":
-            case "eu.copernik.xml.factory.AndroidProvider$GuardedXMLReader":
+            case "org.apache.commons.xml.AndroidProvider$GuardedXMLReader":
                 return AndroidProvider.configure(reader);
             case "org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser":
                 return XercesProvider.configure(reader);
diff --git a/src/site/markdown/index.md b/src/site/markdown/index.md
index 749e520..16a4518 100644
--- a/src/site/markdown/index.md
+++ b/src/site/markdown/index.md
@@ -1,11 +1,27 @@
 <!--
-  ~ SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-  ~ SPDX-License-Identifier: Apache-2.0
-  -->
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
 
-# Copernik XML Factory
+     https://www.apache.org/licenses/LICENSE-2.0
 
-Copernik XML Factory provides secure-by-default JAXP factory creation,
+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.
+-->
+
+# Apache Commons XML
+
+**Sandbox component.** Apache Commons XML is part of the
+[Apache Commons Sandbox](https://commons.apache.org/sandbox/). It is a work in 
progress, has not been formally
+released, and its API, coordinates, and behaviour may change without notice. 
Do not rely on it in production.
+
+Apache Commons XML provides secure-by-default JAXP factory creation,
 abstracting over implementation-specific XXE hardening differences between the
 stock JDK and external JAXP implementations.
 
@@ -35,8 +51,8 @@ Add the library to your build:
 
 ```xml
 <dependency>
-  <groupId>eu.copernik</groupId>
-  <artifactId>copernik-xml-factory</artifactId>
+  <groupId>org.apache.commons</groupId>
+  <artifactId>commons-xml</artifactId>
   <version>${commons.release.version}</version>
 </dependency>
 ```
@@ -56,7 +72,7 @@ requires a code change to this library.
 
 ```java
 import org.w3c.dom.Document;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 Document doc = 
XmlFactories.newDocumentBuilderFactory().newDocumentBuilder().parse(inputStream);
 ```
@@ -64,7 +80,7 @@ Document doc = 
XmlFactories.newDocumentBuilderFactory().newDocumentBuilder().par
 **SAX parsing** via `SAXParserFactory`:
 
 ```java
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 XmlFactories.newSAXParserFactory().newSAXParser().parse(inputStream, 
myDefaultHandler);
 ```
@@ -73,7 +89,7 @@ 
XmlFactories.newSAXParserFactory().newSAXParser().parse(inputStream, myDefaultHa
 
 ```java
 import javax.xml.stream.XMLStreamReader;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 XMLStreamReader reader = 
XmlFactories.newXMLInputFactory().createXMLStreamReader(inputStream);
 ```
@@ -83,7 +99,7 @@ XMLStreamReader reader = 
XmlFactories.newXMLInputFactory().createXMLStreamReader
 ```java
 import javax.xml.transform.stream.StreamSource;
 import javax.xml.transform.stream.StreamResult;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 XmlFactories.newTransformerFactory()
         .newTransformer(new StreamSource(stylesheet))
@@ -95,7 +111,7 @@ XmlFactories.newTransformerFactory()
 ```java
 import javax.xml.xpath.XPathConstants;
 import org.w3c.dom.NodeList;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 NodeList hits = (NodeList) XmlFactories.newXPathFactory()
         .newXPath()
@@ -106,7 +122,7 @@ NodeList hits = (NodeList) XmlFactories.newXPathFactory()
 
 ```java
 import javax.xml.transform.stream.StreamSource;
-import eu.copernik.xml.factory.XmlFactories;
+import org.apache.commons.xml.XmlFactories;
 
 XmlFactories.newSchemaFactory()
         .newSchema(new StreamSource(xsdStream))
diff --git a/src/site/resources/profile.japicmp 
b/src/site/resources/profile.japicmp
index 88dc53f..a33244d 100644
--- a/src/site/resources/profile.japicmp
+++ b/src/site/resources/profile.japicmp
@@ -1,2 +1,14 @@
-SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
-SPDX-License-Identifier: Apache-2.0
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements.  See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License.  You may obtain a copy of the License at
+#
+#      https://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
diff --git a/src/site/site.xml b/src/site/site.xml
new file mode 100644
index 0000000..0e5d775
--- /dev/null
+++ b/src/site/site.xml
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+     Licensed to the Apache Software Foundation (ASF) under one or more
+     contributor license agreements.  See the NOTICE file distributed with
+     this work for additional information regarding copyright ownership.
+     The ASF licenses this file to You under the Apache License, Version 2.0
+     (the "License"); you may not use this file except in compliance with
+     the License.  You may obtain a copy of the License at
+
+          https://www.apache.org/licenses/LICENSE-2.0
+
+     Unless required by applicable law or agreed to in writing, software
+     distributed under the License is distributed on an "AS IS" BASIS,
+     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     See the License for the specific language governing permissions and
+     limitations under the License.
+  -->
+<project name="Apache Commons XML">
+  <body>
+    <menu name="Apache Commons XML">
+      <item name="Overview"        href="/index.html"/>
+      <item name="Javadoc"         href="/apidocs/index.html"/>
+      <item name="Security"        href="/security.html"/>
+      <item name="Issue Tracking"  href="/issue-tracking.html"/>
+      <item name="Mailing Lists"   href="/mail-lists.html"/>
+    </menu>
+    <menu ref="reports"/>
+  </body>
+</project>
diff --git a/src/test/java/eu/copernik/xml/factory/SchemaImportTest.java 
b/src/test/java/eu/copernik/xml/factory/SchemaImportTest.java
deleted file mode 100644
index f11299a..0000000
--- a/src/test/java/eu/copernik/xml/factory/SchemaImportTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package eu.copernik.xml.factory;
-
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks whether {@code xs:import namespace="..." 
schemaLocation="included.xsd"} of a sibling schema in a different target 
namespace is resolved at compile
- * time. The wrapper references an element defined only in the imported 
schema, so compilation cannot succeed unless the schemaLocation is fetched.
- */
-@Tag("schema")
-class SchemaImportTest {
-
-    private static final String RESOURCE = "with-import.xsd";
-
-    @Test
-    void hardenedSchemaBlocks() {
-        
AttackTestSupport.assertSchemaBlocks(AttackTestSupport.resourceSource(RESOURCE));
-    }
-
-    @Test
-    void unconfiguredSchemaCompiles() {
-        
AttackTestSupport.assertPermissiveSchemaCompiles(AttackTestSupport.resourceSource(RESOURCE));
-    }
-}
diff --git a/src/test/java/eu/copernik/xml/factory/SchemaIncludeTest.java 
b/src/test/java/eu/copernik/xml/factory/SchemaIncludeTest.java
deleted file mode 100644
index de66232..0000000
--- a/src/test/java/eu/copernik/xml/factory/SchemaIncludeTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package eu.copernik.xml.factory;
-
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks whether {@code xs:include schemaLocation="included.xsd"} of a 
sibling schema sharing the wrapper's target namespace is resolved at compile 
time. The
- * wrapper references an element defined only in the included schema, so 
compilation cannot succeed unless the schemaLocation is fetched.
- */
-@Tag("schema")
-class SchemaIncludeTest {
-
-    private static final String RESOURCE = "with-include.xsd";
-
-    @Test
-    void hardenedSchemaBlocks() {
-        
AttackTestSupport.assertSchemaBlocks(AttackTestSupport.resourceSource(RESOURCE));
-    }
-
-    @Test
-    void unconfiguredSchemaCompiles() {
-        
AttackTestSupport.assertPermissiveSchemaCompiles(AttackTestSupport.resourceSource(RESOURCE));
-    }
-}
diff --git a/src/test/java/eu/copernik/xml/factory/SchemaRedefineTest.java 
b/src/test/java/eu/copernik/xml/factory/SchemaRedefineTest.java
deleted file mode 100644
index 9b5d201..0000000
--- a/src/test/java/eu/copernik/xml/factory/SchemaRedefineTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package eu.copernik.xml.factory;
-
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks whether {@code xs:redefine schemaLocation="included.xsd"} that 
extends a complex type from a sibling schema is resolved at compile time. The 
wrapper
- * cannot compile unless the redefined type is fetched from the sibling schema.
- */
-@Tag("schema")
-class SchemaRedefineTest {
-
-    private static final String RESOURCE = "with-redefine.xsd";
-
-    @Test
-    void hardenedSchemaBlocks() {
-        
AttackTestSupport.assertSchemaBlocks(AttackTestSupport.resourceSource(RESOURCE));
-    }
-
-    @Test
-    void unconfiguredSchemaCompiles() {
-        
AttackTestSupport.assertPermissiveSchemaCompiles(AttackTestSupport.resourceSource(RESOURCE));
-    }
-}
diff --git a/src/test/java/eu/copernik/xml/factory/TemplatesImportTest.java 
b/src/test/java/eu/copernik/xml/factory/TemplatesImportTest.java
deleted file mode 100644
index e97103f..0000000
--- a/src/test/java/eu/copernik/xml/factory/TemplatesImportTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package eu.copernik.xml.factory;
-
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks whether {@code xsl:import} of a sibling stylesheet is resolved at 
compile time. The wrapper imports a sibling that, if fetched, contributes a
- * template emitting the leaked marker into the transform output.
- */
-@Tag("trax")
-class TemplatesImportTest {
-
-    @Test
-    void hardenedTemplatesBlocks() {
-        
AttackTestSupport.assertTemplatesBlocks(AttackTestSupport.resourceSource("with-import.xsl"));
-    }
-}
diff --git a/src/test/java/eu/copernik/xml/factory/TemplatesIncludeTest.java 
b/src/test/java/eu/copernik/xml/factory/TemplatesIncludeTest.java
deleted file mode 100644
index cccf3ec..0000000
--- a/src/test/java/eu/copernik/xml/factory/TemplatesIncludeTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package eu.copernik.xml.factory;
-
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks whether {@code xsl:include} of a sibling stylesheet is resolved at 
compile time. The wrapper includes a sibling that, if fetched, contributes a
- * template emitting the leaked marker into the transform output.
- */
-@Tag("trax")
-class TemplatesIncludeTest {
-
-    @Test
-    void hardenedTemplatesBlocks() {
-        
AttackTestSupport.assertTemplatesBlocks(AttackTestSupport.resourceSource("with-include.xsl"));
-    }
-}
diff --git a/src/test/java/eu/copernik/xml/factory/TransformerDocumentTest.java 
b/src/test/java/eu/copernik/xml/factory/TransformerDocumentTest.java
deleted file mode 100644
index 45fad0f..0000000
--- a/src/test/java/eu/copernik/xml/factory/TransformerDocumentTest.java
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
- */
-
-package eu.copernik.xml.factory;
-
-import org.junit.jupiter.api.Tag;
-import org.junit.jupiter.api.Test;
-
-/**
- * Checks whether the XSLT {@code document()} function is resolved at 
transform time. Compilation succeeds (the function call is just XPath); the 
leak vector
- * fires only when {@code Transformer.transform} is called and the function 
evaluates its URI argument.
- */
-@Tag("trax")
-class TransformerDocumentTest {
-
-    @Test
-    void hardenedTransformerBlocks() {
-        
AttackTestSupport.assertTemplatesBlocks(AttackTestSupport.resourceSource("with-document.xsl"));
-    }
-}
diff --git a/src/test/java/eu/copernik/xml/factory/AttackTestSupport.java 
b/src/test/java/org/apache/commons/xml/AttackTestSupport.java
similarity index 99%
rename from src/test/java/eu/copernik/xml/factory/AttackTestSupport.java
rename to src/test/java/org/apache/commons/xml/AttackTestSupport.java
index 37ce3cb..b02dc06 100644
--- a/src/test/java/eu/copernik/xml/factory/AttackTestSupport.java
+++ b/src/test/java/org/apache/commons/xml/AttackTestSupport.java
@@ -2,7 +2,7 @@
  * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz
  * SPDX-License-Identifier: Apache-2.0
  */
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertFalse;
diff --git a/src/test/java/eu/copernik/xml/factory/BillionLaughsTest.java 
b/src/test/java/org/apache/commons/xml/BillionLaughsTest.java
similarity index 92%
rename from src/test/java/eu/copernik/xml/factory/BillionLaughsTest.java
rename to src/test/java/org/apache/commons/xml/BillionLaughsTest.java
index 51e8745..eb18e72 100644
--- a/src/test/java/eu/copernik/xml/factory/BillionLaughsTest.java
+++ b/src/test/java/org/apache/commons/xml/BillionLaughsTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.Tag;
diff --git a/src/test/java/eu/copernik/xml/factory/DoctypeOnlyTest.java 
b/src/test/java/org/apache/commons/xml/DoctypeOnlyTest.java
similarity index 77%
rename from src/test/java/eu/copernik/xml/factory/DoctypeOnlyTest.java
rename to src/test/java/org/apache/commons/xml/DoctypeOnlyTest.java
index fd93429..1c78212 100644
--- a/src/test/java/eu/copernik/xml/factory/DoctypeOnlyTest.java
+++ b/src/test/java/org/apache/commons/xml/DoctypeOnlyTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.Tag;
diff --git a/src/test/java/eu/copernik/xml/factory/ExternalDtdTest.java 
b/src/test/java/org/apache/commons/xml/ExternalDtdTest.java
similarity index 84%
rename from src/test/java/eu/copernik/xml/factory/ExternalDtdTest.java
rename to src/test/java/org/apache/commons/xml/ExternalDtdTest.java
index e334d29..da8184c 100644
--- a/src/test/java/eu/copernik/xml/factory/ExternalDtdTest.java
+++ b/src/test/java/org/apache/commons/xml/ExternalDtdTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.Tag;
diff --git 
a/src/test/java/eu/copernik/xml/factory/ExternalGeneralEntityTest.java 
b/src/test/java/org/apache/commons/xml/ExternalGeneralEntityTest.java
similarity index 84%
rename from src/test/java/eu/copernik/xml/factory/ExternalGeneralEntityTest.java
rename to src/test/java/org/apache/commons/xml/ExternalGeneralEntityTest.java
index e8a4aee..6bcb89e 100644
--- a/src/test/java/eu/copernik/xml/factory/ExternalGeneralEntityTest.java
+++ b/src/test/java/org/apache/commons/xml/ExternalGeneralEntityTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import org.junit.jupiter.api.Assumptions;
 import org.junit.jupiter.api.Tag;
diff --git 
a/src/test/java/eu/copernik/xml/factory/ExternalParameterEntityTest.java 
b/src/test/java/org/apache/commons/xml/ExternalParameterEntityTest.java
similarity index 91%
rename from 
src/test/java/eu/copernik/xml/factory/ExternalParameterEntityTest.java
rename to src/test/java/org/apache/commons/xml/ExternalParameterEntityTest.java
index 45cfa78..4b9a0de 100644
--- a/src/test/java/eu/copernik/xml/factory/ExternalParameterEntityTest.java
+++ b/src/test/java/org/apache/commons/xml/ExternalParameterEntityTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import java.io.StringReader;
 import java.util.concurrent.atomic.AtomicBoolean;
diff --git a/src/test/java/eu/copernik/xml/factory/NoDoctypeTest.java 
b/src/test/java/org/apache/commons/xml/NoDoctypeTest.java
similarity index 71%
rename from src/test/java/eu/copernik/xml/factory/NoDoctypeTest.java
rename to src/test/java/org/apache/commons/xml/NoDoctypeTest.java
index 9c0aa27..a6536e0 100644
--- a/src/test/java/eu/copernik/xml/factory/NoDoctypeTest.java
+++ b/src/test/java/org/apache/commons/xml/NoDoctypeTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import org.junit.jupiter.api.Tag;
 import org.junit.jupiter.api.Test;
diff --git 
a/src/test/java/eu/copernik/xml/factory/SaxonXPathExternalCallsTest.java 
b/src/test/java/org/apache/commons/xml/SaxonXPathExternalCallsTest.java
similarity index 86%
rename from 
src/test/java/eu/copernik/xml/factory/SaxonXPathExternalCallsTest.java
rename to src/test/java/org/apache/commons/xml/SaxonXPathExternalCallsTest.java
index d76e475..aa6feac 100644
--- a/src/test/java/eu/copernik/xml/factory/SaxonXPathExternalCallsTest.java
+++ b/src/test/java/org/apache/commons/xml/SaxonXPathExternalCallsTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/src/test/java/org/apache/commons/xml/SchemaImportTest.java 
b/src/test/java/org/apache/commons/xml/SchemaImportTest.java
new file mode 100644
index 0000000..a75a739
--- /dev/null
+++ b/src/test/java/org/apache/commons/xml/SchemaImportTest.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.xml;
+
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks whether {@code xs:import namespace="..." 
schemaLocation="included.xsd"} of a sibling schema in a different target 
namespace is resolved at compile
+ * time. The wrapper references an element defined only in the imported 
schema, so compilation cannot succeed unless the schemaLocation is fetched.
+ */
+@Tag("schema")
+class SchemaImportTest {
+
+    private static final String RESOURCE = "with-import.xsd";
+
+    @Test
+    void hardenedSchemaBlocks() {
+        
AttackTestSupport.assertSchemaBlocks(AttackTestSupport.resourceSource(RESOURCE));
+    }
+
+    @Test
+    void unconfiguredSchemaCompiles() {
+        
AttackTestSupport.assertPermissiveSchemaCompiles(AttackTestSupport.resourceSource(RESOURCE));
+    }
+}
diff --git a/src/test/java/org/apache/commons/xml/SchemaIncludeTest.java 
b/src/test/java/org/apache/commons/xml/SchemaIncludeTest.java
new file mode 100644
index 0000000..2bc358f
--- /dev/null
+++ b/src/test/java/org/apache/commons/xml/SchemaIncludeTest.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.xml;
+
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks whether {@code xs:include schemaLocation="included.xsd"} of a 
sibling schema sharing the wrapper's target namespace is resolved at compile 
time. The
+ * wrapper references an element defined only in the included schema, so 
compilation cannot succeed unless the schemaLocation is fetched.
+ */
+@Tag("schema")
+class SchemaIncludeTest {
+
+    private static final String RESOURCE = "with-include.xsd";
+
+    @Test
+    void hardenedSchemaBlocks() {
+        
AttackTestSupport.assertSchemaBlocks(AttackTestSupport.resourceSource(RESOURCE));
+    }
+
+    @Test
+    void unconfiguredSchemaCompiles() {
+        
AttackTestSupport.assertPermissiveSchemaCompiles(AttackTestSupport.resourceSource(RESOURCE));
+    }
+}
diff --git a/src/test/java/org/apache/commons/xml/SchemaRedefineTest.java 
b/src/test/java/org/apache/commons/xml/SchemaRedefineTest.java
new file mode 100644
index 0000000..f76858e
--- /dev/null
+++ b/src/test/java/org/apache/commons/xml/SchemaRedefineTest.java
@@ -0,0 +1,41 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.xml;
+
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks whether {@code xs:redefine schemaLocation="included.xsd"} that 
extends a complex type from a sibling schema is resolved at compile time. The 
wrapper
+ * cannot compile unless the redefined type is fetched from the sibling schema.
+ */
+@Tag("schema")
+class SchemaRedefineTest {
+
+    private static final String RESOURCE = "with-redefine.xsd";
+
+    @Test
+    void hardenedSchemaBlocks() {
+        
AttackTestSupport.assertSchemaBlocks(AttackTestSupport.resourceSource(RESOURCE));
+    }
+
+    @Test
+    void unconfiguredSchemaCompiles() {
+        
AttackTestSupport.assertPermissiveSchemaCompiles(AttackTestSupport.resourceSource(RESOURCE));
+    }
+}
diff --git a/src/test/java/org/apache/commons/xml/TemplatesImportTest.java 
b/src/test/java/org/apache/commons/xml/TemplatesImportTest.java
new file mode 100644
index 0000000..28d5395
--- /dev/null
+++ b/src/test/java/org/apache/commons/xml/TemplatesImportTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.xml;
+
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks whether {@code xsl:import} of a sibling stylesheet is resolved at 
compile time. The wrapper imports a sibling that, if fetched, contributes a
+ * template emitting the leaked marker into the transform output.
+ */
+@Tag("trax")
+class TemplatesImportTest {
+
+    @Test
+    void hardenedTemplatesBlocks() {
+        
AttackTestSupport.assertTemplatesBlocks(AttackTestSupport.resourceSource("with-import.xsl"));
+    }
+}
diff --git a/src/test/java/org/apache/commons/xml/TemplatesIncludeTest.java 
b/src/test/java/org/apache/commons/xml/TemplatesIncludeTest.java
new file mode 100644
index 0000000..425110c
--- /dev/null
+++ b/src/test/java/org/apache/commons/xml/TemplatesIncludeTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.xml;
+
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks whether {@code xsl:include} of a sibling stylesheet is resolved at 
compile time. The wrapper includes a sibling that, if fetched, contributes a
+ * template emitting the leaked marker into the transform output.
+ */
+@Tag("trax")
+class TemplatesIncludeTest {
+
+    @Test
+    void hardenedTemplatesBlocks() {
+        
AttackTestSupport.assertTemplatesBlocks(AttackTestSupport.resourceSource("with-include.xsl"));
+    }
+}
diff --git a/src/test/java/org/apache/commons/xml/TransformerDocumentTest.java 
b/src/test/java/org/apache/commons/xml/TransformerDocumentTest.java
new file mode 100644
index 0000000..549f789
--- /dev/null
+++ b/src/test/java/org/apache/commons/xml/TransformerDocumentTest.java
@@ -0,0 +1,34 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.xml;
+
+import org.junit.jupiter.api.Tag;
+import org.junit.jupiter.api.Test;
+
+/**
+ * Checks whether the XSLT {@code document()} function is resolved at 
transform time. Compilation succeeds (the function call is just XPath); the 
leak vector
+ * fires only when {@code Transformer.transform} is called and the function 
evaluates its URI argument.
+ */
+@Tag("trax")
+class TransformerDocumentTest {
+
+    @Test
+    void hardenedTransformerBlocks() {
+        
AttackTestSupport.assertTemplatesBlocks(AttackTestSupport.resourceSource("with-document.xsl"));
+    }
+}
diff --git 
a/src/test/java/eu/copernik/xml/factory/UnsupportedXmlImplementationTest.java 
b/src/test/java/org/apache/commons/xml/UnsupportedXmlImplementationTest.java
similarity index 68%
rename from 
src/test/java/eu/copernik/xml/factory/UnsupportedXmlImplementationTest.java
rename to 
src/test/java/org/apache/commons/xml/UnsupportedXmlImplementationTest.java
index 93cb2a4..c0f304a 100644
--- 
a/src/test/java/eu/copernik/xml/factory/UnsupportedXmlImplementationTest.java
+++ b/src/test/java/org/apache/commons/xml/UnsupportedXmlImplementationTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
diff --git a/src/test/java/eu/copernik/xml/factory/XmlFactoriesTest.java 
b/src/test/java/org/apache/commons/xml/XmlFactoriesTest.java
similarity index 82%
rename from src/test/java/eu/copernik/xml/factory/XmlFactoriesTest.java
rename to src/test/java/org/apache/commons/xml/XmlFactoriesTest.java
index b2685cd..8665e1c 100644
--- a/src/test/java/eu/copernik/xml/factory/XmlFactoriesTest.java
+++ b/src/test/java/org/apache/commons/xml/XmlFactoriesTest.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
diff --git a/src/test/java11/eu/copernik/xml/factory/DescriptorIT.java 
b/src/test/java11/org/apache/commons/xml/DescriptorIT.java
similarity index 88%
rename from src/test/java11/eu/copernik/xml/factory/DescriptorIT.java
rename to src/test/java11/org/apache/commons/xml/DescriptorIT.java
index e242c18..f275018 100644
--- a/src/test/java11/eu/copernik/xml/factory/DescriptorIT.java
+++ b/src/test/java11/org/apache/commons/xml/DescriptorIT.java
@@ -1,9 +1,21 @@
 /*
- * SPDX-FileCopyrightText: 2026 Piotr P. Karwasz <[email protected]>
- * SPDX-License-Identifier: Apache-2.0
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
  */
 
-package eu.copernik.xml.factory;
+package org.apache.commons.xml;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;

Reply via email to