diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..ae1669d
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,64 @@
+# Declare text files with unix file ending
+*.any text eol=lf
+*.cfg text eol=lf
+*.conf text eol=lf
+*.config text eol=lf
+*.css text eol=lf
+*.dtd text eol=lf
+*.esp text eol=lf
+*.ecma text eol=lf
+*.farm text eol=lf
+*.gdsl text eol=lf
+*.groovy text eol=lf
+*.hbrs text eol=lf
+*.hbs text eol=lf
+*.htm text eol=lf
+*.html text eol=lf
+*.java text eol=lf
+*.jpage text eol=lf
+*.js text eol=lf
+*.json text eol=lf
+*.jsp text eol=lf
+*.md text eol=lf
+*.mustache text eol=lf
+*.tld text eol=lf
+*.launch text eol=lf
+*.log text eol=lf
+*.php text eol=lf
+*.pl text eol=lf
+*.project text eol=lf
+*.properties text eol=lf
+*.props text eol=lf
+*.py text eol=lf
+*.rules text eol=lf
+*.sass text eol=lf
+*.scss text eol=lf
+*.sh text eol=lf
+*.shtm text eol=lf
+*.shtml text eol=lf
+*.sql text eol=lf
+*.svg text eol=lf
+*.tf text eol=lf
+*.ts text eol=lf
+*.txt text eol=lf
+*.vhost text eol=lf
+*.vm text eol=lf
+*.xml text eol=lf
+*.xsd text eol=lf
+*.xsl text eol=lf
+*.xslt text eol=lf
+*.yml text eol=lf
+*.yaml text eol=lf
+
+
+# Declare windows-specific text files with windows file ending
+*.asp text eol=crlf
+*.asax text eol=crlf
+*.asa text eol=crlf
+*.aspx text eol=crlf
+*.bat text eol=crlf
+*.cmd text eol=crlf
+*.cs text eol=crlf
+*.csproj text eol=crlf
+*.reg text eol=crlf
+*.sln text eol=crlf
diff --git a/.github/workflows/maven-build.yml b/.github/workflows/maven-build.yml
new file mode 100644
index 0000000..eeae3b7
--- /dev/null
+++ b/.github/workflows/maven-build.yml
@@ -0,0 +1,46 @@
+# Build validation
+
+name: Build
+
+on:
+  push:
+    branches-ignore:
+      - master
+      - experimental/**
+  pull_request:
+    types: [opened, synchronize, reopened]
+    branches-ignore:
+      - master
+      - experimental/**
+  workflow_dispatch:
+
+jobs:
+  build:
+
+    runs-on: ${{ matrix.os }}
+    strategy:
+      matrix:
+        java: [8, 11, 17]
+        os: [ubuntu-latest]
+        distribution: [temurin]
+        include:
+          - java: 11
+            os: windows-latest
+            distribution: temurin
+          - java: 11
+            os: macos-latest
+            distribution: temurin
+
+    steps:
+      - name: Maven Build with SonarCloud
+        uses: wcm-io-devops/github-action-maven-build-sonar@v1
+        with:
+          os: ${{ matrix.os }}
+          java-version: ${{ matrix.java }}
+          maven-executable: ./mvnw
+          sonar-run-on-os: ubuntu-latest
+          sonar-run-on-java-version: 11
+          sonar-token: ${{ secrets.SONAR_TOKEN }}
+          github-token: ${{ secrets.GITHUB_TOKEN }}
+          # Output error details when maven invoker IT fails
+          maven-additional-args: -D"invoker.streamLogsOnFailures=true"
diff --git a/.github/workflows/maven-deploy.yml b/.github/workflows/maven-deploy.yml
new file mode 100644
index 0000000..96d6b65
--- /dev/null
+++ b/.github/workflows/maven-deploy.yml
@@ -0,0 +1,43 @@
+# Deploy snapshots to Sonatpe OSS repository and deploy site to GitHub Pages
+
+name: Deploy
+
+on:
+  push:
+    branches:
+      - develop
+  workflow_dispatch:
+
+jobs:
+  build:
+
+    runs-on: ubuntu-latest
+
+    steps:
+      - name: Checkout code
+        uses: actions/checkout@v2
+
+      - name: Configure GIT
+        run: |
+          git config --global user.email "${{ secrets.GH_SITE_DEPLOY_EMAIL }}"
+          git config --global user.name "${{ secrets.GH_SITE_DEPLOY_NAME }}"
+
+      - name: Setup JDK
+        uses: actions/setup-java@v2
+        with:
+          distribution: temurin
+          java-version: 8
+          cache: 'maven'
+
+      - name: Build, verify, deploy, generate site
+        env:
+          SONATYPE_USERNAME: ${{ secrets.SONATYPE_USERNAME }}
+          SONATYPE_PASSWORD: ${{ secrets.SONATYPE_PASSWORD }}
+        run: ./mvnw -s ./.maven-settings.xml -Pcontinuous-integration -B -U clean deploy site
+
+      - name: Stage and deploy site
+        run: >
+          ./mvnw -s ./.maven-settings.xml -Pcontinuous-integration -B site:stage scm-publish:publish-scm
+          -Dscmpublish.checkinComment="Maven site: ${{ github.repository }}"
+          -Dusername=${{ secrets.GH_SITE_DEPLOY_USERNAME }}
+          -Dpassword=${{ secrets.GH_SITE_DEPLOY_PAT }}
diff --git a/.github/workflows/release-from-tag.yml b/.github/workflows/release-from-tag.yml
new file mode 100644
index 0000000..10fcc49
--- /dev/null
+++ b/.github/workflows/release-from-tag.yml
@@ -0,0 +1,19 @@
+name: Release from Tag
+
+on:
+  push:
+    tags:
+      - '*'
+  workflow_dispatch:
+
+jobs:
+  build:
+    runs-on: ubuntu-latest
+    permissions:
+      contents: write
+    steps:
+    - uses: actions/checkout@v2
+    - uses: ncipollo/release-action@v1
+      with:
+        body: 'Changes: https://wcm.io/tooling/maven/plugins/i18n-maven-plugin/changes-report.html'
+        token: ${{ secrets.GITHUB_TOKEN }}
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cb0de5f
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,34 @@
+target/
+pom.xml.tag
+pom.xml.releaseBackup
+pom.xml.versionsBackup
+pom.xml.next
+release.properties
+maven-eclipse.xml
+infinitest.filters
+
+node_modules/
+npm-debug.log
+
+.nodejs
+.project
+.classpath
+.settings
+.externalToolBuilders
+.pmd
+.eclipse-pmd
+.checkstyle
+.idea
+.vagrant
+*.iml
+.DS_Store
+*.retry
+.rubygems
+.sass-cache
+.rubygems-gem-maven-plugin
+*.sublime-*
+*nbactions*.xml
+.temp/
+.vlt
+.vlt-sync*
+.brackets.json
diff --git a/.maven-settings.xml b/.maven-settings.xml
new file mode 100644
index 0000000..fb12e79
--- /dev/null
+++ b/.maven-settings.xml
@@ -0,0 +1,132 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  wcm.io
+  %%
+  Copyright (C) 2014 wcm.io
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
+    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
+
+  <profiles>
+    <profile>
+      <id>default</id>
+
+      <repositories>
+
+        <repository>
+          <id>central</id>
+          <url>https://repo1.maven.org/maven2/</url>
+          <layout>default</layout>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </repository>
+
+        <repository>
+          <id>oss-snapshots</id>
+          <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+          <layout>default</layout>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+            <updatePolicy>always</updatePolicy>
+          </snapshots>
+        </repository>
+
+        <repository>
+          <id>apache-snapshots</id>
+          <url>https://repository.apache.org/snapshots</url>
+          <layout>default</layout>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+            <updatePolicy>always</updatePolicy>
+          </snapshots>
+        </repository>
+
+      </repositories>
+
+      <pluginRepositories>
+
+        <pluginRepository>
+          <id>central</id>
+          <url>https://repo1.maven.org/maven2/</url>
+          <layout>default</layout>
+          <releases>
+            <enabled>true</enabled>
+            <updatePolicy>never</updatePolicy>
+          </releases>
+          <snapshots>
+            <enabled>false</enabled>
+          </snapshots>
+        </pluginRepository>
+
+        <pluginRepository>
+          <id>oss-snapshots</id>
+          <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+          <layout>default</layout>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+            <updatePolicy>always</updatePolicy>
+          </snapshots>
+        </pluginRepository>
+
+        <pluginRepository>
+          <id>apache-snapshots</id>
+          <url>https://repository.apache.org/snapshots</url>
+          <layout>default</layout>
+          <releases>
+            <enabled>false</enabled>
+          </releases>
+          <snapshots>
+            <enabled>true</enabled>
+            <updatePolicy>always</updatePolicy>
+          </snapshots>
+        </pluginRepository>
+
+      </pluginRepositories>
+
+    </profile>
+
+  </profiles>
+
+  <activeProfiles>
+    <activeProfile>default</activeProfile>
+  </activeProfiles>
+
+  <servers>
+    <server>
+      <id>ossrh</id>
+      <username>${env.SONATYPE_USERNAME}</username>
+      <password>${env.SONATYPE_PASSWORD}</password>
+    </server>
+  </servers>
+
+</settings>
diff --git a/.mvn/wrapper/maven-wrapper.jar b/.mvn/wrapper/maven-wrapper.jar
new file mode 100644
index 0000000..c1dd12f
Binary files /dev/null and b/.mvn/wrapper/maven-wrapper.jar differ
diff --git a/.mvn/wrapper/maven-wrapper.properties b/.mvn/wrapper/maven-wrapper.properties
new file mode 100644
index 0000000..8c79a83
--- /dev/null
+++ b/.mvn/wrapper/maven-wrapper.properties
@@ -0,0 +1,18 @@
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+# 
+#   http://www.apache.org/licenses/LICENSE-2.0
+# 
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.8.4/apache-maven-3.8.4-bin.zip
+wrapperUrl=https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..5c304d1
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..46cd3f7
--- /dev/null
+++ b/README.md
@@ -0,0 +1,26 @@
+<img src="https://wcm.io/images/favicon-16@2x.png"/> i18n-maven-plugin
+======
+[![Build](https://github.com/wcm-io/io.wcm.maven.plugins.i18n-maven-plugin/workflows/Build/badge.svg?branch=develop)](https://github.com/wcm-io/io.wcm.maven.plugins.i18n-maven-plugin/actions?query=workflow%3ABuild+branch%3Adevelop)
+[![Maven Central](https://maven-badges.herokuapp.com/maven-central/io.wcm.maven.plugins/i18n-maven-plugin/badge.svg)](https://maven-badges.herokuapp.com/maven-central/io.wcm.maven.plugins/i18n-maven-plugin)
+[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=wcm-io_io.wcm.maven.plugins.i18n-maven-plugin&metric=coverage)](https://sonarcloud.io/summary/new_code?id=wcm-io_io.wcm.maven.plugins.i18n-maven-plugin)
+
+Transforms and validates i18n resources for usage in Sling/AEM applications.
+
+Documentation: https://wcm.io/tooling/maven/plugins/i18n-maven-plugin/<br/>
+Issues: https://wcm-io.atlassian.net/browse/WTOOL<br/>
+Wiki: https://wcm-io.atlassian.net/wiki/<br/>
+Continuous Integration: https://github.com/wcm-io/io.wcm.maven.plugins.i18n-maven-plugin/actions<br/>
+Commercial support: https://wcm.io/commercial-support.html
+
+
+## Build from sources
+
+If you want to build wcm.io from sources make sure you have configured all [Maven Repositories](https://wcm.io/maven.html) in your settings.xml.
+
+See [Maven Settings](https://github.com/wcm-io/io.wcm.maven.plugins.i18n-maven-plugin/blob/develop/.maven-settings.xml) for an example with a full configuration.
+
+Then you can build using
+
+```
+mvn clean install
+```
diff --git a/changes.xml b/changes.xml
index df3293f..58736cf 100644
--- a/changes.xml
+++ b/changes.xml
@@ -23,6 +23,12 @@
     xsi:schemaLocation="http://maven.apache.org/changes/1.0.0 http://maven.apache.org/plugins/maven-changes-plugin/xsd/changes-1.0.0.xsd">
   <body>
 
+    <release version="1.2.2" date="2022-01-27">
+      <action type="update" dev="sseifert">
+        Declare Maven core dependencies as provided.
+      </action>
+    </release>
+
     <release version="1.2.0" date="2018-10-17">
       <action type="add" dev="amuthmann">
         Add 'properties' as supported output format.
diff --git a/mvnw b/mvnw
new file mode 100755
index 0000000..5643201
--- /dev/null
+++ b/mvnw
@@ -0,0 +1,316 @@
+#!/bin/sh
+# ----------------------------------------------------------------------------
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+# ----------------------------------------------------------------------------
+
+# ----------------------------------------------------------------------------
+# Maven Start Up Batch script
+#
+# Required ENV vars:
+# ------------------
+#   JAVA_HOME - location of a JDK home dir
+#
+# Optional ENV vars
+# -----------------
+#   M2_HOME - location of maven2's installed home dir
+#   MAVEN_OPTS - parameters passed to the Java VM when running Maven
+#     e.g. to debug Maven itself, use
+#       set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+#   MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+# ----------------------------------------------------------------------------
+
+if [ -z "$MAVEN_SKIP_RC" ] ; then
+
+  if [ -f /usr/local/etc/mavenrc ] ; then
+    . /usr/local/etc/mavenrc
+  fi
+
+  if [ -f /etc/mavenrc ] ; then
+    . /etc/mavenrc
+  fi
+
+  if [ -f "$HOME/.mavenrc" ] ; then
+    . "$HOME/.mavenrc"
+  fi
+
+fi
+
+# OS specific support.  $var _must_ be set to either true or false.
+cygwin=false;
+darwin=false;
+mingw=false
+case "`uname`" in
+  CYGWIN*) cygwin=true ;;
+  MINGW*) mingw=true;;
+  Darwin*) darwin=true
+    # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home
+    # See https://developer.apple.com/library/mac/qa/qa1170/_index.html
+    if [ -z "$JAVA_HOME" ]; then
+      if [ -x "/usr/libexec/java_home" ]; then
+        export JAVA_HOME="`/usr/libexec/java_home`"
+      else
+        export JAVA_HOME="/Library/Java/Home"
+      fi
+    fi
+    ;;
+esac
+
+if [ -z "$JAVA_HOME" ] ; then
+  if [ -r /etc/gentoo-release ] ; then
+    JAVA_HOME=`java-config --jre-home`
+  fi
+fi
+
+if [ -z "$M2_HOME" ] ; then
+  ## resolve links - $0 may be a link to maven's home
+  PRG="$0"
+
+  # need this for relative symlinks
+  while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+      PRG="$link"
+    else
+      PRG="`dirname "$PRG"`/$link"
+    fi
+  done
+
+  saveddir=`pwd`
+
+  M2_HOME=`dirname "$PRG"`/..
+
+  # make it fully qualified
+  M2_HOME=`cd "$M2_HOME" && pwd`
+
+  cd "$saveddir"
+  # echo Using m2 at $M2_HOME
+fi
+
+# For Cygwin, ensure paths are in UNIX format before anything is touched
+if $cygwin ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --unix "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --unix "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --unix "$CLASSPATH"`
+fi
+
+# For Mingw, ensure paths are in UNIX format before anything is touched
+if $mingw ; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME="`(cd "$M2_HOME"; pwd)`"
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`"
+fi
+
+if [ -z "$JAVA_HOME" ]; then
+  javaExecutable="`which javac`"
+  if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then
+    # readlink(1) is not available as standard on Solaris 10.
+    readLink=`which readlink`
+    if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then
+      if $darwin ; then
+        javaHome="`dirname \"$javaExecutable\"`"
+        javaExecutable="`cd \"$javaHome\" && pwd -P`/javac"
+      else
+        javaExecutable="`readlink -f \"$javaExecutable\"`"
+      fi
+      javaHome="`dirname \"$javaExecutable\"`"
+      javaHome=`expr "$javaHome" : '\(.*\)/bin'`
+      JAVA_HOME="$javaHome"
+      export JAVA_HOME
+    fi
+  fi
+fi
+
+if [ -z "$JAVACMD" ] ; then
+  if [ -n "$JAVA_HOME"  ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+      # IBM's JDK on AIX uses strange locations for the executables
+      JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+      JAVACMD="$JAVA_HOME/bin/java"
+    fi
+  else
+    JAVACMD="`\\unset -f command; \\command -v java`"
+  fi
+fi
+
+if [ ! -x "$JAVACMD" ] ; then
+  echo "Error: JAVA_HOME is not defined correctly." >&2
+  echo "  We cannot execute $JAVACMD" >&2
+  exit 1
+fi
+
+if [ -z "$JAVA_HOME" ] ; then
+  echo "Warning: JAVA_HOME environment variable is not set."
+fi
+
+CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher
+
+# traverses directory structure from process work directory to filesystem root
+# first directory with .mvn subdirectory is considered project base directory
+find_maven_basedir() {
+
+  if [ -z "$1" ]
+  then
+    echo "Path not specified to find_maven_basedir"
+    return 1
+  fi
+
+  basedir="$1"
+  wdir="$1"
+  while [ "$wdir" != '/' ] ; do
+    if [ -d "$wdir"/.mvn ] ; then
+      basedir=$wdir
+      break
+    fi
+    # workaround for JBEAP-8937 (on Solaris 10/Sparc)
+    if [ -d "${wdir}" ]; then
+      wdir=`cd "$wdir/.."; pwd`
+    fi
+    # end of workaround
+  done
+  echo "${basedir}"
+}
+
+# concatenates all lines of a file
+concat_lines() {
+  if [ -f "$1" ]; then
+    echo "$(tr -s '\n' ' ' < "$1")"
+  fi
+}
+
+BASE_DIR=`find_maven_basedir "$(pwd)"`
+if [ -z "$BASE_DIR" ]; then
+  exit 1;
+fi
+
+##########################################################################################
+# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+# This allows using the maven wrapper in projects that prohibit checking in binary data.
+##########################################################################################
+if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Found .mvn/wrapper/maven-wrapper.jar"
+    fi
+else
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..."
+    fi
+    if [ -n "$MVNW_REPOURL" ]; then
+      jarUrl="$MVNW_REPOURL/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+    else
+      jarUrl="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+    fi
+    while IFS="=" read key value; do
+      case "$key" in (wrapperUrl) jarUrl="$value"; break ;;
+      esac
+    done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties"
+    if [ "$MVNW_VERBOSE" = true ]; then
+      echo "Downloading from: $jarUrl"
+    fi
+    wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar"
+    if $cygwin; then
+      wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"`
+    fi
+
+    if command -v wget > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found wget ... using wget"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            wget "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
+        else
+            wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" || rm -f "$wrapperJarPath"
+        fi
+    elif command -v curl > /dev/null; then
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Found curl ... using curl"
+        fi
+        if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then
+            curl -o "$wrapperJarPath" "$jarUrl" -f
+        else
+            curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f
+        fi
+
+    else
+        if [ "$MVNW_VERBOSE" = true ]; then
+          echo "Falling back to using Java to download"
+        fi
+        javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java"
+        # For Cygwin, switch paths to Windows format before running javac
+        if $cygwin; then
+          javaClass=`cygpath --path --windows "$javaClass"`
+        fi
+        if [ -e "$javaClass" ]; then
+            if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Compiling MavenWrapperDownloader.java ..."
+                fi
+                # Compiling the Java class
+                ("$JAVA_HOME/bin/javac" "$javaClass")
+            fi
+            if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then
+                # Running the downloader
+                if [ "$MVNW_VERBOSE" = true ]; then
+                  echo " - Running MavenWrapperDownloader.java ..."
+                fi
+                ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR")
+            fi
+        fi
+    fi
+fi
+##########################################################################################
+# End of extension
+##########################################################################################
+
+export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"}
+if [ "$MVNW_VERBOSE" = true ]; then
+  echo $MAVEN_PROJECTBASEDIR
+fi
+MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS"
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin; then
+  [ -n "$M2_HOME" ] &&
+    M2_HOME=`cygpath --path --windows "$M2_HOME"`
+  [ -n "$JAVA_HOME" ] &&
+    JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"`
+  [ -n "$CLASSPATH" ] &&
+    CLASSPATH=`cygpath --path --windows "$CLASSPATH"`
+  [ -n "$MAVEN_PROJECTBASEDIR" ] &&
+    MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"`
+fi
+
+# Provide a "standardized" way to retrieve the CLI args that will
+# work with both Windows and non-Windows executions.
+MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@"
+export MAVEN_CMD_LINE_ARGS
+
+WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+exec "$JAVACMD" \
+  $MAVEN_OPTS \
+  $MAVEN_DEBUG_OPTS \
+  -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \
+  "-Dmaven.home=${M2_HOME}" \
+  "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \
+  ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@"
diff --git a/mvnw.cmd b/mvnw.cmd
new file mode 100644
index 0000000..8a15b7f
--- /dev/null
+++ b/mvnw.cmd
@@ -0,0 +1,188 @@
+@REM ----------------------------------------------------------------------------
+@REM Licensed to the Apache Software Foundation (ASF) under one
+@REM or more contributor license agreements.  See the NOTICE file
+@REM distributed with this work for additional information
+@REM regarding copyright ownership.  The ASF licenses this file
+@REM to you under the Apache License, Version 2.0 (the
+@REM "License"); you may not use this file except in compliance
+@REM with the License.  You may obtain a copy of the License at
+@REM
+@REM    http://www.apache.org/licenses/LICENSE-2.0
+@REM
+@REM Unless required by applicable law or agreed to in writing,
+@REM software distributed under the License is distributed on an
+@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+@REM KIND, either express or implied.  See the License for the
+@REM specific language governing permissions and limitations
+@REM under the License.
+@REM ----------------------------------------------------------------------------
+
+@REM ----------------------------------------------------------------------------
+@REM Maven Start Up Batch script
+@REM
+@REM Required ENV vars:
+@REM JAVA_HOME - location of a JDK home dir
+@REM
+@REM Optional ENV vars
+@REM M2_HOME - location of maven2's installed home dir
+@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands
+@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending
+@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven
+@REM     e.g. to debug Maven itself, use
+@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000
+@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files
+@REM ----------------------------------------------------------------------------
+
+@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on'
+@echo off
+@REM set title of command window
+title %0
+@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on'
+@if "%MAVEN_BATCH_ECHO%" == "on"  echo %MAVEN_BATCH_ECHO%
+
+@REM set %HOME% to equivalent of $HOME
+if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%")
+
+@REM Execute a user defined script before this one
+if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre
+@REM check for pre script, once with legacy .bat ending and once with .cmd ending
+if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %*
+if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %*
+:skipRcPre
+
+@setlocal
+
+set ERROR_CODE=0
+
+@REM To isolate internal variables from possible post scripts, we use another setlocal
+@setlocal
+
+@REM ==== START VALIDATION ====
+if not "%JAVA_HOME%" == "" goto OkJHome
+
+echo.
+echo Error: JAVA_HOME not found in your environment. >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+:OkJHome
+if exist "%JAVA_HOME%\bin\java.exe" goto init
+
+echo.
+echo Error: JAVA_HOME is set to an invalid directory. >&2
+echo JAVA_HOME = "%JAVA_HOME%" >&2
+echo Please set the JAVA_HOME variable in your environment to match the >&2
+echo location of your Java installation. >&2
+echo.
+goto error
+
+@REM ==== END VALIDATION ====
+
+:init
+
+@REM Find the project base dir, i.e. the directory that contains the folder ".mvn".
+@REM Fallback to current working directory if not found.
+
+set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR%
+IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir
+
+set EXEC_DIR=%CD%
+set WDIR=%EXEC_DIR%
+:findBaseDir
+IF EXIST "%WDIR%"\.mvn goto baseDirFound
+cd ..
+IF "%WDIR%"=="%CD%" goto baseDirNotFound
+set WDIR=%CD%
+goto findBaseDir
+
+:baseDirFound
+set MAVEN_PROJECTBASEDIR=%WDIR%
+cd "%EXEC_DIR%"
+goto endDetectBaseDir
+
+:baseDirNotFound
+set MAVEN_PROJECTBASEDIR=%EXEC_DIR%
+cd "%EXEC_DIR%"
+
+:endDetectBaseDir
+
+IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig
+
+@setlocal EnableExtensions EnableDelayedExpansion
+for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a
+@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS%
+
+:endReadAdditionalConfig
+
+SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe"
+set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar"
+set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain
+
+set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+
+FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO (
+    IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B
+)
+
+@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central
+@REM This allows using the maven wrapper in projects that prohibit checking in binary data.
+if exist %WRAPPER_JAR% (
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Found %WRAPPER_JAR%
+    )
+) else (
+    if not "%MVNW_REPOURL%" == "" (
+        SET DOWNLOAD_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.1.0/maven-wrapper-3.1.0.jar"
+    )
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Couldn't find %WRAPPER_JAR%, downloading it ...
+        echo Downloading from: %DOWNLOAD_URL%
+    )
+
+    powershell -Command "&{"^
+		"$webclient = new-object System.Net.WebClient;"^
+		"if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^
+		"$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^
+		"}"^
+		"[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^
+		"}"
+    if "%MVNW_VERBOSE%" == "true" (
+        echo Finished downloading %WRAPPER_JAR%
+    )
+)
+@REM End of extension
+
+@REM Provide a "standardized" way to retrieve the CLI args that will
+@REM work with both Windows and non-Windows executions.
+set MAVEN_CMD_LINE_ARGS=%*
+
+%MAVEN_JAVA_EXE% ^
+  %JVM_CONFIG_MAVEN_PROPS% ^
+  %MAVEN_OPTS% ^
+  %MAVEN_DEBUG_OPTS% ^
+  -classpath %WRAPPER_JAR% ^
+  "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^
+  %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %*
+if ERRORLEVEL 1 goto error
+goto end
+
+:error
+set ERROR_CODE=1
+
+:end
+@endlocal & set ERROR_CODE=%ERROR_CODE%
+
+if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost
+@REM check for post script, once with legacy .bat ending and once with .cmd ending
+if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat"
+if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd"
+:skipRcPost
+
+@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on'
+if "%MAVEN_BATCH_PAUSE%"=="on" pause
+
+if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE%
+
+cmd /C exit /B %ERROR_CODE%
diff --git a/pom.xml b/pom.xml
index 8576c84..5ac74c1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -19,19 +19,19 @@
   #L%
   -->
 
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+<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/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
     <groupId>io.wcm.maven</groupId>
     <artifactId>io.wcm.maven.parent</artifactId>
-    <version>1.0.10</version>
-    <relativePath>../../parent/pom.xml</relativePath>
+    <version>2.0.0</version>
+    <relativePath />
   </parent>
 
   <groupId>io.wcm.maven.plugins</groupId>
   <artifactId>i18n-maven-plugin</artifactId>
-  <version>1.2.0</version>
+  <version>1.2.2</version>
   <packaging>maven-plugin</packaging>
 
   <name>i18n Maven Plugin</name>
@@ -39,15 +39,22 @@
   <url>${site.url}/${site.url.module.prefix}/</url>
 
   <scm>
-    <connection>scm:git:https://github.com/wcm-io/wcm-io-tooling.git</connection>
-    <developerConnection>scm:git:https://github.com/wcm-io/wcm-io-tooling.git</developerConnection>
-    <url>https://github.com/wcm-io/wcm-io-tooling</url>
+    <connection>scm:git:https://github.com/wcm-io/io.wcm.maven.plugins.i18n-maven-plugin.git</connection>
+    <developerConnection>scm:git:https://github.com/wcm-io/io.wcm.maven.plugins.i18n-maven-plugin.git</developerConnection>
+    <url>https://github.com/wcm-io/io.wcm.maven.plugins.i18n-maven-plugin</url>
     <tag>HEAD</tag>
   </scm>
 
   <properties>
     <site.url.module.prefix>tooling/maven/plugins/i18n-maven-plugin</site.url.module.prefix>
     <maven.version>3.0.5</maven.version>
+
+    <!-- Enable reproducible builds -->
+    <project.build.outputTimestamp>2022-01-27T09:09:40Z</project.build.outputTimestamp>
+
+    <!-- Enable recording of coverage during execution of maven-invoker-plugin -->
+    <jacoco.propertyName>invoker.mavenOpts</jacoco.propertyName>
+    <jacoco.includes>org.jacoco.maven.*</jacoco.includes>
   </properties>
 
   <prerequisites>
@@ -55,99 +62,97 @@
   </prerequisites>
 
   <dependencies>
+    <dependency>
+      <groupId>org.apache.maven.plugin-tools</groupId>
+      <artifactId>maven-plugin-annotations</artifactId>
+      <scope>provided</scope>
+    </dependency>
+
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-plugin-api</artifactId>
       <version>${maven.version}</version>
-      <scope>compile</scope>
+      <scope>provided</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.maven</groupId>
       <artifactId>maven-core</artifactId>
       <version>${maven.version}</version>
-      <scope>compile</scope>
+      <scope>provided</scope>
     </dependency>
+
     <dependency>
       <groupId>org.sonatype.plexus</groupId>
       <artifactId>plexus-build-api</artifactId>
+      <version>0.0.7</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.maven.plugin-tools</groupId>
-      <artifactId>maven-plugin-annotations</artifactId>
-      <scope>provided</scope>
+      <groupId>org.codehaus.plexus</groupId>
+      <artifactId>plexus-utils</artifactId>
+      <version>2.0.6</version>
+      <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
+      <version>3.12.0</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
+      <version>2.11.0</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.sling</groupId>
       <artifactId>org.apache.sling.commons.json</artifactId>
+      <version>2.0.18</version>
       <scope>compile</scope>
     </dependency>
     <dependency>
       <groupId>org.jdom</groupId>
       <artifactId>jdom2</artifactId>
+      <version>2.0.6.1</version>
       <scope>compile</scope>
     </dependency>
+
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-api</artifactId>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-params</artifactId>
+      <scope>test</scope>
+    </dependency>
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+      <groupId>org.junit.jupiter</groupId>
+      <artifactId>junit-jupiter-engine</artifactId>
       <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.skyscreamer</groupId>
       <artifactId>jsonassert</artifactId>
+      <version>1.5.0</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>xmlunit</groupId>
-      <artifactId>xmlunit</artifactId>
+      <groupId>org.xmlunit</groupId>
+      <artifactId>xmlunit-core</artifactId>
+      <version>2.9.0</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.xmlunit</groupId>
+      <artifactId>xmlunit-legacy</artifactId>
+      <version>2.9.0</version>
       <scope>test</scope>
     </dependency>
-  </dependencies>
 
-  <dependencyManagement>
-    <dependencies>
-      <dependency>
-        <groupId>org.sonatype.plexus</groupId>
-        <artifactId>plexus-build-api</artifactId>
-        <version>0.0.7</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.maven.plugin-tools</groupId>
-        <artifactId>maven-plugin-annotations</artifactId>
-        <version>3.2</version>
-      </dependency>
-      <dependency>
-        <groupId>org.apache.sling</groupId>
-        <artifactId>org.apache.sling.commons.json</artifactId>
-        <version>2.0.8</version>
-      </dependency>
-      <dependency>
-        <groupId>org.jdom</groupId>
-        <artifactId>jdom2</artifactId>
-        <version>2.0.5</version>
-      </dependency>
-      <dependency>
-        <groupId>org.skyscreamer</groupId>
-        <artifactId>jsonassert</artifactId>
-        <version>1.2.3</version>
-      </dependency>
-      <dependency>
-        <groupId>xmlunit</groupId>
-        <artifactId>xmlunit</artifactId>
-        <version>1.6</version>
-      </dependency>
-    </dependencies>
-  </dependencyManagement>
+  </dependencies>
 
   <build>
     <plugins>
@@ -155,7 +160,6 @@
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-plugin-plugin</artifactId>
-        <version>3.5.2</version>
         <configuration>
           <goalPrefix>i18n</goalPrefix>
           <skipErrorNoDescriptorsFound>true</skipErrorNoDescriptorsFound>
@@ -176,6 +180,65 @@
         </executions>
       </plugin>
 
+       <plugin>
+        <groupId>org.jacoco</groupId>
+        <artifactId>jacoco-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>prepare-agent</goal>
+              <goal>prepare-agent-integration</goal>
+              <goal>report</goal>
+              <goal>report-integration</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-invoker-plugin</artifactId>
+        <configuration>
+          <projectsDirectory>src/it</projectsDirectory>
+          <cloneProjectsTo>${project.build.directory}/it</cloneProjectsTo>
+          <pomIncludes>
+            <pomInclude>**/pom.xml</pomInclude>
+          </pomIncludes>
+          <postBuildHookScript>verify</postBuildHookScript>
+          <streamLogsOnFailures>true</streamLogsOnFailures>
+          <extraArtifacts>
+            <extraArtifact>org.jacoco:org.jacoco.agent:${jacoco-maven-plugin.version}:jar:runtime</extraArtifact>
+          </extraArtifacts>
+        </configuration>
+        <executions>
+          <execution>
+            <id>integration-test</id>
+            <goals>
+              <goal>install</goal>
+              <goal>integration-test</goal>
+              <goal>verify</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-site-plugin</artifactId>
+        <configuration>
+          <topSiteURL>${site.deploy.url}</topSiteURL>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-scm-publish-plugin</artifactId>
+        <configuration>
+          <subDirectory>${site.url.module.prefix}</subDirectory>
+          <skipDeletedFiles>true</skipDeletedFiles>
+        </configuration>
+      </plugin>
+
     </plugins>
   </build>
 
@@ -198,7 +261,7 @@
   <distributionManagement>
     <site>
       <id>${site.deploy.id}</id>
-      <url>${site.deploy.url}${site.url.module.prefix}</url>
+      <url>${site.deploy.url}</url>
     </site>
   </distributionManagement>
 
diff --git a/src/it/json-to-json/invoker.properties b/src/it/json-to-json/invoker.properties
new file mode 100644
index 0000000..e2a44e3
--- /dev/null
+++ b/src/it/json-to-json/invoker.properties
@@ -0,0 +1 @@
+invoker.goals = clean verify
diff --git a/src/it/json-to-json/pom.xml b/src/it/json-to-json/pom.xml
new file mode 100644
index 0000000..14bd767
--- /dev/null
+++ b/src/it/json-to-json/pom.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  wcm.io
+  %%
+  Copyright (C) 2022 wcm.io
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  
+  <parent>
+    <groupId>io.wcm.maven</groupId>
+    <artifactId>io.wcm.maven.aem-global-parent</artifactId>
+    <version>2.0.0</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>io.wcm.maven.plugins.it</groupId>
+  <artifactId>i18n-maven-plugin-json-to-json</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  
+  <properties>
+    <!-- Java version -->
+    <java.version>1.8</java.version>
+    <build.compiler.release>8</build.compiler.release>
+  </properties>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <excludes>
+          <!-- those resources are processed by the i18n-maven-plugin -->
+          <exclude>i18n/**</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+
+      <plugin>
+        <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-maven-plugin</artifactId>
+        <configuration>
+          <bnd>
+            Sling-Initial-Content: SLING-INF/app-root;overwrite:=true;ignoreImportProviders:=xml;path:=/apps/integration-test
+          </bnd>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>transform</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/json-to-json/src/main/resources/i18n/en.json b/src/it/json-to-json/src/main/resources/i18n/en.json
new file mode 100644
index 0000000..a5cb8ca
--- /dev/null
+++ b/src/it/json-to-json/src/main/resources/i18n/en.json
@@ -0,0 +1,8 @@
+{
+  "key1": "value1",
+  "key21": {
+    "key22": {
+      "key23": "value 2"
+    }
+  }
+}
diff --git a/src/it/json-to-json/verify.groovy b/src/it/json-to-json/verify.groovy
new file mode 100644
index 0000000..4bae495
--- /dev/null
+++ b/src/it/json-to-json/verify.groovy
@@ -0,0 +1,11 @@
+import groovy.json.JsonSlurper
+
+File jsonFile = new File(basedir, "target/classes/SLING-INF/app-root/i18n/en.json")
+assert jsonFile.exists();
+
+def json = new JsonSlurper().parseText(jsonFile.getText("utf-8"))
+
+assert json["key1"]["sling:message"] == "value1"
+assert json["key21.key22.key23"]["sling:message"] == "value 2"
+
+return true;
diff --git a/src/it/json-to-properties/invoker.properties b/src/it/json-to-properties/invoker.properties
new file mode 100644
index 0000000..e2a44e3
--- /dev/null
+++ b/src/it/json-to-properties/invoker.properties
@@ -0,0 +1 @@
+invoker.goals = clean verify
diff --git a/src/it/json-to-properties/pom.xml b/src/it/json-to-properties/pom.xml
new file mode 100644
index 0000000..89e0ea4
--- /dev/null
+++ b/src/it/json-to-properties/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  wcm.io
+  %%
+  Copyright (C) 2022 wcm.io
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  
+  <parent>
+    <groupId>io.wcm.maven</groupId>
+    <artifactId>io.wcm.maven.aem-global-parent</artifactId>
+    <version>2.0.0</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>io.wcm.maven.plugins.it</groupId>
+  <artifactId>i18n-maven-plugin-json-to-properties</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  
+  <properties>
+    <!-- Java version -->
+    <java.version>1.8</java.version>
+    <build.compiler.release>8</build.compiler.release>
+  </properties>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <excludes>
+          <!-- those resources are processed by the i18n-maven-plugin -->
+          <exclude>i18n/**</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+
+      <plugin>
+        <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-maven-plugin</artifactId>
+        <configuration>
+          <bnd>
+            Sling-Initial-Content: SLING-INF/app-root;overwrite:=true;ignoreImportProviders:=xml;path:=/apps/integration-test
+          </bnd>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>transform</goal>
+            </goals>
+            <configuration>
+              <outputFormat>properties</outputFormat>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/json-to-properties/src/main/resources/i18n/en.json b/src/it/json-to-properties/src/main/resources/i18n/en.json
new file mode 100644
index 0000000..a5cb8ca
--- /dev/null
+++ b/src/it/json-to-properties/src/main/resources/i18n/en.json
@@ -0,0 +1,8 @@
+{
+  "key1": "value1",
+  "key21": {
+    "key22": {
+      "key23": "value 2"
+    }
+  }
+}
diff --git a/src/it/json-to-properties/verify.groovy b/src/it/json-to-properties/verify.groovy
new file mode 100644
index 0000000..08d3dfc
--- /dev/null
+++ b/src/it/json-to-properties/verify.groovy
@@ -0,0 +1,12 @@
+File propsFile = new File(basedir, "target/classes/SLING-INF/app-root/i18n/en.properties")
+assert propsFile.exists();
+
+Properties props = new Properties()
+propsFile.withInputStream {
+    props.load(it)
+}
+
+assert props["key1"] == "value1"
+assert props["key21.key22.key23"] == "value 2"
+
+return true;
diff --git a/src/it/properties-to-json/invoker.properties b/src/it/properties-to-json/invoker.properties
new file mode 100644
index 0000000..e2a44e3
--- /dev/null
+++ b/src/it/properties-to-json/invoker.properties
@@ -0,0 +1 @@
+invoker.goals = clean verify
diff --git a/src/it/properties-to-json/pom.xml b/src/it/properties-to-json/pom.xml
new file mode 100644
index 0000000..120f01f
--- /dev/null
+++ b/src/it/properties-to-json/pom.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  wcm.io
+  %%
+  Copyright (C) 2022 wcm.io
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  
+  <parent>
+    <groupId>io.wcm.maven</groupId>
+    <artifactId>io.wcm.maven.aem-global-parent</artifactId>
+    <version>2.0.0</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>io.wcm.maven.plugins.it</groupId>
+  <artifactId>i18n-maven-plugin-properties-to-json</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  
+  <properties>
+    <!-- Java version -->
+    <java.version>1.8</java.version>
+    <build.compiler.release>8</build.compiler.release>
+  </properties>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <excludes>
+          <!-- those resources are processed by the i18n-maven-plugin -->
+          <exclude>i18n/**</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+
+      <plugin>
+        <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-maven-plugin</artifactId>
+        <configuration>
+          <bnd>
+            Sling-Initial-Content: SLING-INF/app-root;overwrite:=true;ignoreImportProviders:=xml;path:=/apps/integration-test
+          </bnd>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>transform</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/properties-to-json/src/main/resources/i18n/en.properties b/src/it/properties-to-json/src/main/resources/i18n/en.properties
new file mode 100644
index 0000000..b28c9a1
--- /dev/null
+++ b/src/it/properties-to-json/src/main/resources/i18n/en.properties
@@ -0,0 +1,2 @@
+key1=value1
+key21.key22.key23=value 2
\ No newline at end of file
diff --git a/src/it/properties-to-json/verify.groovy b/src/it/properties-to-json/verify.groovy
new file mode 100644
index 0000000..4bae495
--- /dev/null
+++ b/src/it/properties-to-json/verify.groovy
@@ -0,0 +1,11 @@
+import groovy.json.JsonSlurper
+
+File jsonFile = new File(basedir, "target/classes/SLING-INF/app-root/i18n/en.json")
+assert jsonFile.exists();
+
+def json = new JsonSlurper().parseText(jsonFile.getText("utf-8"))
+
+assert json["key1"]["sling:message"] == "value1"
+assert json["key21.key22.key23"]["sling:message"] == "value 2"
+
+return true;
diff --git a/src/it/properties-to-xml/invoker.properties b/src/it/properties-to-xml/invoker.properties
new file mode 100644
index 0000000..e2a44e3
--- /dev/null
+++ b/src/it/properties-to-xml/invoker.properties
@@ -0,0 +1 @@
+invoker.goals = clean verify
diff --git a/src/it/properties-to-xml/pom.xml b/src/it/properties-to-xml/pom.xml
new file mode 100644
index 0000000..105f92a
--- /dev/null
+++ b/src/it/properties-to-xml/pom.xml
@@ -0,0 +1,93 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  wcm.io
+  %%
+  Copyright (C) 2022 wcm.io
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  
+  <parent>
+    <groupId>io.wcm.maven</groupId>
+    <artifactId>io.wcm.maven.aem-global-parent</artifactId>
+    <version>2.0.0</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>io.wcm.maven.plugins.it</groupId>
+  <artifactId>i18n-maven-plugin-properties-to-xml</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  
+  <properties>
+    <!-- Java version -->
+    <java.version>1.8</java.version>
+    <build.compiler.release>8</build.compiler.release>
+  </properties>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <excludes>
+          <!-- those resources are processed by the i18n-maven-plugin -->
+          <exclude>i18n/**</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+
+      <plugin>
+        <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-maven-plugin</artifactId>
+        <configuration>
+          <bnd>
+            Sling-Initial-Content: SLING-INF/app-root;overwrite:=true;ignoreImportProviders:=xml;path:=/apps/integration-test
+          </bnd>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>transform</goal>
+            </goals>
+            <configuration>
+              <outputFormat>xml</outputFormat>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/properties-to-xml/src/main/resources/i18n/en.properties b/src/it/properties-to-xml/src/main/resources/i18n/en.properties
new file mode 100644
index 0000000..b28c9a1
--- /dev/null
+++ b/src/it/properties-to-xml/src/main/resources/i18n/en.properties
@@ -0,0 +1,2 @@
+key1=value1
+key21.key22.key23=value 2
\ No newline at end of file
diff --git a/src/it/properties-to-xml/verify.groovy b/src/it/properties-to-xml/verify.groovy
new file mode 100644
index 0000000..2e5cbd8
--- /dev/null
+++ b/src/it/properties-to-xml/verify.groovy
@@ -0,0 +1,11 @@
+import groovy.util.XmlSlurper
+
+File xmlFile = new File(basedir, "target/classes/SLING-INF/app-root/i18n/en.xml")
+assert xmlFile.exists();
+
+def xml = new XmlSlurper().parseText(xmlFile.getText("utf-8"))
+
+assert xml["key1"]["@sling:message"] == "value1"
+assert xml["key21.key22.key23"]["@sling:message"] == "value 2"
+
+return true;
diff --git a/src/it/xml-to-json/invoker.properties b/src/it/xml-to-json/invoker.properties
new file mode 100644
index 0000000..e2a44e3
--- /dev/null
+++ b/src/it/xml-to-json/invoker.properties
@@ -0,0 +1 @@
+invoker.goals = clean verify
diff --git a/src/it/xml-to-json/pom.xml b/src/it/xml-to-json/pom.xml
new file mode 100644
index 0000000..a934552
--- /dev/null
+++ b/src/it/xml-to-json/pom.xml
@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  wcm.io
+  %%
+  Copyright (C) 2022 wcm.io
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<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/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+  
+  <parent>
+    <groupId>io.wcm.maven</groupId>
+    <artifactId>io.wcm.maven.aem-global-parent</artifactId>
+    <version>2.0.0</version>
+    <relativePath/>
+  </parent>
+
+  <groupId>io.wcm.maven.plugins.it</groupId>
+  <artifactId>i18n-maven-plugin-xml-to-json</artifactId>
+  <version>1.0.0-SNAPSHOT</version>
+  
+  <properties>
+    <!-- Java version -->
+    <java.version>1.8</java.version>
+    <build.compiler.release>8</build.compiler.release>
+  </properties>
+
+  <build>
+    <resources>
+      <resource>
+        <directory>src/main/resources</directory>
+        <filtering>false</filtering>
+        <excludes>
+          <!-- those resources are processed by the i18n-maven-plugin -->
+          <exclude>i18n/**</exclude>
+        </excludes>
+      </resource>
+    </resources>
+    <plugins>
+
+      <plugin>
+        <groupId>biz.aQute.bnd</groupId>
+        <artifactId>bnd-maven-plugin</artifactId>
+        <configuration>
+          <bnd>
+            Sling-Initial-Content: SLING-INF/app-root;overwrite:=true;ignoreImportProviders:=xml;path:=/apps/integration-test
+          </bnd>
+        </configuration>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-jar-plugin</artifactId>
+        <configuration>
+          <archive>
+            <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
+          </archive>
+        </configuration>
+      </plugin>
+
+      <plugin>
+        <groupId>@project.groupId@</groupId>
+        <artifactId>@project.artifactId@</artifactId>
+        <version>@project.version@</version>
+        <executions>
+          <execution>
+            <goals>
+              <goal>transform</goal>
+            </goals>
+          </execution>
+        </executions>
+      </plugin>
+
+    </plugins>
+  </build>
+
+</project>
diff --git a/src/it/xml-to-json/src/main/resources/i18n/en.xml b/src/it/xml-to-json/src/main/resources/i18n/en.xml
new file mode 100644
index 0000000..256387b
--- /dev/null
+++ b/src/it/xml-to-json/src/main/resources/i18n/en.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<i18n>
+  <key1>value1</key1>
+  <key21>
+    <key22>
+      <key23>value 2</key23>
+    </key22>
+  </key21>
+</i18n>
diff --git a/src/it/xml-to-json/verify.groovy b/src/it/xml-to-json/verify.groovy
new file mode 100644
index 0000000..4bae495
--- /dev/null
+++ b/src/it/xml-to-json/verify.groovy
@@ -0,0 +1,11 @@
+import groovy.json.JsonSlurper
+
+File jsonFile = new File(basedir, "target/classes/SLING-INF/app-root/i18n/en.json")
+assert jsonFile.exists();
+
+def json = new JsonSlurper().parseText(jsonFile.getText("utf-8"))
+
+assert json["key1"]["sling:message"] == "value1"
+assert json["key21.key22.key23"]["sling:message"] == "value 2"
+
+return true;
diff --git a/src/main/java/io/wcm/maven/plugins/i18n/SlingI18nMap.java b/src/main/java/io/wcm/maven/plugins/i18n/SlingI18nMap.java
index 004f69c..b610f3c 100644
--- a/src/main/java/io/wcm/maven/plugins/i18n/SlingI18nMap.java
+++ b/src/main/java/io/wcm/maven/plugins/i18n/SlingI18nMap.java
@@ -21,6 +21,8 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -28,7 +30,6 @@
 import java.util.SortedMap;
 import java.util.TreeMap;
 
-import org.apache.commons.lang3.CharEncoding;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.JSONObject;
@@ -38,29 +39,27 @@
 import org.jdom2.output.Format;
 import org.jdom2.output.XMLOutputter;
 
-import com.google.common.collect.ImmutableList;
-
 /**
  * Helper class integrating i18n JSON generation into a sorted map.
  */
 class SlingI18nMap {
 
   private static final String JCR_LANGUAGE = "language";
-  private static final List<String> JCR_MIX_LANGUAGE = ImmutableList.of("mix:language");
+  private static final List<String> JCR_MIX_LANGUAGE = Collections.singletonList("mix:language");
   private static final String JCR_MIXIN_TYPES = "mixinTypes";
   private static final String JCR_NODETYPE_FOLDER = "nt:folder";
   private static final String JCR_PRIMARY_TYPE = "primaryType";
 
   private static final String SLING_KEY = "key";
   private static final String SLING_MESSAGE = "message";
-  private static final List<String> SLING_MESSAGE_MIXIN_TYPE = ImmutableList.of("sling:Message");
+  private static final List<String> SLING_MESSAGE_MIXIN_TYPE = Collections.singletonList("sling:Message");
 
   private static final Namespace NAMESPACE_SLING = Namespace.getNamespace("sling", "http://sling.apache.org/jcr/sling/1.0");
   private static final Namespace NAMESPACE_JCR = Namespace.getNamespace("jcr", "http://www.jcp.org/jcr/1.0");
   private static final Namespace NAMESPACE_MIX = Namespace.getNamespace("mix", "http://www.jcp.org/jcr/mix/1.0");
   private static final Namespace NAMESPACE_NT = Namespace.getNamespace("nt", "http://www.jcp.org/jcr/nt/1.0");
 
-  private String languageKey;
+  private final String languageKey;
   private final SortedMap<String, String> properties;
 
   /**
@@ -74,7 +73,6 @@ class SlingI18nMap {
   /**
    * Build i18n resource JSON in Sling i18n Message format.
    * @return JSON
-   * @throws JSONException
    */
   public String getI18nJsonString() throws JSONException {
     return buildI18nJson().toString(2);
@@ -224,7 +222,6 @@ private static String validName(String value) {
   /**
    * Build i18n resource PROPERTIES.
    * @return JSON
-   * @throws IOException
    */
   public String getI18nPropertiesString() throws IOException {
     // Load all properties
@@ -240,7 +237,7 @@ public String getI18nPropertiesString() throws IOException {
     try (ByteArrayOutputStream outStream = new ByteArrayOutputStream()) {
       i18nProps.store(outStream, null);
       // Property files are always ISO 8859 encoded
-      return outStream.toString(CharEncoding.ISO_8859_1);
+      return outStream.toString(StandardCharsets.ISO_8859_1.name());
     }
   }
 
diff --git a/src/main/java/io/wcm/maven/plugins/i18n/TransformMojo.java b/src/main/java/io/wcm/maven/plugins/i18n/TransformMojo.java
index a707a0b..b3ceaf5 100644
--- a/src/main/java/io/wcm/maven/plugins/i18n/TransformMojo.java
+++ b/src/main/java/io/wcm/maven/plugins/i18n/TransformMojo.java
@@ -21,10 +21,10 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.List;
 
-import org.apache.commons.lang3.CharEncoding;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.maven.model.Build;
 import org.apache.maven.model.Resource;
@@ -149,7 +149,7 @@ private boolean isI18nSourceFileChanged(Scanner scanner) {
 
   /**
    * Initialize parameters, which cannot get defaults from annotations. Currently only the root nodes.
-   * @throws IOException
+   * @throws IOException I/O exception
    */
   private void intialize(File sourceDirectory) throws IOException {
     getLog().debug("Initializing i18n plugin...");
@@ -179,7 +179,6 @@ private void addResource(String generatedResourcesDirectory, String targetPath)
    * Fetches i18n source files from source directory.
    * @param sourceDirectory Source directory
    * @return a list of XML files
-   * @throws IOException
    */
   @SuppressWarnings("unchecked")
   private List<File> getI18nSourceFiles(File sourceDirectory) throws IOException {
@@ -203,7 +202,6 @@ private List<File> getI18nSourceFiles(File sourceDirectory) throws IOException {
   /**
    * Get directory containing source i18n files.
    * @return directory containing source i18n files.
-   * @throws IOException
    */
   private File getSourceDirectory() throws IOException {
     File file = new File(source);
@@ -218,18 +216,16 @@ private File getSourceDirectory() throws IOException {
    * @param i18nMap mappings
    * @param targetfile target file
    * @param selectedOutputFormat Output format
-   * @throws IOException
-   * @throws JSONException
    */
   private void writeTargetI18nFile(SlingI18nMap i18nMap, File targetfile, OutputFormat selectedOutputFormat) throws IOException, JSONException {
     if (selectedOutputFormat == OutputFormat.XML) {
-      FileUtils.fileWrite(targetfile, CharEncoding.UTF_8, i18nMap.getI18nXmlString());
+      FileUtils.fileWrite(targetfile, StandardCharsets.UTF_8.name(), i18nMap.getI18nXmlString());
     }
     else if (selectedOutputFormat == OutputFormat.PROPERTIES) {
-      FileUtils.fileWrite(targetfile, CharEncoding.ISO_8859_1, i18nMap.getI18nPropertiesString());
+      FileUtils.fileWrite(targetfile, StandardCharsets.ISO_8859_1.name(), i18nMap.getI18nPropertiesString());
     }
     else {
-      FileUtils.fileWrite(targetfile, CharEncoding.UTF_8, i18nMap.getI18nJsonString());
+      FileUtils.fileWrite(targetfile, StandardCharsets.UTF_8.name(), i18nMap.getI18nJsonString());
     }
     buildContext.refresh(targetfile);
   }
@@ -239,7 +235,6 @@ else if (selectedOutputFormat == OutputFormat.PROPERTIES) {
    * @param sourceFile the source file
    * @param selectedOutputFormat Output format
    * @return File with name and path based on file parameter
-   * @throws IOException
    */
   private File getTargetFile(File sourceFile, OutputFormat selectedOutputFormat) throws IOException {
 
@@ -253,19 +248,23 @@ private File getTargetFile(File sourceFile, OutputFormat selectedOutputFormat) t
 
     File parentDirectory = jsonFile.getParentFile();
     if (!parentDirectory.exists()) {
-      parentDirectory.mkdirs();
+      if (!parentDirectory.mkdirs()) {
+        throw new IOException("Unable to create directory: " + parentDirectory.getPath());
+      }
       buildContext.refresh(parentDirectory);
     }
 
     return jsonFile;
   }
 
-  private File getGeneratedResourcesFolder() {
+  private File getGeneratedResourcesFolder() throws IOException {
     if (generatedResourcesFolder == null) {
       String generatedResourcesFolderAbsolutePath = this.project.getBuild().getDirectory() + "/" + generatedResourcesFolderPath;
       generatedResourcesFolder = new File(generatedResourcesFolderAbsolutePath);
       if (!generatedResourcesFolder.exists()) {
-        generatedResourcesFolder.mkdirs();
+        if (!generatedResourcesFolder.mkdirs()) {
+          throw new IOException("Unable to create directory: " + generatedResourcesFolder.getPath());
+        }
         buildContext.refresh(generatedResourcesFolder);
       }
     }
@@ -276,7 +275,6 @@ private File getGeneratedResourcesFolder() {
    * Get i18n reader for source file.
    * @param sourceFile Source file
    * @return I18n reader
-   * @throws MojoFailureException
    */
   private I18nReader getI18nReader(File sourceFile) throws MojoFailureException {
     String extension = FileUtils.getExtension(sourceFile.getName());
diff --git a/src/main/java/io/wcm/maven/plugins/i18n/readers/JsonI18nReader.java b/src/main/java/io/wcm/maven/plugins/i18n/readers/JsonI18nReader.java
index 406cb00..f29764c 100644
--- a/src/main/java/io/wcm/maven/plugins/i18n/readers/JsonI18nReader.java
+++ b/src/main/java/io/wcm/maven/plugins/i18n/readers/JsonI18nReader.java
@@ -21,11 +21,11 @@
 
 import java.io.File;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.CharEncoding;
 import org.apache.sling.commons.json.JSONArray;
 import org.apache.sling.commons.json.JSONException;
 import org.apache.sling.commons.json.JSONObject;
@@ -37,10 +37,10 @@ public class JsonI18nReader implements I18nReader {
 
   @Override
   public Map<String, String> read(File sourceFile) throws IOException {
-    String fileContent = IOUtils.toString(sourceFile.toURI().toURL(), CharEncoding.UTF_8);
+    String fileContent = IOUtils.toString(sourceFile.toURI().toURL(), StandardCharsets.UTF_8);
     try {
       JSONObject root = new JSONObject(fileContent);
-      Map<String, String> map = new HashMap<String, String>();
+      Map<String, String> map = new HashMap<>();
       parseJson(root, map, "");
       return map;
     }
diff --git a/src/main/java/io/wcm/maven/plugins/i18n/readers/PropertiesI18nReader.java b/src/main/java/io/wcm/maven/plugins/i18n/readers/PropertiesI18nReader.java
index 9c630d2..44548d8 100644
--- a/src/main/java/io/wcm/maven/plugins/i18n/readers/PropertiesI18nReader.java
+++ b/src/main/java/io/wcm/maven/plugins/i18n/readers/PropertiesI18nReader.java
@@ -23,12 +23,11 @@
 import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
 
-import org.apache.commons.lang3.CharEncoding;
-
 /**
  * Reads i18n resources from Java properties files.
  */
@@ -39,7 +38,7 @@ public Map<String, String> read(File sourceFile) throws IOException {
     // read properties
     Properties props = new Properties();
     try (FileInputStream is = new FileInputStream(sourceFile);
-        InputStreamReader reader = new InputStreamReader(is, CharEncoding.UTF_8)) {
+        InputStreamReader reader = new InputStreamReader(is, StandardCharsets.UTF_8)) {
       props.load(reader);
     }
 
diff --git a/src/main/java/io/wcm/maven/plugins/i18n/readers/XmlI18nReader.java b/src/main/java/io/wcm/maven/plugins/i18n/readers/XmlI18nReader.java
index f7937af..10d2071 100644
--- a/src/main/java/io/wcm/maven/plugins/i18n/readers/XmlI18nReader.java
+++ b/src/main/java/io/wcm/maven/plugins/i18n/readers/XmlI18nReader.java
@@ -25,6 +25,8 @@
 import java.util.List;
 import java.util.Map;
 
+import javax.xml.XMLConstants;
+
 import org.jdom2.Document;
 import org.jdom2.Element;
 import org.jdom2.JDOMException;
@@ -39,8 +41,10 @@ public class XmlI18nReader implements I18nReader {
   public Map<String, String> read(File sourceFile) throws IOException {
     try {
       SAXBuilder builder = new SAXBuilder();
+      builder.setProperty(XMLConstants.ACCESS_EXTERNAL_DTD, "");
+      builder.setProperty(XMLConstants.ACCESS_EXTERNAL_SCHEMA, "");
       Document doc = builder.build(sourceFile);
-      Map<String, String> map = new HashMap<String, String>();
+      Map<String, String> map = new HashMap<>();
       parseXml(doc.getRootElement(), map, "");
       return map;
     }
@@ -53,7 +57,7 @@ private void parseXml(Element node, Map<String, String> map, String prefix) {
     List<Element> children = node.getChildren();
     for (Element child : children) {
       String key = child.getName();
-      if (child.getChildren().size() > 0) {
+      if (!child.getChildren().isEmpty()) {
         parseXml(child, map, prefix + key + ".");
       }
       else {
diff --git a/src/site/markdown/index.md b/src/site/markdown/index.md
index a0690af..0bd3c9d 100644
--- a/src/site/markdown/index.md
+++ b/src/site/markdown/index.md
@@ -29,6 +29,11 @@ All those input files are transformed during maven build to the sling destinatio
 See [Usage][usage] for details.
 
 
+### GitHub Repository
+
+Sources: https://github.com/wcm-io/io.wcm.maven.plugins.i18n-maven-plugin
+
+
 [usage]: usage.html
 [plugindocs]: plugin-info.html
 [changelog]: changes-report.html
diff --git a/src/site/site.xml b/src/site/site.xml
new file mode 100644
index 0000000..4dfa9a8
--- /dev/null
+++ b/src/site/site.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  #%L
+  wcm.io
+  %%
+  Copyright (C) 2022 wcm.io
+  %%
+  Licensed under the Apache License, Version 2.0 (the "License");
+  you may not use this file except in compliance with the License.
+  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+  #L%
+  -->
+
+<project name="wcm.io"
+  xmlns="http://maven.apache.org/DECORATION/1.8.0"
+  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/DECORATION/1.8.0 https://maven.apache.org/xsd/decoration-1.8.0.xsd">
+
+  <body>
+    <breadcrumbs>
+      <item name="wcm.io" href="https://wcm.io" />
+      <item name="Tooling" href="https://wcm.io/tooling/" />
+      <item name="Maven" href="https://wcm.io/tooling/maven/" />
+      <item name="i18n Maven Plugin" href="https://wcm.io/tooling/maven/plugins/i18n-maven-plugin/" />
+    </breadcrumbs>
+  </body>
+
+</project>
diff --git a/src/test/java/io/wcm/maven/plugins/i18n/FileUtil.java b/src/test/java/io/wcm/maven/plugins/i18n/FileUtil.java
index 85ec7a5..f143f78 100644
--- a/src/test/java/io/wcm/maven/plugins/i18n/FileUtil.java
+++ b/src/test/java/io/wcm/maven/plugins/i18n/FileUtil.java
@@ -24,9 +24,10 @@
 import java.io.InputStream;
 import java.net.URISyntaxException;
 import java.net.URL;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
 
 import org.apache.commons.io.IOUtils;
-import org.apache.commons.lang3.CharEncoding;
 
 public final class FileUtil {
 
@@ -40,10 +41,10 @@ public static File getFileFromClasspath(String resourcePath) throws URISyntaxExc
   }
 
   public static String getStringFromClasspath(String resourcePath) throws IOException {
-    return getStringFromClasspath(resourcePath, CharEncoding.UTF_8);
+    return getStringFromClasspath(resourcePath, StandardCharsets.UTF_8);
   }
 
-  public static String getStringFromClasspath(String resourcePath, String encoding) throws IOException {
+  public static String getStringFromClasspath(String resourcePath, Charset encoding) throws IOException {
     try (InputStream is = FileUtil.class.getClassLoader().getResourceAsStream(resourcePath)) {
       return IOUtils.toString(is, encoding);
     }
diff --git a/src/test/java/io/wcm/maven/plugins/i18n/SlingI18nMapTest.java b/src/test/java/io/wcm/maven/plugins/i18n/SlingI18nMapTest.java
index c78dc42..974daeb 100644
--- a/src/test/java/io/wcm/maven/plugins/i18n/SlingI18nMapTest.java
+++ b/src/test/java/io/wcm/maven/plugins/i18n/SlingI18nMapTest.java
@@ -20,29 +20,29 @@
 package io.wcm.maven.plugins.i18n;
 
 import static io.wcm.maven.plugins.i18n.FileUtil.getStringFromClasspath;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.io.StringReader;
+import java.nio.charset.StandardCharsets;
 import java.util.Map;
 import java.util.Properties;
 
-import org.apache.commons.lang3.CharEncoding;
 import org.custommonkey.xmlunit.XMLAssert;
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 import org.skyscreamer.jsonassert.JSONAssert;
 
 import com.google.common.collect.ImmutableMap;
 
-public class SlingI18nMapTest {
+class SlingI18nMapTest {
 
   private SlingI18nMap underTest;
 
-  @Before
-  public void setUp() {
+  @BeforeEach
+  void setUp() {
     underTest = new SlingI18nMap("en", ImmutableMap.<String, String>builder()
         .put("key1", "value1")
         .put("key2.key21.key211", "value2")
@@ -52,21 +52,21 @@ public void setUp() {
   }
 
   @Test
-  public void testGetI18nJsonString() throws Exception {
+  void testGetI18nJsonString() throws Exception {
     JSONAssert.assertEquals(getStringFromClasspath("map/i18n-content.json"), underTest.getI18nJsonString(), true);
   }
 
   @Test
-  public void testGetI18nXmlString() throws Exception {
+  void testGetI18nXmlString() throws Exception {
     XMLAssert.assertXMLEqual(getStringFromClasspath("map/i18n-content.xml"), underTest.getI18nXmlString());
   }
 
   @Test
-  public void testGetI18nPropertiesString() throws Exception {
+  void testGetI18nPropertiesString() throws Exception {
     Properties props = new Properties();
     //Note: as the files in file-system are encoded as utf-8, we need to set it manually to override the properties default
     try (InputStream is = FileUtil.class.getClassLoader().getResourceAsStream("map/i18n-content.properties")) {
-      props.load(new InputStreamReader(is, CharEncoding.UTF_8));
+      props.load(new InputStreamReader(is, StandardCharsets.UTF_8));
     }
 
     Properties underTestProperties = new Properties();
diff --git a/src/test/java/io/wcm/maven/plugins/i18n/readers/I18nReaderTest.java b/src/test/java/io/wcm/maven/plugins/i18n/readers/I18nReaderTest.java
index 5ce8c08..62eac0a 100644
--- a/src/test/java/io/wcm/maven/plugins/i18n/readers/I18nReaderTest.java
+++ b/src/test/java/io/wcm/maven/plugins/i18n/readers/I18nReaderTest.java
@@ -20,16 +20,16 @@
 package io.wcm.maven.plugins.i18n.readers;
 
 import static io.wcm.maven.plugins.i18n.FileUtil.getFileFromClasspath;
-import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.io.File;
 import java.util.Map;
 
-import org.junit.Test;
+import org.junit.jupiter.api.Test;
 
 import com.google.common.collect.ImmutableMap;
 
-public class I18nReaderTest {
+class I18nReaderTest {
 
   private static final Map<String, String> EXPECTED_MAP = ImmutableMap.<String, String>builder()
       .put("key1", "value1")
@@ -38,21 +38,21 @@ public class I18nReaderTest {
       .build();
 
   @Test
-  public void testProperties() throws Exception {
+  void testProperties() throws Exception {
     File sampleFile = getFileFromClasspath("readers/sampleI18n.properties");
     Map<String, String> result = ImmutableMap.copyOf(new PropertiesI18nReader().read(sampleFile));
     assertEquals(EXPECTED_MAP, result);
   }
 
   @Test
-  public void testXml() throws Exception {
+  void testXml() throws Exception {
     File sampleFile = getFileFromClasspath("readers/sampleI18n.xml");
     Map<String, String> result = ImmutableMap.copyOf(new XmlI18nReader().read(sampleFile));
     assertEquals(EXPECTED_MAP, result);
   }
 
   @Test
-  public void testJson() throws Exception {
+  void testJson() throws Exception {
     File sampleFile = getFileFromClasspath("readers/sampleI18n.json");
     Map<String, String> result = ImmutableMap.copyOf(new JsonI18nReader().read(sampleFile));
     assertEquals(EXPECTED_MAP, result);