move implementation to parsson repo,
see https://gitlab.eclipse.org/eclipsefdn/emo-team/emo/-/issues/34

Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/.travis.yml b/.travis.yml
index a8576a2..501f7b7 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -26,11 +26,4 @@
 
 script:
   - cd api
-  - mvn -U -C -Pstaging,oss-release -Dnon.final=true -Dgpg.skip=true clean install
-  - cd ..
-  - mvn -U -C -Pstaging,oss-release,all -Dnon.final=true -Dgpg.skip=true clean install
-  - cd tck
-  - mvn -U clean install
-  - cd ../impl-tck
-  - mvn -U clean test
-
+  - mvn -U -C -Pstaging,oss-release -Dgpg.skip=true clean install
diff --git a/README.md b/README.md
index 52567e1..0731a6c 100644
--- a/README.md
+++ b/README.md
@@ -17,7 +17,7 @@
 # Jakarta JSON Processing
 
 Jakarta JSON Processing provides portable APIs to parse, generate, transform, and query JSON documents.
-This project contains Jakarta JSON Processing specification, API and a compatible implementation.
+This project contains Jakarta JSON Processing specification, API and TCK.
 
 ## Build
 
@@ -32,8 +32,6 @@
 under the [Eclipse Public License (EPL) v2.0](https://projects.eclipse.org/license/epl-2.0)
 and [GNU General Public License (GPL) v2 with Classpath Exception](https://www.gnu.org/software/classpath/license.html);
 see the license information at the top of each source file.
-* The source code for the demo programs is licensed
-under the [Eclipse Distribution License (EDL) v1.0.](https://www.eclipse.org/org/documents/edl-v10.php).
 * The binary jar files published to the Maven repository are licensed
 under the same licenses as the corresponding source code;
 see the file `META-INF/LICENSE.txt` in each jar file.
@@ -47,9 +45,7 @@
 
 ## Links
 
-- [Jakarta JSON Processing official web site](https://eclipse-ee4j.github.io/jsonp)
 - [Jakarta JSON Processing @ Eclipse](https://projects.eclipse.org/projects/ee4j.jsonp)
-- [README.txt](https://github.com/eclipse-ee4j/jsonp/blob/master/bundles/ri/src/main/resources/README.txt)
 
 ## Contributing
 
diff --git a/bundles/jakarta.json/pom.xml b/bundles/jakarta.json/pom.xml
deleted file mode 100644
index 009f216..0000000
--- a/bundles/jakarta.json/pom.xml
+++ /dev/null
@@ -1,224 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>json-bundles</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.eclipse.jsonp</groupId>
-    <artifactId>jakarta.json</artifactId>
-    <version>2.0.2-SNAPSHOT</version>
-    <name>JSON-P Default Provider</name>
-    <description>Default provider for Jakarta JSON Processing</description>
-    <url>https://github.com/eclipse-ee4j/jsonp</url>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jsonp</groupId>
-            <artifactId>jsonp</artifactId>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-    <properties>
-        <dep.sources>${project.build.directory}/generated-sources/dependencies</dep.sources>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>unpack-sources</id>
-                        <phase>generate-sources</phase>
-                        <goals>
-                            <goal>unpack-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <includeScope>provided</includeScope>
-                            <classifier>sources</classifier>
-                            <excludeTransitive>true</excludeTransitive>
-                            <excludes>module-info.*,META-INF/services/**, META-INF/MANIFEST.MF</excludes>
-                            <outputDirectory>${dep.sources}</outputDirectory>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>add-resource</id>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>add-resource</goal>
-                        </goals>
-                        <configuration>
-                            <resources>
-                                <resource>
-                                    <directory>${dep.sources}</directory>
-                                    <excludes>
-                                        <exclude>**/*.java</exclude>
-                                    </excludes>
-                                </resource>
-                            </resources>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>add-source</id>
-                        <phase>generate-sources</phase>
-                        <goals>
-                            <goal>add-source</goal>
-                        </goals>
-                        <configuration>
-                            <sources>
-                                <source>${dep.sources}</source>
-                            </sources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-antrun-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>fix-default-provider</id>
-                        <phase>generate-sources</phase>
-                        <goals>
-                            <goal>run</goal>
-                        </goals>
-                        <configuration>
-                            <target>
-                                <replace file="${project.build.directory}/generated-sources/dependencies/jakarta/json/spi/JsonProvider.java">
-                                    <replacefilter>
-                                        <replacetoken><![CDATA[org.glassfish.json.JsonProviderImpl]]></replacetoken>
-                                        <replacevalue><![CDATA[org.eclipse.jsonp.JsonProviderImpl]]></replacevalue>
-                                    </replacefilter>
-                                </replace>
-                            </target>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.glassfish.build</groupId>
-                <artifactId>spec-version-maven-plugin</artifactId>
-                <configuration>
-                    <spec>
-                        <nonFinal>${non.final}</nonFinal>
-                        <jarType>impl</jarType>
-                        <specVersion>${spec_version}</specVersion>
-                        <newSpecVersion>${new_spec_version}</newSpecVersion>
-                        <specImplVersion>${new_spec_impl_version}</specImplVersion>
-                        <implVersion>${impl_version}</implVersion>
-                        <newImplVersion>${new_impl_version}</newImplVersion>
-                        <apiPackage>${api_package}</apiPackage>
-                        <implNamespace>${impl_namespace}</implNamespace>
-                    </spec>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>set-spec-properties</goal>
-                            <!-- TODO:
-                            glassfish-spec-version-maven-plugin needs to be updated
-                            in order to check 'jakarta.' prefixed values in manifest entries
-                            -->
-                            <!--<goal>check-module</goal>-->
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>osgi-manifest</id>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <Bundle-Version>${spec.bundle.version}</Bundle-Version>
-                                <Bundle-SymbolicName>${spec.bundle.symbolic-name}</Bundle-SymbolicName>
-                                <Extension-Name>${spec.extension.name}</Extension-Name>
-                                <Implementation-Version>${spec.implementation.version}</Implementation-Version>
-                                <Specification-Vendor>Eclipse Foundation</Specification-Vendor>
-                                <Specification-Version>${spec.specification.version}</Specification-Version>
-                                <Export-Package>!org.eclipse.jsonp,*</Export-Package>
-                            </instructions>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                        <manifest>
-                            <addDefaultEntries>false</addDefaultEntries>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <addDefaultEntries>false</addDefaultEntries>
-                        </manifest>
-                    </archive>
-                    <release>11</release>
-                    <notimestamp>true</notimestamp>
-                    <docfilessubdirs>true</docfilessubdirs>
-                    <description>JSON Processing API documentation</description>
-                    <doctitle>JSON Processing API documentation</doctitle>
-                    <windowtitle>JSON Processing API documentation</windowtitle>
-                    <header><![CDATA[<br>JSON Processing API v${project.version}]]></header>
-                    <bottom><![CDATA[
-Comments to: <a href="mailto:jsonp-dev@eclipse.org">jsonp-dev@eclipse.org</a>.<br>
-Copyright &#169; 2019, 2021 Eclipse Foundation. All rights reserved.<br>
-Use is subject to <a href="{@docRoot}/doc-files/speclicense.html" target="_top">license terms</a>.]]>
-                    </bottom>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/bundles/jakarta.json/src/main/java/module-info.java b/bundles/jakarta.json/src/main/java/module-info.java
deleted file mode 100644
index 2928317..0000000
--- a/bundles/jakarta.json/src/main/java/module-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-module jakarta.json {
-
-    exports jakarta.json;
-    exports jakarta.json.spi;
-    exports jakarta.json.stream;
-    exports org.eclipse.jsonp.api;
-
-    uses jakarta.json.spi.JsonProvider;
-}
diff --git a/bundles/jakarta.json/src/main/javadoc/doc-files/speclicense.html b/bundles/jakarta.json/src/main/javadoc/doc-files/speclicense.html
deleted file mode 100644
index ba29e5e..0000000
--- a/bundles/jakarta.json/src/main/javadoc/doc-files/speclicense.html
+++ /dev/null
@@ -1,72 +0,0 @@
-<html>
-<head>
-<title>Eclipse Foundation Specification License - v1.0</title>
-</head>
-<body>
-<h1>Eclipse Foundation Specification License - v1.0</h1>
-<p>By using and/or copying this document, or the Eclipse Foundation
-  document from which this statement is linked, you (the licensee) agree
-  that you have read, understood, and will comply with the following
-  terms and conditions:</p>
-
-<p>Permission to copy, and distribute the contents of this document, or
-  the Eclipse Foundation document from which this statement is linked, in
-  any medium for any purpose and without fee or royalty is hereby
-  granted, provided that you include the following on ALL copies of the
-  document, or portions thereof, that you use:</p>
-
-<ul>
-  <li> link or URL to the original Eclipse Foundation document.</li>
-  <li>All existing copyright notices, or if one does not exist, a notice
-      (hypertext is preferred, but a textual representation is permitted)
-      of the form: &quot;Copyright &copy; [$date-of-document]
-      &ldquo;Eclipse Foundation, Inc. &lt;&lt;url to this license&gt;&gt;
-      &quot;
-  </li>
-</ul>
-
-<p>Inclusion of the full text of this NOTICE must be provided. We
-  request that authorship attribution be provided in any software,
-  documents, or other items or products that you create pursuant to the
-  implementation of the contents of this document, or any portion
-  thereof.</p>
-
-<p>No right to create modifications or derivatives of Eclipse Foundation
-  documents is granted pursuant to this license, except anyone may
-  prepare and distribute derivative works and portions of this document
-  in software that implements the specification, in supporting materials
-  accompanying such software, and in documentation of such software,
-  PROVIDED that all such works include the notice below. HOWEVER, the
-  publication of derivative works of this document for use as a technical
-  specification is expressly prohibited.</p>
-
-<p>The notice is:</p>
-
-<p>&quot;Copyright &copy; 2018 Eclipse Foundation. This software or
-  document includes material copied from or derived from [title and URI
-  of the Eclipse Foundation specification document].&quot;</p>
-
-<h2>Disclaimers</h2>
-
-<p>THIS DOCUMENT IS PROVIDED &quot;AS IS,&quot; AND THE COPYRIGHT
-  HOLDERS AND THE ECLIPSE FOUNDATION MAKE NO REPRESENTATIONS OR
-  WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-  WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
-  NON-INFRINGEMENT, OR TITLE; THAT THE CONTENTS OF THE DOCUMENT ARE
-  SUITABLE FOR ANY PURPOSE; NOR THAT THE IMPLEMENTATION OF SUCH CONTENTS
-  WILL NOT INFRINGE ANY THIRD PARTY PATENTS, COPYRIGHTS, TRADEMARKS OR
-  OTHER RIGHTS.</p>
-
-<p>THE COPYRIGHT HOLDERS AND THE ECLIPSE FOUNDATION WILL NOT BE LIABLE
-  FOR ANY DIRECT, INDIRECT, SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT
-  OF ANY USE OF THE DOCUMENT OR THE PERFORMANCE OR IMPLEMENTATION OF THE
-  CONTENTS THEREOF.</p>
-
-<p>The name and trademarks of the copyright holders or the Eclipse
-  Foundation may NOT be used in advertising or publicity pertaining to
-  this document or its contents without specific, written prior
-  permission. Title to copyright in this document will at all times
-  remain with copyright holders.</p>
-
-</body>
-</html>
diff --git a/bundles/jakarta.json/src/main/javadoc/overview.html b/bundles/jakarta.json/src/main/javadoc/overview.html
deleted file mode 100644
index 2b82208..0000000
--- a/bundles/jakarta.json/src/main/javadoc/overview.html
+++ /dev/null
@@ -1,108 +0,0 @@
-<html>
-<!--
-
-    Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<body>
-Jakarta JSON Processing provides portable APIs to parse,
-generate, transform, and query <a href="http://json.org/">JSON</a> using the
-streaming API or the object model API.
-
-<p>The Streaming API provides a way to parsing and generation of JSON in a
-streaming fashion. It hands over parsing and generation control to the
-programmer. The streaming API provides an event-based parser and allows an
-application developer to ask for the next event rather than handling the event
-in a callback. This gives a developer more procedural control over
-the processing of the JSON. Application code can process or discard
-the parser event, and ask for the next event(pull the event). The
-streaming model is adequate for local processing where random access of other
-parts of the data is not required. Similarly, the streaming API provides
-a way to generate well-formed JSON to a stream by writing one event at a time.
-
-<p>The object model API creates a random access tree-like structure that
-represents the JSON data in memory. The tree can then be navigated and
-queried. This programming model is the most flexible and enables processing
-that requires random access to the complete contents of the tree. However,
-it is often not as efficient as the streaming model and requires more memory.
-The object model generates JSON output by navigating the entire tree at once.
-
-<h1>The Streaming API</h1>
-<p>The streaming API is similar to the StAX API for XML and consists of the
-interfaces {@link jakarta.json.stream.JsonParser} and
-{@link jakarta.json.stream.JsonGenerator}. {@code JsonParser}
-contains methods to parse JSON data using the streaming model.
-{@code JsonGenerator} contains methods to write JSON data to an ouptut source.
-
-<p>{@code JsonParser} provides forward, read-only access to
-JSON data using the pull parsing programming model. In this model the
-application code controls the thread and calls methods in the parser interface
-to move the parser forward or to obtain JSON data from the current state of
-the parser. Refer to
-<a href="jakarta.json/jakarta/json/stream/JsonParser.html#JsonParserExample2">this example</a>
-for more details.
-
-<p>{@code JsonGenerator} provides methods to write JSON to a stream. The
-generator writes name/value pairs in JSON objects and values in JSON arrays.
-Refer to
-<a href="jakarta.json/jakarta/json/stream/JsonGenerator.html#JsonGeneratorExample3">this
-example</a> for more details.
-
-<p>The streaming API is a low-level API designed to process large amounts of
-JSON data efficiently. Other JSON frameworks (such as JSON binding) can be
-implemented using this API.</p>
-
-<h1>The Object Model API</h1>
-<p>The object model API is similar to the DOM API for XML. It is a high-level
-API that provides immutable object models for JSON object and array structures.
-These JSON structures are represented as object models using the Java types
-{@link jakarta.json.JsonObject} and {@link jakarta.json.JsonArray}.
-{@code JsonObject} provides a {@link java.util.Map} view to access the unordered
-collection of zero or more name/value pairs from the model. Similarly,
-{@code JsonArray} provides a {@link java.util.List} view to access the ordered
-sequence of zero or more values from the model.
-
-<p>The object model API uses builder patterns to create these object models.
-Application code can use the interface {@link jakarta.json.JsonObjectBuilder}
-to create models that represent JSON objects. The resulting model is of type
-{@code JsonObject}. Refer to
-<a href="jakarta.json/jakarta/json/JsonObjectBuilder.html#JsonObjectBuilderExample1">this example</a>
-for more details. Application code can use the interface
-{@link jakarta.json.JsonArrayBuilder} to create models that represent JSON arrays.
-The resulting model is of type {@code JsonArray}. Refer to
-<a href="jakarta.json/jakarta/json/JsonArrayBuilder.html#JsonArrayBuilderExample1">this example</a>
-for more details.
-
-<p>These object models can also be created from an input source (such as
-{@link java.io.InputStream} or {@link java.io.Reader}) using the interface
-{@link jakarta.json.JsonReader}.
-<a href="jakarta.json/jakarta/json/JsonReader.html#JsonReaderExample1">This example</a> shows
-how to read and create an empty {@code JsonArray} model using the interface
-{@code JsonReader}. Similarly, these object models can be written to an output
-source (such as {@link java.io.OutputStream} or {@link java.io.Writer}) using
-the class {@link jakarta.json.JsonWriter}.
-<a href="jakarta.json/jakarta/json/JsonWriter.html#JsonWriterExample1">This example</a> shows
-how to write an empty {@code JsonObject} model using the interface
-{@code JsonWriter}.
-
-<h1>JSON Pointer, JSON Patch, and JSON Merge Patch</h1>
-Jakarta JSON Processing supports the latest standard on
-<a href="http://tools.ietf.org/html/rfc6901">JSON Pointer</a>,
-<a Href="http://tools.ietf.org/html/rfc6902">JSON Patch</a>, and
-<a Href="http://tools.ietf.org/html/rfc7396">JSON Merge Patch</a>.
-
-</body>
-</html>
diff --git a/bundles/pom.xml b/bundles/pom.xml
deleted file mode 100644
index 3b41f66..0000000
--- a/bundles/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>json</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.eclipse.jsonp</groupId>
-    <artifactId>json-bundles</artifactId>
-    <packaging>pom</packaging>
-    <name>Jakarta JSON Processing bundles</name>
-    <description>Jakarta JSON Processing bundles</description>
-    <url>https://github.com/eclipse-ee4j/jsonp</url>
-
-    <modules>
-        <module>jakarta.json</module>
-        <module>ri</module>
-    </modules>
-</project>
diff --git a/bundles/ri/pom.xml b/bundles/ri/pom.xml
deleted file mode 100755
index d6e98a4..0000000
--- a/bundles/ri/pom.xml
+++ /dev/null
@@ -1,98 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>json-bundles</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-    </parent>
-
-    <artifactId>jakarta.json-ri</artifactId>
-    <name>RI Distribution zip bundle</name>
-    <packaging>pom</packaging>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jsonp</groupId>
-            <artifactId>jsonp</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jsonp</groupId>
-            <artifactId>jakarta.json</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jsonp</groupId>
-            <artifactId>jsonp-jaxrs</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <artifactId>maven-assembly-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>make-assembly</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>single</goal>
-                        </goals>
-                        <configuration>
-                            <descriptors>
-                                <descriptor>src/main/assembly/archive.xml</descriptor>
-                            </descriptors>
-                            <appendAssemblyId>false</appendAssemblyId>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>stage</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>unpack</goal>
-                        </goals>
-                        <configuration>
-                            <excludes>**/module-info.java</excludes>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>${project.artifactId}</artifactId>
-                                    <version>${project.version}</version>
-                                    <type>zip</type>
-                                    <outputDirectory>${project.build.directory}/stage</outputDirectory>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/bundles/ri/src/main/assembly/archive.xml b/bundles/ri/src/main/assembly/archive.xml
deleted file mode 100755
index d73b28e..0000000
--- a/bundles/ri/src/main/assembly/archive.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-
-    Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<assembly>
-    <id>dist</id>
-    <formats>
-        <format>zip</format>
-    </formats>
-    <files>
-        <file>
-            <source>src/main/resources/README.txt</source>
-            <outputDirectory></outputDirectory>
-            <filtered>true</filtered>
-        </file>
-        <file>
-            <source>src/main/resources/LICENSE.md</source>
-            <outputDirectory></outputDirectory>
-        </file>
-    </files>
-    <dependencySets>
-        <dependencySet>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputDirectory>mods</outputDirectory>
-            <includes>
-                <include>jakarta.json:jakarta.json-api:*</include>
-                <include>org.eclipse.jsonp:jsonp:*</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputDirectory>standalone</outputDirectory>
-            <includes>
-                <include>org.eclipse.jsonp:jakarta.json:*</include>
-            </includes>
-        </dependencySet>
-        <dependencySet>
-            <useProjectArtifact>false</useProjectArtifact>
-            <outputDirectory>jaxrs</outputDirectory>
-            <includes>
-                <include>org.eclipse.jsonp:jsonp-jaxrs*</include>
-            </includes>
-        </dependencySet>
-    </dependencySets>
-</assembly>
diff --git a/bundles/ri/src/main/resources/LICENSE.md b/bundles/ri/src/main/resources/LICENSE.md
deleted file mode 100644
index 5de3d1b..0000000
--- a/bundles/ri/src/main/resources/LICENSE.md
+++ /dev/null
@@ -1,637 +0,0 @@
-# Eclipse Public License - v 2.0
-
-        THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
-        PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION
-        OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
-
-    1. DEFINITIONS
-
-    "Contribution" means:
-
-      a) in the case of the initial Contributor, the initial content
-         Distributed under this Agreement, and
-
-      b) in the case of each subsequent Contributor: 
-         i) changes to the Program, and 
-         ii) additions to the Program;
-      where such changes and/or additions to the Program originate from
-      and are Distributed by that particular Contributor. A Contribution
-      "originates" from a Contributor if it was added to the Program by
-      such Contributor itself or anyone acting on such Contributor's behalf.
-      Contributions do not include changes or additions to the Program that
-      are not Modified Works.
-
-    "Contributor" means any person or entity that Distributes the Program.
-
-    "Licensed Patents" mean patent claims licensable by a Contributor which
-    are necessarily infringed by the use or sale of its Contribution alone
-    or when combined with the Program.
-
-    "Program" means the Contributions Distributed in accordance with this
-    Agreement.
-
-    "Recipient" means anyone who receives the Program under this Agreement
-    or any Secondary License (as applicable), including Contributors.
-
-    "Derivative Works" shall mean any work, whether in Source Code or other
-    form, that is based on (or derived from) the Program and for which the
-    editorial revisions, annotations, elaborations, or other modifications
-    represent, as a whole, an original work of authorship.
-
-    "Modified Works" shall mean any work in Source Code or other form that
-    results from an addition to, deletion from, or modification of the
-    contents of the Program, including, for purposes of clarity any new file
-    in Source Code form that contains any contents of the Program. Modified
-    Works shall not include works that contain only declarations,
-    interfaces, types, classes, structures, or files of the Program solely
-    in each case in order to link to, bind by name, or subclass the Program
-    or Modified Works thereof.
-
-    "Distribute" means the acts of a) distributing or b) making available
-    in any manner that enables the transfer of a copy.
-
-    "Source Code" means the form of a Program preferred for making
-    modifications, including but not limited to software source code,
-    documentation source, and configuration files.
-
-    "Secondary License" means either the GNU General Public License,
-    Version 2.0, or any later versions of that license, including any
-    exceptions or additional permissions as identified by the initial
-    Contributor.
-
-    2. GRANT OF RIGHTS
-
-      a) Subject to the terms of this Agreement, each Contributor hereby
-      grants Recipient a non-exclusive, worldwide, royalty-free copyright
-      license to reproduce, prepare Derivative Works of, publicly display,
-      publicly perform, Distribute and sublicense the Contribution of such
-      Contributor, if any, and such Derivative Works.
-
-      b) Subject to the terms of this Agreement, each Contributor hereby
-      grants Recipient a non-exclusive, worldwide, royalty-free patent
-      license under Licensed Patents to make, use, sell, offer to sell,
-      import and otherwise transfer the Contribution of such Contributor,
-      if any, in Source Code or other form. This patent license shall
-      apply to the combination of the Contribution and the Program if, at
-      the time the Contribution is added by the Contributor, such addition
-      of the Contribution causes such combination to be covered by the
-      Licensed Patents. The patent license shall not apply to any other
-      combinations which include the Contribution. No hardware per se is
-      licensed hereunder.
-
-      c) Recipient understands that although each Contributor grants the
-      licenses to its Contributions set forth herein, no assurances are
-      provided by any Contributor that the Program does not infringe the
-      patent or other intellectual property rights of any other entity.
-      Each Contributor disclaims any liability to Recipient for claims
-      brought by any other entity based on infringement of intellectual
-      property rights or otherwise. As a condition to exercising the
-      rights and licenses granted hereunder, each Recipient hereby
-      assumes sole responsibility to secure any other intellectual
-      property rights needed, if any. For example, if a third party
-      patent license is required to allow Recipient to Distribute the
-      Program, it is Recipient's responsibility to acquire that license
-      before distributing the Program.
-
-      d) Each Contributor represents that to its knowledge it has
-      sufficient copyright rights in its Contribution, if any, to grant
-      the copyright license set forth in this Agreement.
-
-      e) Notwithstanding the terms of any Secondary License, no
-      Contributor makes additional grants to any Recipient (other than
-      those set forth in this Agreement) as a result of such Recipient's
-      receipt of the Program under the terms of a Secondary License
-      (if permitted under the terms of Section 3).
-
-    3. REQUIREMENTS
-
-    3.1 If a Contributor Distributes the Program in any form, then:
-
-      a) the Program must also be made available as Source Code, in
-      accordance with section 3.2, and the Contributor must accompany
-      the Program with a statement that the Source Code for the Program
-      is available under this Agreement, and informs Recipients how to
-      obtain it in a reasonable manner on or through a medium customarily
-      used for software exchange; and
-
-      b) the Contributor may Distribute the Program under a license
-      different than this Agreement, provided that such license:
-         i) effectively disclaims on behalf of all other Contributors all
-         warranties and conditions, express and implied, including
-         warranties or conditions of title and non-infringement, and
-         implied warranties or conditions of merchantability and fitness
-         for a particular purpose;
-
-         ii) effectively excludes on behalf of all other Contributors all
-         liability for damages, including direct, indirect, special,
-         incidental and consequential damages, such as lost profits;
-
-         iii) does not attempt to limit or alter the recipients' rights
-         in the Source Code under section 3.2; and
-
-         iv) requires any subsequent distribution of the Program by any
-         party to be under a license that satisfies the requirements
-         of this section 3.
-
-    3.2 When the Program is Distributed as Source Code:
-
-      a) it must be made available under this Agreement, or if the
-      Program (i) is combined with other material in a separate file or
-      files made available under a Secondary License, and (ii) the initial
-      Contributor attached to the Source Code the notice described in
-      Exhibit A of this Agreement, then the Program may be made available
-      under the terms of such Secondary Licenses, and
-
-      b) a copy of this Agreement must be included with each copy of
-      the Program.
-
-    3.3 Contributors may not remove or alter any copyright, patent,
-    trademark, attribution notices, disclaimers of warranty, or limitations
-    of liability ("notices") contained within the Program from any copy of
-    the Program which they Distribute, provided that Contributors may add
-    their own appropriate notices.
-
-    4. COMMERCIAL DISTRIBUTION
-
-    Commercial distributors of software may accept certain responsibilities
-    with respect to end users, business partners and the like. While this
-    license is intended to facilitate the commercial use of the Program,
-    the Contributor who includes the Program in a commercial product
-    offering should do so in a manner which does not create potential
-    liability for other Contributors. Therefore, if a Contributor includes
-    the Program in a commercial product offering, such Contributor
-    ("Commercial Contributor") hereby agrees to defend and indemnify every
-    other Contributor ("Indemnified Contributor") against any losses,
-    damages and costs (collectively "Losses") arising from claims, lawsuits
-    and other legal actions brought by a third party against the Indemnified
-    Contributor to the extent caused by the acts or omissions of such
-    Commercial Contributor in connection with its distribution of the Program
-    in a commercial product offering. The obligations in this section do not
-    apply to any claims or Losses relating to any actual or alleged
-    intellectual property infringement. In order to qualify, an Indemnified
-    Contributor must: a) promptly notify the Commercial Contributor in
-    writing of such claim, and b) allow the Commercial Contributor to control,
-    and cooperate with the Commercial Contributor in, the defense and any
-    related settlement negotiations. The Indemnified Contributor may
-    participate in any such claim at its own expense.
-
-    For example, a Contributor might include the Program in a commercial
-    product offering, Product X. That Contributor is then a Commercial
-    Contributor. If that Commercial Contributor then makes performance
-    claims, or offers warranties related to Product X, those performance
-    claims and warranties are such Commercial Contributor's responsibility
-    alone. Under this section, the Commercial Contributor would have to
-    defend claims against the other Contributors related to those performance
-    claims and warranties, and if a court requires any other Contributor to
-    pay any damages as a result, the Commercial Contributor must pay
-    those damages.
-
-    5. NO WARRANTY
-
-    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
-    PERMITTED BY APPLICABLE LAW, THE PROGRAM IS PROVIDED 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. Each Recipient is solely responsible for determining the
-    appropriateness of using and distributing the Program and assumes all
-    risks associated with its exercise of rights under this Agreement,
-    including but not limited to the risks and costs of program errors,
-    compliance with applicable laws, damage to or loss of data, programs
-    or equipment, and unavailability or interruption of operations.
-
-    6. DISCLAIMER OF LIABILITY
-
-    EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT
-    PERMITTED BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS
-    SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
-    PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
-    CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
-    ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE
-    EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE
-    POSSIBILITY OF SUCH DAMAGES.
-
-    7. GENERAL
-
-    If any provision of this Agreement is invalid or unenforceable under
-    applicable law, it shall not affect the validity or enforceability of
-    the remainder of the terms of this Agreement, and without further
-    action by the parties hereto, such provision shall be reformed to the
-    minimum extent necessary to make such provision valid and enforceable.
-
-    If Recipient institutes patent litigation against any entity
-    (including a cross-claim or counterclaim in a lawsuit) alleging that the
-    Program itself (excluding combinations of the Program with other software
-    or hardware) infringes such Recipient's patent(s), then such Recipient's
-    rights granted under Section 2(b) shall terminate as of the date such
-    litigation is filed.
-
-    All Recipient's rights under this Agreement shall terminate if it
-    fails to comply with any of the material terms or conditions of this
-    Agreement and does not cure such failure in a reasonable period of
-    time after becoming aware of such noncompliance. If all Recipient's
-    rights under this Agreement terminate, Recipient agrees to cease use
-    and distribution of the Program as soon as reasonably practicable.
-    However, Recipient's obligations under this Agreement and any licenses
-    granted by Recipient relating to the Program shall continue and survive.
-
-    Everyone is permitted to copy and distribute copies of this Agreement,
-    but in order to avoid inconsistency the Agreement is copyrighted and
-    may only be modified in the following manner. The Agreement Steward
-    reserves the right to publish new versions (including revisions) of
-    this Agreement from time to time. No one other than the Agreement
-    Steward has the right to modify this Agreement. The Eclipse Foundation
-    is the initial Agreement Steward. The Eclipse Foundation may assign the
-    responsibility to serve as the Agreement Steward to a suitable separate
-    entity. Each new version of the Agreement will be given a distinguishing
-    version number. The Program (including Contributions) may always be
-    Distributed subject to the version of the Agreement under which it was
-    received. In addition, after a new version of the Agreement is published,
-    Contributor may elect to Distribute the Program (including its
-    Contributions) under the new version.
-
-    Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
-    receives no rights or licenses to the intellectual property of any
-    Contributor under this Agreement, whether expressly, by implication,
-    estoppel or otherwise. All rights in the Program not expressly granted
-    under this Agreement are reserved. Nothing in this Agreement is intended
-    to be enforceable by any entity that is not a Contributor or Recipient.
-    No third-party beneficiary rights are created under this Agreement.
-
-    Exhibit A - Form of Secondary Licenses Notice
-
-    "This Source Code may also be made available under the following 
-    Secondary Licenses when the conditions for such availability set forth 
-    in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
-    version(s), and exceptions or additional permissions here}."
-
-      Simply including a copy of this Agreement, including this Exhibit A
-      is not sufficient to license the Source Code under Secondary Licenses.
-
-      If it is not possible or desirable to put the notice in a particular
-      file, then You may include the notice in a location (such as a LICENSE
-      file in a relevant directory) where a recipient would be likely to
-      look for such a notice.
-
-      You may add additional accurate notices of copyright ownership.
-
----
-
-##    The GNU General Public License (GPL) Version 2, June 1991
-
-    Copyright (C) 1989, 1991 Free Software Foundation, Inc.
-    51 Franklin Street, Fifth Floor
-    Boston, MA 02110-1335
-    USA
-
-    Everyone is permitted to copy and distribute verbatim copies
-    of this license document, but changing it is not allowed.
-
-    Preamble
-
-    The licenses for most software are designed to take away your freedom to
-    share and change it. By contrast, the GNU General Public License is
-    intended to guarantee your freedom to share and change free software--to
-    make sure the software is free for all its users. This General Public
-    License applies to most of the Free Software Foundation's software and
-    to any other program whose authors commit to using it. (Some other Free
-    Software Foundation software is covered by the GNU Library General
-    Public License instead.) You can apply it to your programs, too.
-
-    When we speak of free software, we are referring to freedom, not price.
-    Our General Public Licenses are designed to make sure that you have the
-    freedom to distribute copies of free software (and charge for this
-    service if you wish), that you receive source code or can get it if you
-    want it, that you can change the software or use pieces of it in new
-    free programs; and that you know you can do these things.
-
-    To protect your rights, we need to make restrictions that forbid anyone
-    to deny you these rights or to ask you to surrender the rights. These
-    restrictions translate to certain responsibilities for you if you
-    distribute copies of the software, or if you modify it.
-
-    For example, if you distribute copies of such a program, whether gratis
-    or for a fee, you must give the recipients all the rights that you have.
-    You must make sure that they, too, receive or can get the source code.
-    And you must show them these terms so they know their rights.
-
-    We protect your rights with two steps: (1) copyright the software, and
-    (2) offer you this license which gives you legal permission to copy,
-    distribute and/or modify the software.
-
-    Also, for each author's protection and ours, we want to make certain
-    that everyone understands that there is no warranty for this free
-    software. If the software is modified by someone else and passed on, we
-    want its recipients to know that what they have is not the original, so
-    that any problems introduced by others will not reflect on the original
-    authors' reputations.
-
-    Finally, any free program is threatened constantly by software patents.
-    We wish to avoid the danger that redistributors of a free program will
-    individually obtain patent licenses, in effect making the program
-    proprietary. To prevent this, we have made it clear that any patent must
-    be licensed for everyone's free use or not licensed at all.
-
-    The precise terms and conditions for copying, distribution and
-    modification follow.
-
-    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
-    0. This License applies to any program or other work which contains a
-    notice placed by the copyright holder saying it may be distributed under
-    the terms of this General Public License. The "Program", below, refers
-    to any such program or work, and a "work based on the Program" means
-    either the Program or any derivative work under copyright law: that is
-    to say, a work containing the Program or a portion of it, either
-    verbatim or with modifications and/or translated into another language.
-    (Hereinafter, translation is included without limitation in the term
-    "modification".) Each licensee is addressed as "you".
-
-    Activities other than copying, distribution and modification are not
-    covered by this License; they are outside its scope. The act of running
-    the Program is not restricted, and the output from the Program is
-    covered only if its contents constitute a work based on the Program
-    (independent of having been made by running the Program). Whether that
-    is true depends on what the Program does.
-
-    1. You may copy and distribute verbatim copies of the Program's source
-    code as you receive it, in any medium, provided that you conspicuously
-    and appropriately publish on each copy an appropriate copyright notice
-    and disclaimer of warranty; keep intact all the notices that refer to
-    this License and to the absence of any warranty; and give any other
-    recipients of the Program a copy of this License along with the Program.
-
-    You may charge a fee for the physical act of transferring a copy, and
-    you may at your option offer warranty protection in exchange for a fee.
-
-    2. You may modify your copy or copies of the Program or any portion of
-    it, thus forming a work based on the Program, and copy and distribute
-    such modifications or work under the terms of Section 1 above, provided
-    that you also meet all of these conditions:
-
-        a) You must cause the modified files to carry prominent notices
-        stating that you changed the files and the date of any change.
-
-        b) You must cause any work that you distribute or publish, that in
-        whole or in part contains or is derived from the Program or any part
-        thereof, to be licensed as a whole at no charge to all third parties
-        under the terms of this License.
-
-        c) If the modified program normally reads commands interactively
-        when run, you must cause it, when started running for such
-        interactive use in the most ordinary way, to print or display an
-        announcement including an appropriate copyright notice and a notice
-        that there is no warranty (or else, saying that you provide a
-        warranty) and that users may redistribute the program under these
-        conditions, and telling the user how to view a copy of this License.
-        (Exception: if the Program itself is interactive but does not
-        normally print such an announcement, your work based on the Program
-        is not required to print an announcement.)
-
-    These requirements apply to the modified work as a whole. If
-    identifiable sections of that work are not derived from the Program, and
-    can be reasonably considered independent and separate works in
-    themselves, then this License, and its terms, do not apply to those
-    sections when you distribute them as separate works. But when you
-    distribute the same sections as part of a whole which is a work based on
-    the Program, the distribution of the whole must be on the terms of this
-    License, whose permissions for other licensees extend to the entire
-    whole, and thus to each and every part regardless of who wrote it.
-
-    Thus, it is not the intent of this section to claim rights or contest
-    your rights to work written entirely by you; rather, the intent is to
-    exercise the right to control the distribution of derivative or
-    collective works based on the Program.
-
-    In addition, mere aggregation of another work not based on the Program
-    with the Program (or with a work based on the Program) on a volume of a
-    storage or distribution medium does not bring the other work under the
-    scope of this License.
-
-    3. You may copy and distribute the Program (or a work based on it,
-    under Section 2) in object code or executable form under the terms of
-    Sections 1 and 2 above provided that you also do one of the following:
-
-        a) Accompany it with the complete corresponding machine-readable
-        source code, which must be distributed under the terms of Sections 1
-        and 2 above on a medium customarily used for software interchange; or,
-
-        b) Accompany it with a written offer, valid for at least three
-        years, to give any third party, for a charge no more than your cost
-        of physically performing source distribution, a complete
-        machine-readable copy of the corresponding source code, to be
-        distributed under the terms of Sections 1 and 2 above on a medium
-        customarily used for software interchange; or,
-
-        c) Accompany it with the information you received as to the offer to
-        distribute corresponding source code. (This alternative is allowed
-        only for noncommercial distribution and only if you received the
-        program in object code or executable form with such an offer, in
-        accord with Subsection b above.)
-
-    The source code for a work means the preferred form of the work for
-    making modifications to it. For an executable work, complete source code
-    means all the source code for all modules it contains, plus any
-    associated interface definition files, plus the scripts used to control
-    compilation and installation of the executable. However, as a special
-    exception, the source code distributed need not include anything that is
-    normally distributed (in either source or binary form) with the major
-    components (compiler, kernel, and so on) of the operating system on
-    which the executable runs, unless that component itself accompanies the
-    executable.
-
-    If distribution of executable or object code is made by offering access
-    to copy from a designated place, then offering equivalent access to copy
-    the source code from the same place counts as distribution of the source
-    code, even though third parties are not compelled to copy the source
-    along with the object code.
-
-    4. You may not copy, modify, sublicense, or distribute the Program
-    except as expressly provided under this License. Any attempt otherwise
-    to copy, modify, sublicense or distribute the Program is void, and will
-    automatically terminate your rights under this License. However, parties
-    who have received copies, or rights, from you under this License will
-    not have their licenses terminated so long as such parties remain in
-    full compliance.
-
-    5. You are not required to accept this License, since you have not
-    signed it. However, nothing else grants you permission to modify or
-    distribute the Program or its derivative works. These actions are
-    prohibited by law if you do not accept this License. Therefore, by
-    modifying or distributing the Program (or any work based on the
-    Program), you indicate your acceptance of this License to do so, and all
-    its terms and conditions for copying, distributing or modifying the
-    Program or works based on it.
-
-    6. Each time you redistribute the Program (or any work based on the
-    Program), the recipient automatically receives a license from the
-    original licensor to copy, distribute or modify the Program subject to
-    these terms and conditions. You may not impose any further restrictions
-    on the recipients' exercise of the rights granted herein. You are not
-    responsible for enforcing compliance by third parties to this License.
-
-    7. If, as a consequence of a court judgment or allegation of patent
-    infringement or for any other reason (not limited to patent issues),
-    conditions are imposed on you (whether by court order, agreement or
-    otherwise) that contradict the conditions of this License, they do not
-    excuse you from the conditions of this License. If you cannot distribute
-    so as to satisfy simultaneously your obligations under this License and
-    any other pertinent obligations, then as a consequence you may not
-    distribute the Program at all. For example, if a patent license would
-    not permit royalty-free redistribution of the Program by all those who
-    receive copies directly or indirectly through you, then the only way you
-    could satisfy both it and this License would be to refrain entirely from
-    distribution of the Program.
-
-    If any portion of this section is held invalid or unenforceable under
-    any particular circumstance, the balance of the section is intended to
-    apply and the section as a whole is intended to apply in other
-    circumstances.
-
-    It is not the purpose of this section to induce you to infringe any
-    patents or other property right claims or to contest validity of any
-    such claims; this section has the sole purpose of protecting the
-    integrity of the free software distribution system, which is implemented
-    by public license practices. Many people have made generous
-    contributions to the wide range of software distributed through that
-    system in reliance on consistent application of that system; it is up to
-    the author/donor to decide if he or she is willing to distribute
-    software through any other system and a licensee cannot impose that choice.
-
-    This section is intended to make thoroughly clear what is believed to be
-    a consequence of the rest of this License.
-
-    8. If the distribution and/or use of the Program is restricted in
-    certain countries either by patents or by copyrighted interfaces, the
-    original copyright holder who places the Program under this License may
-    add an explicit geographical distribution limitation excluding those
-    countries, so that distribution is permitted only in or among countries
-    not thus excluded. In such case, this License incorporates the
-    limitation as if written in the body of this License.
-
-    9. The Free Software Foundation may publish revised and/or new
-    versions of the General Public License from time to time. Such new
-    versions will be similar in spirit to the present version, but may
-    differ in detail to address new problems or concerns.
-
-    Each version is given a distinguishing version number. If the Program
-    specifies a version number of this License which applies to it and "any
-    later version", you have the option of following the terms and
-    conditions either of that version or of any later version published by
-    the Free Software Foundation. If the Program does not specify a version
-    number of this License, you may choose any version ever published by the
-    Free Software Foundation.
-
-    10. If you wish to incorporate parts of the Program into other free
-    programs whose distribution conditions are different, write to the
-    author to ask for permission. For software which is copyrighted by the
-    Free Software Foundation, write to the Free Software Foundation; we
-    sometimes make exceptions for this. Our decision will be guided by the
-    two goals of preserving the free status of all derivatives of our free
-    software and of promoting the sharing and reuse of software generally.
-
-    NO WARRANTY
-
-    11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
-    WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
-    EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
-    OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND,
-    EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-    WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
-    ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH
-    YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
-    NECESSARY SERVICING, REPAIR OR CORRECTION.
-
-    12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
-    WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
-    AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR
-    DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL
-    DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM
-    (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED
-    INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF
-    THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR
-    OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
-
-    END OF TERMS AND CONDITIONS
-
-    How to Apply These Terms to Your New Programs
-
-    If you develop a new program, and you want it to be of the greatest
-    possible use to the public, the best way to achieve this is to make it
-    free software which everyone can redistribute and change under these terms.
-
-    To do so, attach the following notices to the program. It is safest to
-    attach them to the start of each source file to most effectively convey
-    the exclusion of warranty; and each file should have at least the
-    "copyright" line and a pointer to where the full notice is found.
-
-        One line to give the program's name and a brief idea of what it does.
-        Copyright (C) <year> <name of author>
-
-        This program is free software; you can redistribute it and/or modify
-        it under the terms of the GNU General Public License as published by
-        the Free Software Foundation; either version 2 of the License, or
-        (at your option) any later version.
-
-        This program is distributed in the hope that it will be useful, but
-        WITHOUT ANY WARRANTY; without even the implied warranty of
-        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
-        General Public License for more details.
-
-        You should have received a copy of the GNU General Public License
-        along with this program; if not, write to the Free Software
-        Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335 USA
-
-    Also add information on how to contact you by electronic and paper mail.
-
-    If the program is interactive, make it output a short notice like this
-    when it starts in an interactive mode:
-
-        Gnomovision version 69, Copyright (C) year name of author
-        Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type
-        `show w'. This is free software, and you are welcome to redistribute
-        it under certain conditions; type `show c' for details.
-
-    The hypothetical commands `show w' and `show c' should show the
-    appropriate parts of the General Public License. Of course, the commands
-    you use may be called something other than `show w' and `show c'; they
-    could even be mouse-clicks or menu items--whatever suits your program.
-
-    You should also get your employer (if you work as a programmer) or your
-    school, if any, to sign a "copyright disclaimer" for the program, if
-    necessary. Here is a sample; alter the names:
-
-        Yoyodyne, Inc., hereby disclaims all copyright interest in the
-        program `Gnomovision' (which makes passes at compilers) written by
-        James Hacker.
-
-        signature of Ty Coon, 1 April 1989
-        Ty Coon, President of Vice
-
-    This General Public License does not permit incorporating your program
-    into proprietary programs. If your program is a subroutine library, you
-    may consider it more useful to permit linking proprietary applications
-    with the library. If this is what you want to do, use the GNU Library
-    General Public License instead of this License.
-
----
-
-## CLASSPATH EXCEPTION
-
-    Linking this library statically or dynamically with other modules is
-    making a combined work based on this library.  Thus, the terms and
-    conditions of the GNU General Public License version 2 cover the whole
-    combination.
-
-    As a special exception, the copyright holders of this library give you
-    permission to link this library with independent modules to produce an
-    executable, regardless of the license terms of these independent
-    modules, and to copy and distribute the resulting executable under
-    terms of your choice, provided that you also meet, for each linked
-    independent module, the terms and conditions of the license of that
-    module.  An independent module is a module which is not derived from or
-    based on this library.  If you modify this library, you may extend this
-    exception to your version of the library, but you are not obligated to
-    do so.  If you do not wish to do so, delete this exception statement
-    from your version.
diff --git a/bundles/ri/src/main/resources/README.txt b/bundles/ri/src/main/resources/README.txt
deleted file mode 100644
index 8843418..0000000
--- a/bundles/ri/src/main/resources/README.txt
+++ /dev/null
@@ -1,51 +0,0 @@
-For running on JPMS, following modules are provided:
-* mods/jakarta.json-api-${project.version}.jar - 'jakarta.json' module containing only API classes
-* mods/jsonp-${project.version}.jar - 'org.eclipse.jsonp' module containing implementation
-
-Integration with Jakarta RESTful Web Services:
-* jaxrs/jsonp-jaxrs-${project.version}.jar
-
-* standalone/jakarta.json-${project.version}.jar - 'jakarta.json' module containing API classes and implementation, which serves as a fallback for environments
-willing to support different implementations of Jakarta JSON Processing API while also providing some default implementation, such as application servers.
-When this library is used, then Eclipse JSONP is the default implementation being provided.
-
-NOTE: jakarta.json-api.jar and jakarta.json.jar CAN NOT co-exist together when running on JPMS. One can be used as a drop-in
-replacement of the other wrt Jakarta JSON Processing API.
-
-IMPORTANT NOTE: module names are not yet final and may change in the future releases
-
-
-* If you are running with maven, you can use the following maven coordinates:
-
-for the implementation:
-  <dependency>
-      <groupId>org.eclipse.jsonp</groupId>
-      <artifactId>jsonp</artifactId>
-      <version>${project.version}</version>
-  </dependency>
-
-for APIs:
-  <dependency>
-      <groupId>jakarta.json</groupId>
-      <artifactId>jakarta.json-api</artifactId>
-      <version>${api.version}</version>
-  </dependency>
-
-for Jakarta RESTful Web Services integration module:
-  <dependency>
-      <groupId>org.eclipse.jsonp</groupId>
-      <artifactId>jsonp-jaxrs</artifactId>
-      <version>${project.version}</version>
-  </dependency>
-
-for Jakarta JSON Processing API which uses Eclipse JSONP as a default provider:
-  <dependency>
-      <groupId>org.eclipse.jsonp</groupId>
-      <artifactId>jakarta.json</artifactId>
-      <version>${project.version}</version>
-  </dependency>
-
-* GlassFish 6.x already bundles latest Jakarta JSON Processing implementation and Jakarta RESTful Web Services integration module.
-If you deploy an application with GlassFish 6.x, your application (war/ear) doesn't have to bundle APIs nor the implementation.
-
-* Samples can be run from https://github.com/eclipse-ee4j/glassfish-samples
diff --git a/demos/LICENSE.md b/demos/LICENSE.md
deleted file mode 100644
index c739f78..0000000
--- a/demos/LICENSE.md
+++ /dev/null
@@ -1,29 +0,0 @@
-
-    Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved.
-   
-    Redistribution and use in source and binary forms, with or without
-    modification, are permitted provided that the following conditions
-    are met:
-   
-      - Redistributions of source code must retain the above copyright
-        notice, this list of conditions and the following disclaimer.
-   
-      - Redistributions in binary form must reproduce the above copyright
-        notice, this list of conditions and the following disclaimer in the
-        documentation and/or other materials provided with the distribution.
-   
-      - Neither the name of the Eclipse Foundation, Inc. nor the names of its
-        contributors may be used to endorse or promote products derived
-        from this software without specific prior written permission.
-   
-    THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
-    IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-    THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-    PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-    CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-    EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-    PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-    PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
-    LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
-    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
-    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/demos/NOTICE.md b/demos/NOTICE.md
deleted file mode 100644
index b4cb5ba..0000000
--- a/demos/NOTICE.md
+++ /dev/null
@@ -1,49 +0,0 @@
-# Notices for Eclipse Project for JSON Processing
-
-This content is produced and maintained by the Eclipse Project for JSON
-Processing project.
-
-* Project home: https://projects.eclipse.org/projects/ee4j.jsonp
-
-## Trademarks
-
-Eclipse Project for JSON Processing is a trademark of the Eclipse Foundation.
-
-## Copyright
-
-All content is the property of the respective authors or their employers. For
-more information regarding authorship of content, please consult the listed
-source code repository logs.
-
-## Declared Project Licenses
-
-This program and the accompanying materials are made available under the terms
-of the Eclipse Public License v. 2.0 which is available at
-http://www.eclipse.org/legal/epl-2.0. This Source Code may also be made
-available under the following Secondary Licenses when the conditions for such
-availability set forth in the Eclipse Public License v. 2.0 are satisfied: GNU
-General Public License, version 2 with the GNU Classpath Exception which is
-available at https://www.gnu.org/software/classpath/license.html.
-
-SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
-## Source Code
-
-The project maintains the following source code repositories:
-
-* https://github.com/eclipse-ee4j/jsonp
-
-## Third-party Content
-
-JUnit (4.12)
-
-* License: Eclipse Public License
-
-## Cryptography
-
-Content may contain encryption software. The country in which you are currently
-may have restrictions on the import, possession, and use, and/or re-export to
-another country, of encryption software. BEFORE using any encryption software,
-please check the country's laws, regulations and policies concerning the import,
-possession, or use, and re-export of encryption software, to see if this is
-permitted.
diff --git a/demos/customprovider-jdk9/pom.xml b/demos/customprovider-jdk9/pom.xml
deleted file mode 100644
index 1354a45..0000000
--- a/demos/customprovider-jdk9/pom.xml
+++ /dev/null
@@ -1,88 +0,0 @@
-<!--
-
-    Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Distribution License v. 1.0, which is available at
-    http://www.eclipse.org/org/documents/edl-v10.php.
-
-    SPDX-License-Identifier: BSD-3-Clause
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>demos</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <url>http://maven.apache.org</url>
-    <artifactId>customprovider-jdk9</artifactId>
-
-    <name>customprovider-jdk9</name>
-
-    <properties>
-        <mod.dir>${project.build.directory}/mods</mod.dir>
-    </properties>
-    <build>
-        <finalName>customprovider-jdk9</finalName>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>prepare-endorsed</id>
-                        <phase>validate</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <outputDirectory>${mod.dir}</outputDirectory>
-                            <silent>false</silent>
-                            <!--<scope>compile</scope>-->
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-surefire-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>test</goal>
-                        </goals>
-                        <id>test</id>
-                    </execution>
-                </executions>
-                <configuration>
-                    <argLine>
-                        --module-path ${project.build.directory}/classes:${mod.dir}:${project.build.directory}/test-classes
-                        --add-modules org.eclipse.jsonp.demos.customprovider
-                    </argLine>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.hamcrest</groupId>
-            <artifactId>hamcrest-core</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-</project>
diff --git a/demos/customprovider-jdk9/src/main/java/module-info.java b/demos/customprovider-jdk9/src/main/java/module-info.java
deleted file mode 100644
index 10cbe8c..0000000
--- a/demos/customprovider-jdk9/src/main/java/module-info.java
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-module org.eclipse.jsonp.demos.customprovider {
-    requires transitive jakarta.json;
-    exports org.eclipse.jsonp.demos.customprovider;
-    provides jakarta.json.spi.JsonProvider with org.eclipse.jsonp.demos.customprovider.TestProvider;
-}
diff --git a/demos/customprovider-jdk9/src/main/java/org/eclipse/jsonp/demos/customprovider/TestGenerator.java b/demos/customprovider-jdk9/src/main/java/org/eclipse/jsonp/demos/customprovider/TestGenerator.java
deleted file mode 100644
index 661a848..0000000
--- a/demos/customprovider-jdk9/src/main/java/org/eclipse/jsonp/demos/customprovider/TestGenerator.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.customprovider;
-
-import jakarta.json.JsonException;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonGenerator;
-import java.io.IOException;
-import java.io.Writer;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class TestGenerator implements JsonGenerator {
-    private final Writer writer;
-
-    public TestGenerator(Writer writer) {
-        this.writer = writer;
-    }
-
-    @Override
-    public void flush() {
-    }
-
-    @Override
-    public JsonGenerator writeStartObject() {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeStartObject(String name) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, String fieldValue) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, int value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, long value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, double value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, BigInteger value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, BigDecimal value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, boolean value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeNull(String name) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(JsonValue value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray() {
-        try {
-            writer.write("[");
-        } catch(IOException ioe) {
-            throw new JsonException("I/O error", ioe);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray(String name) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, JsonValue value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String value) {
-        return null;
-    }
-
-
-    @Override
-    public JsonGenerator write(int value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(long value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(double value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(BigInteger value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(BigDecimal value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(boolean value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeNull() {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeEnd() {
-        try {
-            writer.write("]");
-        } catch(IOException ioe) {
-            throw new JsonException("I/O error", ioe);
-        }
-        return this;
-    }
-
-    @Override
-    public void close() {
-        try {
-            writer.close();
-        } catch(IOException ioe) {
-            throw new JsonException("I/O error", ioe);
-        }
-    }
-
-    @Override
-    public JsonGenerator writeKey(String string) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
-    }
-
-}
diff --git a/demos/customprovider-jdk9/src/main/java/org/eclipse/jsonp/demos/customprovider/TestProvider.java b/demos/customprovider-jdk9/src/main/java/org/eclipse/jsonp/demos/customprovider/TestProvider.java
deleted file mode 100644
index 31058ba..0000000
--- a/demos/customprovider-jdk9/src/main/java/org/eclipse/jsonp/demos/customprovider/TestProvider.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.customprovider;
-
-import jakarta.json.spi.JsonProvider;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonGeneratorFactory;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParserFactory;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Map;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonBuilderFactory;
-import jakarta.json.JsonObjectBuilder;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonReaderFactory;
-import jakarta.json.JsonWriter;
-import jakarta.json.JsonWriterFactory;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class TestProvider extends JsonProvider {
-
-    @Override
-    public JsonGenerator createGenerator(Writer writer) {
-        return new TestGenerator(writer);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(OutputStream out) {
-        return new TestGenerator(new OutputStreamWriter(out));
-    }
-
-    @Override
-    public JsonGeneratorFactory createGeneratorFactory(Map<String, ?> config) {
-        return null;
-    }
-
-    @Override
-    public JsonReader createReader(Reader reader) {
-        return null;
-    }
-
-    @Override
-    public JsonReader createReader(InputStream in) {
-        return null;
-    }
-
-    @Override
-    public JsonWriter createWriter(Writer writer) {
-        return null;
-    }
-
-    @Override
-    public JsonWriter createWriter(OutputStream out) {
-        return null;
-    }
-
-    @Override
-    public JsonWriterFactory createWriterFactory(Map<String, ?> config) {
-        return null;
-    }
-
-    @Override
-    public JsonReaderFactory createReaderFactory(Map<String, ?> config) {
-        return null;
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder() {
-        return null;
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder() {
-        return null;
-    }
-
-    @Override
-    public JsonBuilderFactory createBuilderFactory(Map<String, ?> config) {
-        return null;
-    }
-
-    @Override
-    public JsonParser createParser(Reader reader) {
-        return null;
-    }
-
-    @Override
-    public JsonParser createParser(InputStream in) {
-        return null;
-    }
-
-    @Override
-    public JsonParserFactory createParserFactory(Map<String, ?> config) {
-        return null;
-    }
-
-
-}
diff --git a/demos/customprovider-jdk9/src/test/java/customprovider/test/TestProviderTest.java b/demos/customprovider-jdk9/src/test/java/customprovider/test/TestProviderTest.java
deleted file mode 100644
index a820596..0000000
--- a/demos/customprovider-jdk9/src/test/java/customprovider/test/TestProviderTest.java
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package customprovider.test;
-
-import jakarta.json.Json;
-import jakarta.json.stream.JsonGenerator;
-import org.eclipse.jsonp.demos.customprovider.TestGenerator;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- *
- * @author lukas
- */
-public class TestProviderTest {
-
-    @Test
-    public void hello() {
-        try (JsonGenerator generator = Json.createGenerator(System.out)) {
-            Assert.assertTrue("TestGenerator is not picked up", generator instanceof TestGenerator);
-            generator.writeStartArray().writeEnd();
-        }
-        System.out.println();
-        System.out.println("Hurray!!!");
-    }
-}
diff --git a/demos/facebook/pom.xml b/demos/facebook/pom.xml
deleted file mode 100644
index 7229e0f..0000000
--- a/demos/facebook/pom.xml
+++ /dev/null
@@ -1,101 +0,0 @@
-<!--
-
-    Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Distribution License v. 1.0, which is available at
-    http://www.eclipse.org/org/documents/edl-v10.php.
-
-    SPDX-License-Identifier: BSD-3-Clause
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>demos</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>jar</packaging>
-    <url>http://maven.apache.org</url>
-    <artifactId>jsondemos-facebook</artifactId>
-
-    <properties>
-        <main.class>org.eclipse.jsonp.demos.facebook.FacebookObjectSearch</main.class>
-        <!--
-        <main.class>org.eclipse.jsonp.demos.facebook.FacebookStreamSearch</main.class>
-        -->
-        <modules.directory>${project.build.directory}/modules</modules.directory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>org.eclipse.jsonp</groupId>
-            <artifactId>jakarta.json</artifactId>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <configuration>
-                    <stripVersion>true</stripVersion>
-                    <outputDirectory>${modules.directory}</outputDirectory>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>get-dependencies</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>get-project-artifact</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>${project.artifactId}</artifactId>
-                                    <version>${project.version}</version>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <configuration>
-                    <executable>java</executable>
-                    <arguments>
-                        <argument>--module-path</argument>
-                        <argument>${modules.directory}</argument>
-                        <argument>-m</argument>
-                        <argument>org.eclipse.jsonp.demos.facebook/${main.class}</argument>
-                    </arguments>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>example-facebook</id>
-                        <goals>
-                            <goal>exec</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/demos/facebook/src/main/java/module-info.java b/demos/facebook/src/main/java/module-info.java
deleted file mode 100644
index 15464c7..0000000
--- a/demos/facebook/src/main/java/module-info.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-module org.eclipse.jsonp.demos.facebook {
-    requires jakarta.json;
-}
diff --git a/demos/facebook/src/main/java/org/eclipse/jsonp/demos/facebook/FacebookObjectSearch.java b/demos/facebook/src/main/java/org/eclipse/jsonp/demos/facebook/FacebookObjectSearch.java
deleted file mode 100644
index 30efc2a..0000000
--- a/demos/facebook/src/main/java/org/eclipse/jsonp/demos/facebook/FacebookObjectSearch.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.facebook;
-
-import jakarta.json.*;
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.Properties;
-
-/**
- * Parses JSON from facebook graph API using object model API.
- * JSON would like :
- *
- * {
- *   data: [
- *     { "from" : { "name" : "xxx", ... }, "message: "yyy", ... },
- *     { "from" : { "name" : "ppp", ... }, "message: "qqq", ... },
- *      ...
- *   ],
- *   ...
- * }
- *
- * This codes writes the facebook posts to output as follows:
- * xxx: yyy
- * --------
- * ppp: qqq
- * --------
- *
- * @author Jitendra Kotamraju
- */
-public class FacebookObjectSearch {
-
-    public static void main(String... args) throws Exception {
-        try (InputStream is = getSearchStream();
-             JsonReader rdr = Json.createReader(is)) {
-
-            JsonObject obj = rdr.readObject();
-            JsonArray results = obj.getJsonArray("data");
-            for (JsonObject result : results.getValuesAs(JsonObject.class)) {
-                JsonValue value = result.get("from");
-                if (value != null && value instanceof JsonObject) {
-                    System.out.print(((JsonObject)value).getString("name", "anon"));
-                }
-                System.out.print(": ");
-                System.out.println(result.getString("message", ""));
-                System.out.println("-----------");
-            }
-        }
-    }
-
-    static InputStream getSearchStream() throws Exception {
-        Properties config = new Properties();
-        config.load(FacebookObjectSearch.class.getResourceAsStream(
-                "/facebookconfig.properties"));
-        final String accessToken = (String)config.get("access_token");
-
-        // Gets the search stream
-        String searchUrl = "https://graph.facebook.com/search?q=tamil&type=post&access_token=";
-        URL url = new URL(searchUrl+accessToken);
-        HttpURLConnection con = (HttpURLConnection)url.openConnection();
-        return con.getInputStream();
-    }
-
-}
diff --git a/demos/facebook/src/main/java/org/eclipse/jsonp/demos/facebook/FacebookStreamSearch.java b/demos/facebook/src/main/java/org/eclipse/jsonp/demos/facebook/FacebookStreamSearch.java
deleted file mode 100644
index 768ab03..0000000
--- a/demos/facebook/src/main/java/org/eclipse/jsonp/demos/facebook/FacebookStreamSearch.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.facebook;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParser.Event;
-import java.io.*;
-
-/**
- * Parses JSON from facebook graph API using streaming API.
- * JSON would like :
- *
- * {
- *   data: [
- *     { "from" : { "name" : "xxx", ... }, "message: "yyy", ... },
- *     { "from" : { "name" : "ppp", ... }, "message: "qqq", ... },
- *      ...
- *   ],
- *   ...
- * }
- *
- * This codes writes the facebook posts to output as follows:
- * xxx: yyy
- * --------
- * ppp: qqq
- * --------
- *
- * @author Jitendra Kotamraju
- */
-public class FacebookStreamSearch {
-
-    public static void main(String... args) throws Exception {
-        try (InputStream is = FacebookObjectSearch.getSearchStream();
-             JsonParser parser = Json.createParser(is)) {
-            while (parser.hasNext()) {
-                Event e = parser.next();
-                if (e == Event.KEY_NAME) {
-                    switch (parser.getString()) {
-                        case "name":
-                            parser.next();
-                            System.out.print(parser.getString());
-                            System.out.print(": ");
-                            break;
-                        case "message":
-                            parser.next();
-                            System.out.println(parser.getString());
-                            System.out.println("---------");
-                            break;
-                    }
-                }
-            }
-        }
-    }
-
-}
diff --git a/demos/facebook/src/main/resources/facebookconfig.properties b/demos/facebook/src/main/resources/facebookconfig.properties
deleted file mode 100644
index f801f7d..0000000
--- a/demos/facebook/src/main/resources/facebookconfig.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-#
-# Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Distribution License v. 1.0, which is available at
-# http://www.eclipse.org/org/documents/edl-v10.php.
-#
-# SPDX-License-Identifier: BSD-3-Clause
-#
-
-
-access_token=
diff --git a/demos/jaxrs/pom.xml b/demos/jaxrs/pom.xml
deleted file mode 100644
index a9b6418..0000000
--- a/demos/jaxrs/pom.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
-
-    Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Distribution License v. 1.0, which is available at
-    http://www.eclipse.org/org/documents/edl-v10.php.
-
-    SPDX-License-Identifier: BSD-3-Clause
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>demos</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>war</packaging>
-    <url>http://maven.apache.org</url>
-    <artifactId>jsondemos-jaxrs</artifactId>
-
-    <name>jsondemos-jaxrs</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.ws.rs</groupId>
-            <artifactId>jakarta.ws.rs-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-war-plugin</artifactId>
-            </plugin>
-        </plugins>
-        <finalName>jsondemos-jaxrs</finalName>
-    </build>
-</project>
diff --git a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ArrayResource.java b/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ArrayResource.java
deleted file mode 100644
index 28c9009..0000000
--- a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ArrayResource.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.jaxrs;
-
-import jakarta.json.*;
-import jakarta.ws.rs.*;
-import jakarta.ws.rs.core.MediaType;
-
-/**
- * JsonArray as parameter and return type for a Jakarta RESTful Web Services resource
- *
- * @author Jitendra Kotamraju
- */
-@Path("/array")
-public class ArrayResource {
-    private static final JsonBuilderFactory bf = Json.createBuilderFactory(null);
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public JsonArray doGet() {
-        return bf.createArrayBuilder()
-                .add(bf.createObjectBuilder()
-                    .add("type", "home")
-                    .add("number", "212 555-1234"))
-                .add(bf.createObjectBuilder()
-                    .add("type", "fax")
-                    .add("number", "646 555-4567"))
-                .build();
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    public void doPost(JsonArray structure) {
-        System.out.println(structure);
-    }
-
-}
diff --git a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/DemoApplication.java b/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/DemoApplication.java
deleted file mode 100644
index 7bf3cfa..0000000
--- a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/DemoApplication.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.jaxrs;
-
-import jakarta.json.stream.JsonGenerator;
-import jakarta.ws.rs.ApplicationPath;
-import jakarta.ws.rs.core.Application;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A Jakarta RESTful Web Services Demo Application
- *
- * @author Jitendra Kotamraju
- */
-@ApplicationPath("/")
-public class DemoApplication extends Application {
-
-    @Override
-    public Set<Class<?>> getClasses() {
-        Set<Class<?>> set = new HashSet<>();
-        set.add(ParserResource.class);
-        set.add(GeneratorResource.class);
-        set.add(ObjectResource.class);
-        set.add(ArrayResource.class);
-        set.add(StructureResource.class);
-
-        return set;
-    }
-
-    @Override
-    public Map<String, Object> getProperties() {
-        return new HashMap<String, Object>() {{
-            put(JsonGenerator.PRETTY_PRINTING, true);
-        }};
-    }
-}
diff --git a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/GeneratorResource.java b/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/GeneratorResource.java
deleted file mode 100644
index 291607a..0000000
--- a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/GeneratorResource.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.jaxrs;
-
-import jakarta.json.Json;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.StreamingOutput;
-import java.io.OutputStream;
-
-/**
- * Writes wiki's JSON example in a streaming fashion using JsonGenerator
- *
- * @author Jitendra Kotamraju
- */
-@Path("/generator")
-public class GeneratorResource {
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public StreamingOutput doGet() {
-        return new StreamingOutput() {
-            public void write(OutputStream os) {
-                writeWikiExample(os);
-            }
-        };
-    }
-
-    // Writes wiki example JSON in a streaming fashion
-    private void writeWikiExample(OutputStream os) {
-        try(JsonGenerator gene = Json.createGenerator(os)) {
-            gene.writeStartObject()
-                .write("firstName", "John")
-                .write("lastName", "Smith")
-                .write("age", 25)
-                .writeStartObject("address")
-                    .write("streetAddress", "21 2nd Street")
-                    .write("city", "New York")
-                    .write("state", "NY")
-                    .write("postalCode", "10021")
-                .writeEnd()
-                .writeStartArray("phoneNumber")
-                    .writeStartObject()
-                        .write("type", "home")
-                        .write("number", "212 555-1234")
-                    .writeEnd()
-                    .writeStartObject()
-                        .write("type", "fax")
-                        .write("number", "646 555-4567")
-                    .writeEnd()
-                .writeEnd()
-            .writeEnd();
-        }
-    }
-
-}
diff --git a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ObjectResource.java b/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ObjectResource.java
deleted file mode 100644
index fb342d1..0000000
--- a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ObjectResource.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.jaxrs;
-
-import jakarta.json.*;
-import jakarta.ws.rs.*;
-import jakarta.ws.rs.core.MediaType;
-
-/**
- * JsonObject as parameter and return type for a
- * Jakarta RESTful Web Services resource
- * Writes a person's representation as JSON using JsonObject
- *
- * @author Jitendra Kotamraju
- */
-@Path("/object")
-public class ObjectResource {
-    private static final JsonBuilderFactory bf = Json.createBuilderFactory(null);
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public JsonObject doGet() {
-        return bf.createObjectBuilder()
-            .add("firstName", "John")
-            .add("lastName", "Smith")
-            .add("age", 25)
-            .add("address", bf.createObjectBuilder()
-                .add("streetAddress", "21 2nd Street")
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021"))
-            .add("phoneNumber", bf.createArrayBuilder()
-                .add(bf.createObjectBuilder()
-                    .add("type", "home")
-                    .add("number", "212 555-1234"))
-                .add(bf.createObjectBuilder()
-                    .add("type", "fax")
-                    .add("number", "646 555-4567")))
-            .build();
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    public void doPost(JsonObject structure) {
-        System.out.println(structure);
-    }
-
-}
diff --git a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ParserResource.java b/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ParserResource.java
deleted file mode 100644
index 6e88078..0000000
--- a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/ParserResource.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.jaxrs;
-
-import jakarta.json.Json;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParser.Event;
-import jakarta.ws.rs.GET;
-import jakarta.ws.rs.Path;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.core.StreamingOutput;
-import java.io.*;
-import java.net.URL;
-
-/**
- * Filters JSON from flicker photo search REST API
- *
- * {
- *    photos : {
- *        photo: [
- *           { id: "9889087315", secret: "40aeb70c83", server: "3818",farm: 4, ..},
- *           { id: "9889087315", secret: "40aeb70c83", server: "3818",farm: 4, ..}
- *           ...
- *        ],
- *        ...
- *    }
- * }
- *
- * @author Jitendra Kotamraju
- */
-@Path("/parser")
-public class ParserResource {
-
-    @GET
-    @Produces("text/html")
-    public StreamingOutput doGet() {
-        return new StreamingOutput() {
-            public void write(OutputStream os) throws IOException {
-                writeFlickerFeed(os);
-            }
-        };
-    }
-
-    private void writeFlickerFeed(OutputStream os) throws IOException {
-        URL url = new URL("http://api.flickr.com/services/rest/?method=flickr.photos.getRecent&api_key=221160312e1c22ec60ecf336951b0e77&format=json&nojsoncallback=1&per_page=20");
-        try(InputStream is = url.openStream();
-            JsonParser parser = Json.createParser(is);
-            PrintWriter ps = new PrintWriter(new OutputStreamWriter(os, "UTF-8"))) {
-            String id = null;
-            String server = null;
-            String secret = null;
-
-            ps.println("<html><body>");
-            while(parser.hasNext()) {
-                Event e = parser.next();
-                if (e == Event.KEY_NAME) {
-                    String str = parser.getString();
-                    switch (str) {
-                        case "id" :
-                            parser.next();
-                            id = parser.getString();
-                            break;
-                        case "farm" :
-                            parser.next();
-                            String farm = parser.getString();
-                            ps.println("<img src=\"http://farm"+farm+".staticflickr.com/"+server+"/"+id+"_"+secret+".jpg\">");
-                            break;
-                        case "server" :
-                            parser.next();
-                            server = parser.getString();
-                            break;
-                        case "secret" :
-                            parser.next();
-                            secret = parser.getString();
-                            break;
-                    }
-                }
-            }
-            ps.println("</body></html>");
-            ps.flush();
-        }
-	}
-
-}
diff --git a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/StructureResource.java b/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/StructureResource.java
deleted file mode 100644
index dfdd906..0000000
--- a/demos/jaxrs/src/main/java/org/eclipse/jsonp/demos/jaxrs/StructureResource.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.jaxrs;
-
-import jakarta.json.*;
-import jakarta.ws.rs.*;
-import jakarta.ws.rs.core.MediaType;
-
-/**
- * JsonStructure as parameter and return type for a
- * Jakarta RESTful Web Services resource
- *
- * @author Jitendra Kotamraju
- */
-@Path("/structure")
-public class StructureResource {
-    private static final JsonBuilderFactory bf = Json.createBuilderFactory(null);
-
-    @GET
-    @Produces(MediaType.APPLICATION_JSON)
-    public JsonStructure doGet() {
-        return bf.createObjectBuilder()
-            .add("firstName", "John")
-            .add("lastName", "Smith")
-            .add("age", 25)
-            .add("address", bf.createObjectBuilder()
-                .add("streetAddress", "21 2nd Street")
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021"))
-            .add("phoneNumber", bf.createArrayBuilder()
-                .add(bf.createObjectBuilder()
-                    .add("type", "home")
-                    .add("number", "212 555-1234"))
-                .add(bf.createObjectBuilder()
-                    .add("type", "fax")
-                    .add("number", "646 555-4567")))
-            .build();
-    }
-
-    @POST
-    @Consumes(MediaType.APPLICATION_JSON)
-    public void doPost(JsonStructure structure) {
-        System.out.println(structure);
-    }
-
-}
diff --git a/demos/jsonpointer/pom.xml b/demos/jsonpointer/pom.xml
deleted file mode 100644
index 6b3658c..0000000
--- a/demos/jsonpointer/pom.xml
+++ /dev/null
@@ -1,112 +0,0 @@
-<!--
-
-    Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Distribution License v. 1.0, which is available at
-    http://www.eclipse.org/org/documents/edl-v10.php.
-
-    SPDX-License-Identifier: BSD-3-Clause
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>demos</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>jar</packaging>
-    <url>http://maven.apache.org</url>
-    <artifactId>jsondemos-jsonpointer</artifactId>
-
-    <properties>
-        <main.class>org.eclipse.jsonp.demos.jsonpointer.JsonpointerDemo</main.class>
-        <modules.directory>${project.build.directory}/modules</modules.directory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-            <scope>compile</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jsonp</groupId>
-            <artifactId>jsonp</artifactId>
-            <scope>compile</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <!-- openjdk11 fails without this being set -->
-                    <detectOfflineLinks>false</detectOfflineLinks>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <configuration>
-                    <stripVersion>true</stripVersion>
-                    <outputDirectory>${modules.directory}</outputDirectory>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>get-dependencies</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                    </execution>
-                    <execution>
-                        <id>get-project-artifact</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>${project.artifactId}</artifactId>
-                                    <version>${project.version}</version>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <configuration>
-                    <executable>java</executable>
-                    <arguments>
-                        <argument>--module-path</argument>
-                        <argument>${modules.directory}</argument>
-                        <argument>-m</argument>
-                        <argument>org.eclipse.jsonp.demos.jsonpointer/${main.class}</argument>
-                    </arguments>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>example-jsonpointer</id>
-                        <phase>verify</phase>
-                        <goals>
-                            <goal>exec</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-</project>
diff --git a/demos/jsonpointer/src/main/java/module-info.java b/demos/jsonpointer/src/main/java/module-info.java
deleted file mode 100644
index 26b1bbc..0000000
--- a/demos/jsonpointer/src/main/java/module-info.java
+++ /dev/null
@@ -1,13 +0,0 @@
-/*
- * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-module org.eclipse.jsonp.demos.jsonpointer {
-    requires jakarta.json;
-}
diff --git a/demos/jsonpointer/src/main/java/org/eclipse/jsonp/demos/jsonpointer/JsonpointerDemo.java b/demos/jsonpointer/src/main/java/org/eclipse/jsonp/demos/jsonpointer/JsonpointerDemo.java
deleted file mode 100644
index fd3b276..0000000
--- a/demos/jsonpointer/src/main/java/org/eclipse/jsonp/demos/jsonpointer/JsonpointerDemo.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.jsonpointer;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonString;
-import jakarta.json.JsonValue;
-
-/**
- * JsonPointer (http://tools.ietf.org/html/rfc6901) demo with object model API
- *
- * @author Jitendra Kotamraju
- */
-public class JsonpointerDemo {
-
-    public static void main(String... args) throws Exception {
-        testWiki();
-        testPointer();
-        System.out.println("Both tests PASSED !!!");
-    }
-
-    private static void testWiki() throws IOException {
-        try (InputStream is = JsonpointerDemo.class.getResourceAsStream("/wiki.json");
-             JsonReader rdr = Json.createReader(is)) {
-            JsonObject person = rdr.readObject();
-
-            assertEquals("NY", getString(person, "/address/state"));
-            assertEquals("212 555-1234", getString(person, "/phoneNumber/0/number"));
-        }
-    }
-
-    private static void testPointer() throws IOException {
-        try (InputStream is = JsonpointerDemo.class.getResourceAsStream("/jsonpointer.json");
-             JsonReader rdr = Json.createReader(is)) {
-            JsonObject root = rdr.readObject();
-
-            assertEquals(root, get(root, ""));
-            assertEquals(root.get("foo"), get(root, "/foo"));
-            assertEquals(root.getJsonArray("foo").get(0), get(root, "/foo/0"));
-            assertEquals(root.get(""), get(root, "/"));
-            assertEquals(root.get("a/b"), get(root, "/a~1b"));
-            assertEquals(root.get("c%d"), get(root, "/c%d"));
-            assertEquals(root.get("e^f"), get(root, "/e^f"));
-            assertEquals(root.get("k\"l"), get(root, "/k\"l"));
-            assertEquals(root.get("i\\j"), get(root, "/i\\j"));
-            assertEquals(root.get(" "), get(root, "/ "));
-            assertEquals(root.get("m~n"), get(root, "/m~0n"));
-
-            // Adding a parent to current root and try with it
-            JsonObject doc = Json.createObjectBuilder().add("doc", root).build();
-            root = doc.getJsonObject("doc");
-            assertEquals(doc, get(doc, ""));
-            assertEquals(root.get("foo"), get(doc, "/doc/foo"));
-            assertEquals(root.getJsonArray("foo").get(0), get(doc, "/doc/foo/0"));
-            assertEquals(root.get(""), get(doc, "/doc/"));
-            assertEquals(root.get("a/b"), get(doc, "/doc/a~1b"));
-            assertEquals(root.get("c%d"), get(doc, "/doc/c%d"));
-            assertEquals(root.get("e^f"), get(doc, "/doc/e^f"));
-            assertEquals(root.get("k\"l"), get(doc, "/doc/k\"l"));
-            assertEquals(root.get("i\\j"), get(doc, "/doc/i\\j"));
-            assertEquals(root.get(" "), get(doc, "/doc/ "));
-            assertEquals(root.get("m~n"), get(doc, "/doc/m~0n"));
-        }
-    }
-
-    private static String getString(JsonValue root, String pointer) {
-        return ((JsonString)get(root, pointer)).getString();
-    }
-
-    private static JsonValue get(JsonValue root, String pointer) {
-        if (pointer.isEmpty()) {
-            return root;
-        }
-        if (pointer.charAt(0) != '/') {
-            throw new IllegalArgumentException(
-                    "JsonPointer "+pointer+" doesn't start with /");
-        }
-
-        StringBuilder referenceToken = new StringBuilder();
-        for(int i=1; i < pointer.length(); i++) {   // 1 to skip first /
-            char ch = pointer.charAt(i);
-            if (ch == '/') {
-                return get(newRoot(root, referenceToken.toString()), pointer.substring(i));
-            } else if (ch == '~') {
-                // handle escaping ~0, ~1
-                if (i+1 == pointer.length()) {
-                    throw new IllegalArgumentException("Illegal escaping: expected ~0 or ~1, but got only ~ in pointer="+pointer);
-                }
-                ch = pointer.charAt(++i);
-                if (ch == '0') {
-                    referenceToken.append('~');
-                } else if (ch == '1') {
-                    referenceToken.append('/');
-                } else {
-                    throw new IllegalArgumentException("Illegal escaping: expected ~0 or ~1, but got ~"+ch+" in pointer="+pointer);
-                }
-            } else {
-                referenceToken.append(ch);
-            }
-        }
-        return newRoot(root, referenceToken.toString());
-    }
-
-    private static JsonValue newRoot(JsonValue root, String referenceToken) {
-        if (root instanceof JsonObject) {
-            return ((JsonObject)root).get(referenceToken);
-        } else if (root instanceof JsonArray) {
-            return ((JsonArray)root).get(Integer.parseInt(referenceToken));
-        }
-        throw new IllegalArgumentException("Illegal reference token="+referenceToken+" for value="+root);
-    }
-
-    private static void assertEquals(JsonValue exp, JsonValue got) {
-        if (exp != got) {
-            throw new RuntimeException("Expected = "+exp+" but got = "+got);
-        }
-    }
-
-    private static void assertEquals(String exp, String got) {
-        if (!exp.equals(got)) {
-            throw new RuntimeException("Expected = "+exp+" but got = "+got);
-        }
-    }
-
-}
diff --git a/demos/jsonpointer/src/main/resources/jsonpointer.json b/demos/jsonpointer/src/main/resources/jsonpointer.json
deleted file mode 100644
index 937a098..0000000
--- a/demos/jsonpointer/src/main/resources/jsonpointer.json
+++ /dev/null
@@ -1,12 +0,0 @@
-{
-  "foo": ["bar", "baz"],
-  "": 0,
-  "a/b": 1,
-  "c%d": 2,
-  "e^f": 3,
-  "g|h": 4,
-  "i\\j": 5,
-  "k\"l": 6,
-  " ": 7,
-  "m~n": 8
-}
diff --git a/demos/jsonpointer/src/main/resources/wiki.json b/demos/jsonpointer/src/main/resources/wiki.json
deleted file mode 100644
index 17bb193..0000000
--- a/demos/jsonpointer/src/main/resources/wiki.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-     "firstName": "John",
-     "lastName": "Smith",
-     "age": 25,
-     "address": {
-         "streetAddress": "21 2nd Street",
-         "city": "New York",
-         "state": "NY",
-         "postalCode": "10021"
-     },
-     "phoneNumber": [
-         {
-           "type": "home",
-           "number": "212 555-1234"
-         },
-         {
-           "type": "fax",
-           "number": "646 555-4567"
-         }
-     ]
-}
diff --git a/demos/pom.xml b/demos/pom.xml
deleted file mode 100644
index 9ec70d4..0000000
--- a/demos/pom.xml
+++ /dev/null
@@ -1,41 +0,0 @@
-<!--
-
-    Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Distribution License v. 1.0, which is available at
-    http://www.eclipse.org/org/documents/edl-v10.php.
-
-    SPDX-License-Identifier: BSD-3-Clause
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>json</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>pom</packaging>
-    <url>http://maven.apache.org</url>
-    <groupId>org.eclipse.jsonp</groupId>
-    <artifactId>demos</artifactId>
-
-    <properties>
-        <legal.doc.source>${basedir}/..</legal.doc.source>
-    </properties>
-
-    <modules>
-        <module>jaxrs</module>
-        <module>twitter</module>
-        <module>facebook</module>
-        <module>jsonpointer</module>
-        <module>servlet</module>
-        <module>customprovider-jdk9</module>
-    </modules>
-
-</project>
diff --git a/demos/servlet/pom.xml b/demos/servlet/pom.xml
deleted file mode 100644
index 4493725..0000000
--- a/demos/servlet/pom.xml
+++ /dev/null
@@ -1,54 +0,0 @@
-<!--
-
-    Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Distribution License v. 1.0, which is available at
-    http://www.eclipse.org/org/documents/edl-v10.php.
-
-    SPDX-License-Identifier: BSD-3-Clause
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>demos</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>war</packaging>
-    <url>http://maven.apache.org</url>
-    <artifactId>jsondemos-servlet</artifactId>
-
-    <name>jsondemos-servlet</name>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.servlet</groupId>
-            <artifactId>jakarta.servlet-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-war-plugin</artifactId>
-            </plugin>
-        </plugins>
-        <finalName>jsondemos-servlet</finalName>
-    </build>
-</project>
diff --git a/demos/servlet/src/main/java/org/eclipse/jsonp/demos/servlet/ArrayServlet.java b/demos/servlet/src/main/java/org/eclipse/jsonp/demos/servlet/ArrayServlet.java
deleted file mode 100644
index ad1ebea..0000000
--- a/demos/servlet/src/main/java/org/eclipse/jsonp/demos/servlet/ArrayServlet.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.servlet;
-
-import java.io.IOException;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonBuilderFactory;
-import jakarta.json.JsonWriter;
-import jakarta.json.JsonWriterFactory;
-
-import jakarta.servlet.annotation.WebServlet;
-import jakarta.servlet.http.HttpServlet;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-
-/**
- * Writes a JsonArray using HttpServletResponse#getWriter
- * http://localhost:8080/jsondemos-servlet/array
- *
- * Writes a JsonArray using HttpServletResponse#getOutputStream
- * http://localhost:8080/jsondemos-servlet/array?stream
- *
- *
- * @author Jitendra Kotamraju
- */
-@WebServlet("/array")
-public class ArrayServlet extends HttpServlet {
-    private static final JsonBuilderFactory bf = Json.createBuilderFactory(null);
-    private static final JsonWriterFactory wf = Json.createWriterFactory(null);
-
-    @Override
-    public void doGet(HttpServletRequest req, HttpServletResponse res) throws IOException {
-        JsonArray array = bf.createArrayBuilder()
-                .add(bf.createObjectBuilder()
-                    .add("type", "home")
-                    .add("number", "212 555-1234"))
-                .add(bf.createObjectBuilder()
-                    .add("type", "fax")
-                    .add("number", "646 555-4567"))
-                .build();
-        res.setStatus(HttpServletResponse.SC_OK);
-        res.setContentType("application/json");
-        res.setCharacterEncoding("UTF-8");
-
-        String q = req.getQueryString();
-        boolean isStream = q != null && q.equals("stream");
-        JsonWriter writer = isStream
-                ? wf.createWriter(res.getOutputStream())
-                : wf.createWriter(res.getWriter());
-        writer.write(array);
-        // not closing writer intentionally
-    }
-
-}
diff --git a/demos/twitter/pom.xml b/demos/twitter/pom.xml
deleted file mode 100644
index f8cccf8..0000000
--- a/demos/twitter/pom.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<!--
-
-    Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Distribution License v. 1.0, which is available at
-    http://www.eclipse.org/org/documents/edl-v10.php.
-
-    SPDX-License-Identifier: BSD-3-Clause
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>demos</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>jar</packaging>
-    <url>http://maven.apache.org</url>
-    <artifactId>jsondemos-twitter</artifactId>
-
-    <properties>
-        <main.class>org.eclipse.jsonp.demos.twitter.TwitterObjectSearch</main.class>
-        <!--
-        <main.class>org.eclipse.jsonp.demos.twitter.TwitterStreamSearch</main.class>
-        -->
-        <modules.directory>${project.build.directory}/modules</modules.directory>
-    </properties>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>org.eclipse.jsonp</groupId>
-            <artifactId>jsonp</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-
-        <dependency>
-            <groupId>jakarta.xml.bind</groupId>
-            <artifactId>jakarta.xml.bind-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>com.sun.xml.bind</groupId>
-            <artifactId>jaxb-impl</artifactId>
-            <scope>runtime</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-dependency-plugin</artifactId>
-                <configuration>
-                    <stripVersion>true</stripVersion>
-                    <outputDirectory>${modules.directory}</outputDirectory>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>get-dependencies</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy-dependencies</goal>
-                        </goals>
-                        <configuration>
-                            <excludeArtifactIds>jakarta.activation-api</excludeArtifactIds>
-                        </configuration>
-                    </execution>
-                    <execution>
-                        <id>get-project-artifact</id>
-                        <phase>package</phase>
-                        <goals>
-                            <goal>copy</goal>
-                        </goals>
-                        <configuration>
-                            <artifactItems>
-                                <artifactItem>
-                                    <groupId>${project.groupId}</groupId>
-                                    <artifactId>${project.artifactId}</artifactId>
-                                    <version>${project.version}</version>
-                                </artifactItem>
-                            </artifactItems>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>exec-maven-plugin</artifactId>
-                <configuration>
-                    <executable>java</executable>
-                    <arguments>
-                        <argument>--module-path</argument>
-                        <argument>${modules.directory}</argument>
-                        <argument>-m</argument>
-                        <argument>org.eclipse.jsonp.demos.twitter/${main.class}</argument>
-                    </arguments>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>example-twitter</id>
-                        <goals>
-                            <goal>exec</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-        </plugins>
-    </build>
-
-</project>
diff --git a/demos/twitter/src/main/java/module-info.java b/demos/twitter/src/main/java/module-info.java
deleted file mode 100644
index 36e9c13..0000000
--- a/demos/twitter/src/main/java/module-info.java
+++ /dev/null
@@ -1,14 +0,0 @@
-/*
- * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-module org.eclipse.jsonp.demos.twitter {
-    requires jakarta.xml.bind;
-    requires jakarta.json;
-}
diff --git a/demos/twitter/src/main/java/org/eclipse/jsonp/demos/twitter/TwitterObjectSearch.java b/demos/twitter/src/main/java/org/eclipse/jsonp/demos/twitter/TwitterObjectSearch.java
deleted file mode 100644
index 449d9b5..0000000
--- a/demos/twitter/src/main/java/org/eclipse/jsonp/demos/twitter/TwitterObjectSearch.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.twitter;
-
-import javax.crypto.Mac;
-import javax.crypto.spec.SecretKeySpec;
-import jakarta.json.*;
-import jakarta.xml.bind.DatatypeConverter;
-import java.io.*;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.net.URLEncoder;
-import java.util.*;
-
-/**
- * Parses JSON from twitter search REST API using object model API.
- * JSON would like :
- *
- * {
- "   statuses": [
- *     { ..., "user" : { "name" : "xxx", ...}, "text: "yyy", ... },
- *     { ..., "user" : { "name" : "ppp", ...}, "text: "qqq", ... },
- *     ...
- *   ],
- *   ...
- * }
- *
- * This codes writes the tweets to output as follows:
- * xxx: yyy
- * --------
- * ppp: qqq
- * --------
- *
- * @author Jitendra Kotamraju
- */
-public class TwitterObjectSearch {
-
-    public static void main(String... args) throws Exception {
-        try (InputStream is = getSearchStream();
-             JsonReader rdr = Json.createReader(is)) {
-
-            JsonObject obj = rdr.readObject();
-            JsonArray results = obj.getJsonArray("statuses");
-            for (JsonObject result : results.getValuesAs(JsonObject.class)) {
-                System.out.print(result.getJsonObject("user").getString("name", "anonymous"));
-                System.out.print(": ");
-                System.out.println(result.get("text"));
-                System.out.println("-----------");
-            }
-
-//            All the tweets are collected into Stream<String> and printed
-//            obj.getJsonArray("statuses").getValuesAs(JsonObject.class)
-//                    .stream()
-//                    .map(v -> v.getString("text"))
-//                    .forEach(s -> { System.out.println(s); } );
-        }
-    }
-
-    static InputStream getSearchStream() throws Exception {
-        final String searchStr = "#javaone";
-        String searchUrl = "https://api.twitter.com/1.1/search/tweets.json";
-
-        Properties config = new Properties();
-        config.load(TwitterObjectSearch.class.getResourceAsStream(
-                "/twitterconfig.properties"));
-
-        final String consumerKey = (String)config.get("consumer-key");
-        final String consumerSecret = (String)config.get("consumer-secret");
-        final String accessToken = (String)config.get("access-token");
-        final String accessTokenSecret = (String)config.get("access-token-secret");
-        final int timestamp = (int)(System.currentTimeMillis()/1000);
-
-        Map<String, String> map = new TreeMap<String, String>() {{
-            put("count", "100");
-            put("oauth_consumer_key", consumerKey);
-            put("oauth_nonce", "4b25256957d75b6370f33a4501dc5e7e"); // TODO
-            put("oauth_signature_method", "HMAC-SHA1");
-            put("oauth_timestamp", ""+timestamp);
-            put("oauth_token", accessToken);
-            put("oauth_version", "1.0");
-            put("q", searchStr);
-        }};
-
-        // Builds param string
-        StringBuilder paramsBuilder = new StringBuilder();
-        boolean first = true;
-        for(Map.Entry<String, String> e : map.entrySet()) {
-            if (!first) {
-                paramsBuilder.append('&');
-            }
-            first = false;
-            paramsBuilder.append(e.getKey());
-            paramsBuilder.append("=");
-            paramsBuilder.append(URLEncoder.encode(e.getValue(), "UTF-8"));
-        }
-        String paramsString = paramsBuilder.toString();
-
-        // builds signature string
-        StringBuilder signatureBuilder = new StringBuilder();
-        signatureBuilder.append("GET");
-        signatureBuilder.append('&');
-        signatureBuilder.append(URLEncoder.encode(searchUrl, "UTF-8"));
-        signatureBuilder.append('&');
-        signatureBuilder.append(URLEncoder.encode(paramsString, "UTF-8"));
-        String signatureBasedString = signatureBuilder.toString();
-
-        // Create authorization signature
-        Mac m = Mac.getInstance("HmacSHA1");
-        m.init(new SecretKeySpec((consumerSecret+"&"+accessTokenSecret).getBytes(), "HmacSHA1"));
-        m.update(signatureBasedString.getBytes());
-        byte[] res = m.doFinal();
-        final String oauthSig = URLEncoder.encode(DatatypeConverter.printBase64Binary(res), "UTF-8");
-        map.put("oauth_signature", oauthSig);
-        map.remove("count");
-        map.remove("q");
-
-        // Build Authorization header
-        StringBuilder authorizationBuilder = new StringBuilder();
-        authorizationBuilder.append("OAuth ");
-        first = true;
-        for(Map.Entry<String, String> e : map.entrySet()) {
-            if (!first) {
-                authorizationBuilder.append(',');
-                authorizationBuilder.append(' ');
-            }
-            first = false;
-            authorizationBuilder.append(e.getKey());
-            authorizationBuilder.append('=');
-            authorizationBuilder.append('"');
-            authorizationBuilder.append(e.getValue());
-            authorizationBuilder.append('"');
-        }
-
-        // Gets the search stream
-        URL url = new URL(searchUrl+"?q="+URLEncoder.encode(searchStr, "UTF-8")+
-                "&count=100");
-        HttpURLConnection con = (HttpURLConnection)url.openConnection();
-        con.addRequestProperty("Authorization", authorizationBuilder.toString());
-        return con.getInputStream();
-    }
-
-}
diff --git a/demos/twitter/src/main/java/org/eclipse/jsonp/demos/twitter/TwitterStreamSearch.java b/demos/twitter/src/main/java/org/eclipse/jsonp/demos/twitter/TwitterStreamSearch.java
deleted file mode 100644
index d07b2ef..0000000
--- a/demos/twitter/src/main/java/org/eclipse/jsonp/demos/twitter/TwitterStreamSearch.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Distribution License v. 1.0, which is available at
- * http://www.eclipse.org/org/documents/edl-v10.php.
- *
- * SPDX-License-Identifier: BSD-3-Clause
- */
-
-package org.eclipse.jsonp.demos.twitter;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParser.Event;
-import java.io.*;
-
-/**
- * Parses JSON from twitter search REST API using streaming API.
- * JSON would like :
- *
- * {
- "   statuses": [
- *     { ..., "user" : { "name" : "xxx", ...}, "text: "yyy", ... },
- *     { ..., "user" : { "name" : "ppp", ...}, "text: "qqq", ... },
- *     ...
- *   ],
- *   ...
- * }
- *
- * This codes writes the tweets to output as follows:
- * xxx: yyy
- * --------
- * ppp: qqq
- * --------
- *
- * TODO need to do better, also the last tweet is repeated !
- *
- * @author Jitendra Kotamraju
- */
-public class TwitterStreamSearch {
-
-    public static void main(String... args) throws Exception {
-        try (InputStream is = TwitterObjectSearch.getSearchStream();
-             JsonParser parser = Json.createParser(is)) {
-            int depth = 0;
-            String name = null;
-            String text = null;
-            while (parser.hasNext()) {
-                Event e = parser.next();
-                if (e == Event.KEY_NAME) {
-                    switch (parser.getString()) {
-                        case "name":
-                            if (depth == 3) {
-                            parser.next();
-                            name = parser.getString();
-                            }
-                            break;
-                        case "text":
-                            if (depth == 2) {
-                            parser.next();
-                            text = parser.getString();
-                            }
-                            break;
-                    }
-                } else if (e == Event.START_OBJECT) {
-                    ++depth;
-                } else if (e == Event.END_OBJECT) {
-                    --depth;
-                    if (depth == 1) {
-                        System.out.println(name+": "+text);
-                        System.out.println("-----------");
-
-                    }
-                }
-            }
-        }
-    }
-
-}
diff --git a/demos/twitter/src/main/resources/twitterconfig.properties b/demos/twitter/src/main/resources/twitterconfig.properties
deleted file mode 100644
index 87b5d72..0000000
--- a/demos/twitter/src/main/resources/twitterconfig.properties
+++ /dev/null
@@ -1,16 +0,0 @@
-#
-# Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Distribution License v. 1.0, which is available at
-# http://www.eclipse.org/org/documents/edl-v10.php.
-#
-# SPDX-License-Identifier: BSD-3-Clause
-#
-
-
-consumer-key=
-consumer-secret=
-access-token=
-access-token-secret=
-
diff --git a/etc/config/copyright-exclude b/etc/config/copyright-exclude
deleted file mode 100644
index e7f6f88..0000000
--- a/etc/config/copyright-exclude
+++ /dev/null
@@ -1,8 +0,0 @@
-.json
-.md
-speclicense.html
-MANIFEST.MF
-/META-INF/services/
-/etc/config/copyright-exclude
-/etc/config/copyright.txt
-/bundles/ri/src/main/resources/README.txt
diff --git a/etc/config/copyright.txt b/etc/config/copyright.txt
deleted file mode 100644
index 9c347b6..0000000
--- a/etc/config/copyright.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-/*
- * Copyright (c) YYYY Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
diff --git a/etc/config/exclude.xml b/etc/config/exclude.xml
deleted file mode 100644
index 7380f9d..0000000
--- a/etc/config/exclude.xml
+++ /dev/null
@@ -1,14 +0,0 @@
-<!--
-
-    Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Distribution License v. 1.0, which is available at
-    http://www.eclipse.org/org/documents/edl-v10.php.
-
-    SPDX-License-Identifier: BSD-3-Clause
-
--->
-
-<FindBugsFilter>
-</FindBugsFilter>
diff --git a/impl/pom.xml b/impl/pom.xml
deleted file mode 100644
index 4306dc1..0000000
--- a/impl/pom.xml
+++ /dev/null
@@ -1,100 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>json</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.eclipse.jsonp</groupId>
-    <artifactId>jsonp</artifactId>
-    <version>2.0.2-SNAPSHOT</version>
-    <name>Eclipse JSONP</name>
-    <description>Default provider for Jakarta JSON Processing</description>
-    <url>https://github.com/eclipse-ee4j/jsonp</url>
-
-    <properties>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>osgi-manifest</id>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                        <configuration>
-                            <instructions>
-                                <HK2-Bundle-Name>${project.groupId}:${project.artifactId}</HK2-Bundle-Name>
-                                <Implementation-Build-Id>${project.version} - ${buildNumber}</Implementation-Build-Id>
-                                <Export-Package>org.eclipse.jsonp.api</Export-Package>
-                            </instructions>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-jar-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifestFile>${project.build.outputDirectory}/META-INF/MANIFEST.MF</manifestFile>
-                        <manifest>
-                            <addDefaultEntries>false</addDefaultEntries>
-                        </manifest>
-                    </archive>
-                </configuration>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-javadoc-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <addDefaultEntries>false</addDefaultEntries>
-                        </manifest>
-                    </archive>
-                    <release>11</release>
-                    <notimestamp>true</notimestamp>
-                </configuration>
-            </plugin>
-        </plugins>
-    </build>
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-        </dependency>
-        <dependency>
-            <groupId>junit</groupId>
-            <artifactId>junit</artifactId>
-            <scope>test</scope>
-        </dependency>
-    </dependencies>
-
-</project>
diff --git a/impl/src/main/java/module-info.java b/impl/src/main/java/module-info.java
deleted file mode 100644
index efdd79a..0000000
--- a/impl/src/main/java/module-info.java
+++ /dev/null
@@ -1,21 +0,0 @@
-/*
- * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-module org.eclipse.jsonp {
-    requires transitive jakarta.json;
-    exports org.eclipse.jsonp.api;
-    provides jakarta.json.spi.JsonProvider with org.eclipse.jsonp.JsonProviderImpl;
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/BufferPoolImpl.java b/impl/src/main/java/org/eclipse/jsonp/BufferPoolImpl.java
deleted file mode 100644
index 141c3e2..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/BufferPoolImpl.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import java.lang.ref.WeakReference;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-/**
- * char[] pool that pool instances of char[] which are expensive to create.
- *
- * @author Jitendra Kotamraju
- */
-class BufferPoolImpl implements BufferPool {
-
-    // volatile since multiple threads may access queue reference
-    private volatile WeakReference<ConcurrentLinkedQueue<char[]>> queue;
-
-    /**
-     * Gets a new object from the pool.
-     *
-     * <p>
-     * If no object is available in the pool, this method creates a new one.
-     *
-     * @return
-     *      always non-null.
-     */
-    @Override
-    public final char[] take() {
-        char[] t = getQueue().poll();
-        if (t==null)
-            return new char[4096];
-        return t;
-    }
-
-    private ConcurrentLinkedQueue<char[]> getQueue() {
-        WeakReference<ConcurrentLinkedQueue<char[]>> q = queue;
-        if (q != null) {
-            ConcurrentLinkedQueue<char[]> d = q.get();
-            if (d != null)
-                return d;
-        }
-
-        // overwrite the queue
-        ConcurrentLinkedQueue<char[]> d = new ConcurrentLinkedQueue<>();
-        queue = new WeakReference<>(d);
-
-        return d;
-    }
-
-    /**
-     * Returns an object back to the pool.
-     */
-    @Override
-    public final void recycle(char[] t) {
-        getQueue().offer(t);
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonArrayBuilderImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonArrayBuilderImpl.java
deleted file mode 100644
index 8f7412b..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonArrayBuilderImpl.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.*;
-import java.io.StringWriter;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.AbstractList;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * JsonArrayBuilder implementation
- *
- * @author Jitendra Kotamraju
- * @author Kin-man Chung
- */
-
-class JsonArrayBuilderImpl implements JsonArrayBuilder {
-    private ArrayList<JsonValue> valueList;
-    private final BufferPool bufferPool;
-
-    JsonArrayBuilderImpl(BufferPool bufferPool) {
-        this.bufferPool = bufferPool;
-    }
-
-    JsonArrayBuilderImpl(JsonArray array, BufferPool bufferPool) {
-        this.bufferPool = bufferPool;
-        valueList = new ArrayList<>();
-        valueList.addAll(array);
-    }
-
-    JsonArrayBuilderImpl(Collection<?> collection, BufferPool bufferPool) {
-        this.bufferPool = bufferPool;
-        valueList = new ArrayList<>();
-        populate(collection);
-    }
-
-    @Override
-    public JsonArrayBuilder add(JsonValue value) {
-        validateValue(value);
-        addValueList(value);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(String value) {
-        validateValue(value);
-        addValueList(new JsonStringImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(BigDecimal value) {
-        validateValue(value);
-        addValueList(JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(BigInteger value) {
-        validateValue(value);
-        addValueList(JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int value) {
-        addValueList(JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(long value) {
-        addValueList(JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(double value) {
-        addValueList(JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(boolean value) {
-        addValueList(value ? JsonValue.TRUE : JsonValue.FALSE);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder addNull() {
-        addValueList(JsonValue.NULL);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(JsonObjectBuilder builder) {
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.ARRBUILDER_OBJECT_BUILDER_NULL());
-        }
-        addValueList(builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(JsonArrayBuilder builder) {
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.ARRBUILDER_ARRAY_BUILDER_NULL());
-        }
-        addValueList(builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder addAll(JsonArrayBuilder builder) {
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.ARRBUILDER_ARRAY_BUILDER_NULL());
-        }
-        if (valueList == null) {
-            valueList = new ArrayList<>();
-        }
-        valueList.addAll(builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, JsonValue value) {
-        validateValue(value);
-        addValueList(index, value);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, String value) {
-        validateValue(value);
-        addValueList(index, new JsonStringImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, BigDecimal value) {
-        validateValue(value);
-        addValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, BigInteger value) {
-        validateValue(value);
-        addValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, int value) {
-        addValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, long value) {
-        addValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, double value) {
-        addValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, boolean value) {
-        addValueList(index, value ? JsonValue.TRUE : JsonValue.FALSE);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder addNull(int index) {
-        addValueList(index, JsonValue.NULL);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, JsonObjectBuilder builder) {
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.ARRBUILDER_OBJECT_BUILDER_NULL());
-        }
-        addValueList(index, builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder add(int index, JsonArrayBuilder builder) {
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.ARRBUILDER_OBJECT_BUILDER_NULL());
-        }
-        addValueList(index, builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, JsonValue value) {
-        validateValue(value);
-        setValueList(index, value);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, String value) {
-        validateValue(value);
-        setValueList(index, new JsonStringImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, BigDecimal value) {
-        validateValue(value);
-        setValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, BigInteger value) {
-        validateValue(value);
-        setValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, int value) {
-        setValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, long value) {
-        setValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, double value) {
-        setValueList(index, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, boolean value) {
-        setValueList(index, value ? JsonValue.TRUE : JsonValue.FALSE);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder setNull(int index) {
-        setValueList(index, JsonValue.NULL);
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, JsonObjectBuilder builder) {
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.ARRBUILDER_OBJECT_BUILDER_NULL());
-        }
-        setValueList(index, builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder set(int index, JsonArrayBuilder builder) {
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.ARRBUILDER_OBJECT_BUILDER_NULL());
-        }
-        setValueList(index, builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonArrayBuilder remove(int index) {
-        if (valueList == null) {
-            throw new IndexOutOfBoundsException(JsonMessages.ARRBUILDER_VALUELIST_NULL(index, 0));
-        }
-        valueList.remove(index);
-        return this;
-    }
-
-    @Override
-    public JsonArray build() {
-        List<JsonValue> snapshot;
-        if (valueList == null) {
-            snapshot = Collections.emptyList();
-        } else {
-            // Should we trim to minimize storage ?
-            // valueList.trimToSize();
-            snapshot = Collections.unmodifiableList(valueList);
-        }
-        valueList = null;
-        return new JsonArrayImpl(snapshot, bufferPool);
-    }
-
-    private void populate(Collection<?> collection) {
-        for (Object value : collection) {
-            if (value != null && value instanceof Optional) {
-                ((Optional<?>) value).ifPresent(v ->
-                        this.valueList.add(MapUtil.handle(v, bufferPool)));
-            } else {
-                this.valueList.add(MapUtil.handle(value, bufferPool));
-            }
-        }
-    }
-
-    private void addValueList(JsonValue value) {
-        if (valueList == null) {
-            valueList = new ArrayList<>();
-        }
-        valueList.add(value);
-    }
-
-    private void addValueList(int index, JsonValue value) {
-        if (valueList == null) {
-            valueList = new ArrayList<>();
-        }
-        valueList.add(index, value);
-    }
-
-    private void setValueList(int index, JsonValue value) {
-        if (valueList == null) {
-            throw new IndexOutOfBoundsException(JsonMessages.ARRBUILDER_VALUELIST_NULL(index, 0));
-        }
-        valueList.set(index, value);
-    }
-
-    private void validateValue(Object value) {
-        if (value == null) {
-            throw new NullPointerException(JsonMessages.ARRBUILDER_VALUE_NULL());
-        }
-    }
-
-    private static final class JsonArrayImpl extends AbstractList<JsonValue> implements JsonArray {
-        private final List<JsonValue> valueList;    // Unmodifiable
-        private final BufferPool bufferPool;
-        private int hashCode;
-
-        JsonArrayImpl(List<JsonValue> valueList, BufferPool bufferPool) {
-            this.valueList = valueList;
-            this.bufferPool = bufferPool;
-        }
-
-        @Override
-        public int size() {
-            return valueList.size();
-        }
-
-        @Override
-        public JsonObject getJsonObject(int index) {
-            return (JsonObject)valueList.get(index);
-        }
-
-        @Override
-        public JsonArray getJsonArray(int index) {
-            return (JsonArray)valueList.get(index);
-        }
-
-        @Override
-        public JsonNumber getJsonNumber(int index) {
-            return (JsonNumber)valueList.get(index);
-        }
-
-        @Override
-        public JsonString getJsonString(int index) {
-            return (JsonString)valueList.get(index);
-        }
-
-        @Override
-        @SuppressWarnings("unchecked")
-        public <T extends JsonValue> List<T> getValuesAs(Class<T> clazz) {
-            return (List<T>)valueList;
-        }
-
-        @Override
-        public String getString(int index) {
-            return getJsonString(index).getString();
-        }
-
-        @Override
-        public String getString(int index, String defaultValue) {
-            try {
-                return getString(index);
-            } catch (Exception e) {
-                return defaultValue;
-            }
-        }
-
-        @Override
-        public int getInt(int index) {
-            return getJsonNumber(index).intValue();
-        }
-
-        @Override
-        public int getInt(int index, int defaultValue) {
-            try {
-                return getInt(index);
-            } catch (Exception e) {
-                return defaultValue;
-            }
-        }
-
-        @Override
-        public boolean getBoolean(int index) {
-            JsonValue jsonValue = get(index);
-            if (jsonValue == JsonValue.TRUE) {
-                return true;
-            } else if (jsonValue == JsonValue.FALSE) {
-                return false;
-            } else {
-                throw new ClassCastException();
-            }
-        }
-
-        @Override
-        public boolean getBoolean(int index, boolean defaultValue) {
-            try {
-                return getBoolean(index);
-            } catch (Exception e) {
-                return defaultValue;
-            }
-        }
-
-        @Override
-        public boolean isNull(int index) {
-            return valueList.get(index).equals(JsonValue.NULL);
-        }
-
-        @Override
-        public ValueType getValueType() {
-            return ValueType.ARRAY;
-        }
-
-        @Override
-        public JsonValue get(int index) {
-            return valueList.get(index);
-        }
-
-        @Override
-        public int hashCode() {
-            if (hashCode == 0) {
-                hashCode = super.hashCode();
-            }
-            return hashCode;
-        }
-
-        @Override
-        public String toString() {
-            StringWriter sw = new StringWriter();
-            try (JsonWriter jw = new JsonWriterImpl(sw, bufferPool)) {
-                jw.write(this);
-            }
-            return sw.toString();
-        }
-
-        @Override
-        public JsonArray asJsonArray() {
-            return this;
-        }
-    }
-}
-
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonBuilderFactoryImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonBuilderFactoryImpl.java
deleted file mode 100644
index a1618a9..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonBuilderFactoryImpl.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import java.util.Collection;
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.JsonObject;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonBuilderFactory;
-import jakarta.json.JsonObjectBuilder;
-import java.util.Collections;
-import java.util.Map;
-
-/**
- * @author Jitendra Kotamraju
- */
-class JsonBuilderFactoryImpl implements JsonBuilderFactory {
-    private final Map<String, ?> config;
-    private final BufferPool bufferPool;
-    private final boolean rejectDuplicateKeys;
-
-    JsonBuilderFactoryImpl(BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        this.config = Collections.emptyMap();
-        this.bufferPool = bufferPool;
-        this.rejectDuplicateKeys = rejectDuplicateKeys;
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder() {
-        return new JsonObjectBuilderImpl(bufferPool, rejectDuplicateKeys);
-    }
- 
-    @Override
-    public JsonObjectBuilder createObjectBuilder(JsonObject object) {
-        return new JsonObjectBuilderImpl(object, bufferPool, rejectDuplicateKeys);
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder(Map<String, Object> object) {
-        return new JsonObjectBuilderImpl(object, bufferPool, rejectDuplicateKeys);
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder() {
-        return new JsonArrayBuilderImpl(bufferPool);
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder(JsonArray array) {
-        return new JsonArrayBuilderImpl(array, bufferPool);
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder(Collection<?> collection) {
-        return new JsonArrayBuilderImpl(collection, bufferPool);
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return config;
-    }
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonGeneratorFactoryImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonGeneratorFactoryImpl.java
deleted file mode 100644
index a8babb3..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonGeneratorFactoryImpl.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonGeneratorFactory;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.util.Map;
-
-/**
- * @author Jitendra Kotamraju
- */
-class JsonGeneratorFactoryImpl implements JsonGeneratorFactory {
-
-    private final boolean prettyPrinting;
-    private final Map<String, ?> config;    // unmodifiable map
-    private final BufferPool bufferPool;
-
-    JsonGeneratorFactoryImpl(Map<String, ?> config, boolean prettyPrinting,
-            BufferPool bufferPool) {
-        this.config = config;
-        this.prettyPrinting = prettyPrinting;
-        this.bufferPool = bufferPool;
-    }
-
-    @Override
-    public JsonGenerator createGenerator(Writer writer) {
-        return prettyPrinting
-                ? new JsonPrettyGeneratorImpl(writer, bufferPool)
-                : new JsonGeneratorImpl(writer, bufferPool);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(OutputStream out) {
-        return prettyPrinting
-                ? new JsonPrettyGeneratorImpl(out, bufferPool)
-                : new JsonGeneratorImpl(out, bufferPool);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(OutputStream out, Charset charset) {
-        return prettyPrinting
-                ? new JsonPrettyGeneratorImpl(out, charset, bufferPool)
-                : new JsonGeneratorImpl(out, charset, bufferPool);
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return config;
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonGeneratorImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonGeneratorImpl.java
deleted file mode 100644
index dd64d2b..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonGeneratorImpl.java
+++ /dev/null
@@ -1,733 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonGenerationException;
-import jakarta.json.stream.JsonGenerator;
-import java.io.*;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.Map;
-
-/**
- * @author Jitendra Kotamraju
- */
-class JsonGeneratorImpl implements JsonGenerator {
-
-    private static final char[] INT_MIN_VALUE_CHARS = "-2147483648".toCharArray();
-    private static final int[] INT_CHARS_SIZE_TABLE = { 9, 99, 999, 9999, 99999,
-            999999, 9999999, 99999999, 999999999, Integer.MAX_VALUE };
-
-    private static final char [] DIGIT_TENS = {
-            '0', '0', '0', '0', '0', '0', '0', '0', '0', '0',
-            '1', '1', '1', '1', '1', '1', '1', '1', '1', '1',
-            '2', '2', '2', '2', '2', '2', '2', '2', '2', '2',
-            '3', '3', '3', '3', '3', '3', '3', '3', '3', '3',
-            '4', '4', '4', '4', '4', '4', '4', '4', '4', '4',
-            '5', '5', '5', '5', '5', '5', '5', '5', '5', '5',
-            '6', '6', '6', '6', '6', '6', '6', '6', '6', '6',
-            '7', '7', '7', '7', '7', '7', '7', '7', '7', '7',
-            '8', '8', '8', '8', '8', '8', '8', '8', '8', '8',
-            '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',
-    } ;
-
-    private static final char [] DIGIT_ONES = {
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
-    } ;
-
-    /**
-     * All possible chars for representing a number as a String
-     */
-    private static final char[] DIGITS = {
-            '0' , '1' , '2' , '3' , '4' , '5' ,
-            '6' , '7' , '8' , '9'
-    };
-
-    private static enum Scope {
-        IN_NONE,
-        IN_OBJECT,
-        IN_FIELD,
-        IN_ARRAY
-    }
-
-    private final BufferPool bufferPool;
-    private final Writer writer;
-    private Context currentContext = new Context(Scope.IN_NONE);
-    private final Deque<Context> stack = new ArrayDeque<>();
-
-    // Using own buffering mechanism as JDK's BufferedWriter uses synchronized
-    // methods. Also, flushBuffer() is useful when you don't want to actually
-    // flush the underlying output source
-    private final char buf[];     // capacity >= INT_MIN_VALUE_CHARS.length
-    private int len = 0;
-
-    JsonGeneratorImpl(Writer writer, BufferPool bufferPool) {
-        this.writer = writer;
-        this.bufferPool = bufferPool;
-        this.buf = bufferPool.take();
-    }
-
-    JsonGeneratorImpl(OutputStream out, BufferPool bufferPool) {
-        this(out, StandardCharsets.UTF_8, bufferPool);
-    }
-
-    JsonGeneratorImpl(OutputStream out, Charset encoding, BufferPool bufferPool) {
-        this(new OutputStreamWriter(out, encoding), bufferPool);
-    }
-
-    @Override
-    public void flush() {
-        flushBuffer();
-        try {
-            writer.flush();
-        } catch (IOException ioe) {
-            throw new JsonException(JsonMessages.GENERATOR_FLUSH_IO_ERR(), ioe);
-        }
-    }
-
-    @Override
-    public JsonGenerator writeStartObject() {
-        if (currentContext.scope == Scope.IN_OBJECT) {
-            throw new JsonGenerationException(JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        if (currentContext.scope == Scope.IN_NONE && !currentContext.first) {
-            throw new JsonGenerationException(JsonMessages.GENERATOR_ILLEGAL_MULTIPLE_TEXT());
-        }
-        writeComma();
-        writeChar('{');
-        stack.push(currentContext);
-        currentContext = new Context(Scope.IN_OBJECT);
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartObject(String name) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        writeChar('{');
-        stack.push(currentContext);
-        currentContext = new Context(Scope.IN_OBJECT);
-        return this;
-    }
-
-    private JsonGenerator writeName(String name) {
-        writeComma();
-        writeEscapedString(name);
-        writeColon();
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, String fieldValue) {
-        write(name, (CharSequence) fieldValue);
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, int value) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        writeInt(value);
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, long value) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        writeString(String.valueOf(value));
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, double value) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        if (Double.isInfinite(value) || Double.isNaN(value)) {
-            throw new NumberFormatException(JsonMessages.GENERATOR_DOUBLE_INFINITE_NAN());
-        }
-        writeName(name);
-        writeString(String.valueOf(value));
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, BigInteger value) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        writeString(String.valueOf(value));
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, BigDecimal value) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        writeString(String.valueOf(value));
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, boolean value) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        writeString(value? "true" : "false");
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeNull(String name) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        writeString("null");
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(JsonValue value) {
-        checkContextForValue();
-
-        switch (value.getValueType()) {
-            case ARRAY:
-                JsonArray array = (JsonArray)value;
-                writeStartArray();
-                for(JsonValue child: array) {
-                    write(child);
-                }
-                writeEnd();
-                break;
-            case OBJECT:
-                JsonObject object = (JsonObject)value;
-                writeStartObject();
-                for(Map.Entry<String, JsonValue> member: object.entrySet()) {
-                    write(member.getKey(), member.getValue());
-                }
-                writeEnd();
-                break;
-            case STRING:
-                JsonString str = (JsonString)value;
-                write(str.getString());
-                break;
-            case NUMBER:
-                JsonNumber number = (JsonNumber)value;
-                writeValue(number.toString());
-                popFieldContext();
-                break;
-            case TRUE:
-                write(true);
-                break;
-            case FALSE:
-                write(false);
-                break;
-            case NULL:
-                writeNull();
-                break;
-        }
-
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray() {
-        if (currentContext.scope == Scope.IN_OBJECT) {
-            throw new JsonGenerationException(JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        if (currentContext.scope == Scope.IN_NONE && !currentContext.first) {
-            throw new JsonGenerationException(JsonMessages.GENERATOR_ILLEGAL_MULTIPLE_TEXT());
-        }
-        writeComma();
-        writeChar('[');
-        stack.push(currentContext);
-        currentContext = new Context(Scope.IN_ARRAY);
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray(String name) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        writeChar('[');
-        stack.push(currentContext);
-        currentContext = new Context(Scope.IN_ARRAY);
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String name, JsonValue value) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        switch (value.getValueType()) {
-            case ARRAY:
-                JsonArray array = (JsonArray)value;
-                writeStartArray(name);
-                for(JsonValue child: array) {
-                    write(child);
-                }
-                writeEnd();
-                break;
-            case OBJECT:
-                JsonObject object = (JsonObject)value;
-                writeStartObject(name);
-                for(Map.Entry<String, JsonValue> member: object.entrySet()) {
-                    write(member.getKey(), member.getValue());
-                }
-                writeEnd();
-                break;
-            case STRING:
-                JsonString str = (JsonString)value;
-                write(name, str.getChars());
-                break;
-            case NUMBER:
-                JsonNumber number = (JsonNumber)value;
-                writeValue(name, number.toString());
-                break;
-            case TRUE:
-                write(name, true);
-                break;
-            case FALSE:
-                write(name, false);
-                break;
-            case NULL:
-                writeNull(name);
-                break;
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(String value) {
-        checkContextForValue();
-        writeComma();
-        writeEscapedString(value);
-        popFieldContext();
-        return this;
-    }
-
-
-    @Override
-    public JsonGenerator write(int value) {
-        checkContextForValue();
-        writeComma();
-        writeInt(value);
-        popFieldContext();
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(long value) {
-        checkContextForValue();
-        writeValue(String.valueOf(value));
-        popFieldContext();
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(double value) {
-        checkContextForValue();
-        if (Double.isInfinite(value) || Double.isNaN(value)) {
-            throw new NumberFormatException(JsonMessages.GENERATOR_DOUBLE_INFINITE_NAN());
-        }
-        writeValue(String.valueOf(value));
-        popFieldContext();
-        return this;
-    }
-
-    @Override
-    public JsonGenerator write(BigInteger value) {
-        checkContextForValue();
-        writeValue(value.toString());
-        popFieldContext();
-        return this;
-    }
-
-    private void checkContextForValue() {
-        if ((!currentContext.first && currentContext.scope != Scope.IN_ARRAY && currentContext.scope != Scope.IN_FIELD)
-                || (currentContext.first && currentContext.scope == Scope.IN_OBJECT)) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-    }
-
-    @Override
-    public JsonGenerator write(BigDecimal value) {
-        checkContextForValue();
-        writeValue(value.toString());
-        popFieldContext();
-
-        return this;
-    }
-
-    private void popFieldContext() {
-        if (currentContext.scope == Scope.IN_FIELD) {
-            currentContext = stack.pop();
-        }
-    }
-
-    @Override
-    public JsonGenerator write(boolean value) {
-        checkContextForValue();
-        writeComma();
-        writeString(value ? "true" : "false");
-        popFieldContext();
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeNull() {
-        checkContextForValue();
-        writeComma();
-        writeString("null");
-        popFieldContext();
-        return this;
-    }
-
-    private void writeValue(String value) {
-        writeComma();
-        writeString(value);
-    }
-
-    private void writeValue(String name, String value) {
-        writeComma();
-        writeEscapedString(name);
-        writeColon();
-        writeString(value);
-    }
-
-    @Override
-    public JsonGenerator writeKey(String name) {
-        if (currentContext.scope != Scope.IN_OBJECT) {
-            throw new JsonGenerationException(
-                    JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-        }
-        writeName(name);
-        stack.push(currentContext);
-        currentContext = new Context(Scope.IN_FIELD);
-        currentContext.first = false;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeEnd() {
-        if (currentContext.scope == Scope.IN_NONE) {
-            throw new JsonGenerationException("writeEnd() cannot be called in no context");
-        }
-        writeChar(currentContext.scope == Scope.IN_ARRAY ? ']' : '}');
-        currentContext = stack.pop();
-        popFieldContext();
-        return this;
-    }
-
-    void write(String name, CharSequence fieldValue) {
-      if (currentContext.scope != Scope.IN_OBJECT) {
-          throw new JsonGenerationException(
-                  JsonMessages.GENERATOR_ILLEGAL_METHOD(currentContext.scope));
-      }
-      writeName(name);
-      writeEscapedString(fieldValue);
-    }
-
-    protected void writeComma() {
-        if (isCommaAllowed()) {
-            writeChar(',');
-        }
-        currentContext.first = false;
-    }
-
-    protected boolean inNone() {
-        return currentContext.scope == Scope.IN_NONE;
-    }
-
-    boolean isCommaAllowed() {
-        return !currentContext.first && currentContext.scope != Scope.IN_FIELD;
-    }
-
-    protected void writeColon() {
-        writeChar(':');
-    }
-
-    private static class Context {
-        boolean first = true;
-        final Scope scope;
-
-        Context(Scope scope) {
-            this.scope = scope;
-        }
-
-    }
-
-    @Override
-    public void close() {
-        if (currentContext.scope != Scope.IN_NONE || currentContext.first) {
-            throw new JsonGenerationException(JsonMessages.GENERATOR_INCOMPLETE_JSON());
-        }
-        flushBuffer();
-        try {
-            writer.close();
-        } catch (IOException ioe) {
-            throw new JsonException(JsonMessages.GENERATOR_CLOSE_IO_ERR(), ioe);
-        }
-        bufferPool.recycle(buf);
-    }
-
-    // begin, end-1 indexes represent characters that need not
-    // be escaped
-    //
-    // XXXssssssssssssXXXXXXXXXXXXXXXXXXXXXXrrrrrrrrrrrrrrXXXXXX
-    //    ^           ^                     ^             ^
-    //    |           |                     |             |
-    //   begin       end                   begin         end
-    void writeEscapedString(CharSequence string) {
-        writeChar('"');
-        int len = string.length();
-        for(int i = 0; i < len; i++) {
-            int begin = i, end = i;
-            char c = string.charAt(i);
-            // find all the characters that need not be escaped
-            // unescaped = %x20-21 | %x23-5B | %x5D-10FFFF
-            while(c >= 0x20 && c <= 0x10ffff && c != 0x22 && c != 0x5c) {
-                i++; end = i;
-                if (i < len) {
-                    c = string.charAt(i);
-                } else {
-                    break;
-                }
-            }
-            // Write characters without escaping
-            if (begin < end) {
-                writeString(string, begin, end);
-                if (i == len) {
-                    break;
-                }
-            }
-
-            switch (c) {
-                case '"':
-                case '\\':
-                    writeChar('\\'); writeChar(c);
-                    break;
-                case '\b':
-                    writeChar('\\'); writeChar('b');
-                    break;
-                case '\f':
-                    writeChar('\\'); writeChar('f');
-                    break;
-                case '\n':
-                    writeChar('\\'); writeChar('n');
-                    break;
-                case '\r':
-                    writeChar('\\'); writeChar('r');
-                    break;
-                case '\t':
-                    writeChar('\\'); writeChar('t');
-                    break;
-                default:
-                    String hex = "000" + Integer.toHexString(c);
-                    writeString("\\u" + hex.substring(hex.length() - 4));
-            }
-        }
-        writeChar('"');
-    }
-
-    void writeString(CharSequence str, int begin, int end) {
-        while (begin < end) {       // source begin and end indexes
-            int no = Math.min(buf.length - len, end - begin);
-            if (str instanceof String) {
-              ((String)str).getChars(begin, begin + no, buf, len);
-            } else {
-              // if passed a non-string, assume this is deliberate
-              getChars(str, begin, begin + no, buf, len);
-            }
-            begin += no;            // Increment source index
-            len += no;              // Increment dest index
-            if (len >= buf.length) {
-                flushBuffer();
-            }
-        }
-    }
-
-    void writeString(CharSequence str) {
-        writeString(str, 0, str.length());
-    }
-
-    void writeChar(char c) {
-        if (len >= buf.length) {
-            flushBuffer();
-        }
-        buf[len++] = c;
-    }
-
-    // Not using Integer.toString() since it creates intermediary String
-    // Also, we want the chars to be copied to our buffer directly
-    void writeInt(int num) {
-        int size;
-        if (num == Integer.MIN_VALUE) {
-            size = INT_MIN_VALUE_CHARS.length;
-        } else {
-            size = (num < 0) ? stringSize(-num) + 1 : stringSize(num);
-        }
-        if (len+size >= buf.length) {
-            flushBuffer();
-        }
-        if (num == Integer.MIN_VALUE) {
-            System.arraycopy(INT_MIN_VALUE_CHARS, 0, buf, len, size);
-        } else {
-            fillIntChars(num, buf, len+size);
-        }
-        len += size;
-    }
-
-    // flushBuffer writes the buffered contents to writer. But incase of
-    // byte stream, an OuputStreamWriter is created and that buffers too.
-    // We may need to call OutputStreamWriter#flushBuffer() using
-    // reflection if that is really required (commented out below)
-    void flushBuffer() {
-        try {
-            if (len > 0) {
-                writer.write(buf, 0, len);
-                len = 0;
-            }
-        } catch (IOException ioe) {
-            throw new JsonException(JsonMessages.GENERATOR_WRITE_IO_ERR(), ioe);
-        }
-    }
-
-//    private static final Method flushBufferMethod;
-//    static {
-//        Method m = null;
-//        try {
-//            m = OutputStreamWriter.class.getDeclaredMethod("flushBuffer");
-//            m.setAccessible(true);
-//        } catch (Exception e) {
-//            // no-op
-//        }
-//        flushBufferMethod = m;
-//    }
-//    void flushBufferOSW() {
-//        flushBuffer();
-//        if (writer instanceof OutputStreamWriter) {
-//            try {
-//                flushBufferMethod.invoke(writer);
-//            } catch (Exception e) {
-//                // no-op
-//            }
-//        }
-//    }
-
-    // Requires positive x
-    private static int stringSize(int x) {
-        for (int i=0; ; i++)
-            if (x <= INT_CHARS_SIZE_TABLE[i])
-                return i+1;
-    }
-
-    void getChars(CharSequence str, int srcBegin, int srcEnd, char[] dst, int dstBegin) {
-      int length = srcEnd - srcBegin;
-      for (int i = 0 ; i < length ; i++) {
-        int srcIdx = srcBegin + i;
-        int dstIdx = dstBegin + i;
-        dst[dstIdx] = str.charAt(srcIdx);
-      }
-    }
-
-    /**
-     * Places characters representing the integer i into the
-     * character array buf. The characters are placed into
-     * the buffer backwards starting with the least significant
-     * digit at the specified index (exclusive), and working
-     * backwards from there.
-     *
-     * Will fail if i == Integer.MIN_VALUE
-     */
-    private static void fillIntChars(int i, char[] buf, int index) {
-        int q, r;
-        int charPos = index;
-        char sign = 0;
-
-        if (i < 0) {
-            sign = '-';
-            i = -i;
-        }
-
-        // Generate two digits per iteration
-        while (i >= 65536) {
-            q = i / 100;
-            // really: r = i - (q * 100);
-            r = i - ((q << 6) + (q << 5) + (q << 2));
-            i = q;
-            buf [--charPos] = DIGIT_ONES[r];
-            buf [--charPos] = DIGIT_TENS[r];
-        }
-
-        // Fall thru to fast mode for smaller numbers
-        // assert(i <= 65536, i);
-        for (;;) {
-            q = (i * 52429) >>> (16+3);
-            r = i - ((q << 3) + (q << 1));  // r = i-(q*10) ...
-            buf [--charPos] = DIGITS[r];
-            i = q;
-            if (i == 0) break;
-        }
-        if (sign != 0) {
-            buf [--charPos] = sign;
-        }
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonLocationImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonLocationImpl.java
deleted file mode 100644
index 484386f..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonLocationImpl.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.stream.JsonLocation;
-
-/**
- * @author Jitendra Kotamraju
- */
-class JsonLocationImpl implements JsonLocation {
-    static final JsonLocation UNKNOWN = new JsonLocationImpl(-1, -1, -1);
-
-    private final long columnNo;
-    private final long lineNo;
-    private final long offset;
-
-    JsonLocationImpl(long lineNo, long columnNo, long streamOffset) {
-        this.lineNo = lineNo;
-        this.columnNo = columnNo;
-        this.offset = streamOffset;
-    }
-
-    @Override
-    public long getLineNumber() {
-        return lineNo;
-    }
-
-    @Override
-    public long getColumnNumber() {
-        return columnNo;
-    }
-
-    @Override
-    public long getStreamOffset() {
-        return offset;
-    }
-
-    @Override
-    public String toString() {
-        return "(line no="+lineNo+", column no="+columnNo+", offset="+ offset +")";
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonMergePatchImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonMergePatchImpl.java
deleted file mode 100644
index 05d2161..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonMergePatchImpl.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.JsonMergePatch;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonObjectBuilder;
-import jakarta.json.JsonValue;
-
-/**
- * This class is an implementation of a JSON Merge Patch as specified in
- * <a href="http://tools.ietf.org/html/rfc7396">RFC 7396</a>.
- *
- * @since 1.1
- */
-
-public final class JsonMergePatchImpl implements JsonMergePatch {
-
-    private JsonValue patch;
-
-    public JsonMergePatchImpl(JsonValue patch) {
-        this.patch = patch;
-    }
-
-    @Override
-    public JsonValue apply(JsonValue target) {
-        return mergePatch(target, patch);
-    }
-
-    @Override
-    public JsonValue toJsonValue() {
-        return patch;
-    }
-    /**
-     * Applies the specified patch to the specified target.
-     * The target is not modified by the patch.
-     *
-     * @param target the {@code JsonValue} to apply the patch operations
-     * @param patch the patch
-     * @return the {@code JsonValue} as the result of applying the patch
-     *    operations on the target.
-     */
-    private static JsonValue mergePatch(JsonValue target, JsonValue patch) {
-
-        if (patch.getValueType() != JsonValue.ValueType.OBJECT) {
-            return patch;
-        }
-        if (target.getValueType() != JsonValue.ValueType.OBJECT) {
-            target = JsonValue.EMPTY_JSON_OBJECT;
-        }
-        JsonObject targetJsonObject = target.asJsonObject();
-        JsonObjectBuilder builder =
-            new JsonObjectBuilderImpl(targetJsonObject, JsonUtil.getInternalBufferPool());
-        patch.asJsonObject().forEach((key, value) -> {
-            if (value == JsonValue.NULL) {
-                if (targetJsonObject.containsKey(key)) {
-                    builder.remove(key);
-                }
-            } else if (targetJsonObject.containsKey(key)) {
-                builder.add(key, mergePatch(targetJsonObject.get(key), value));
-            } else {
-                builder.add(key, mergePatch(JsonValue.EMPTY_JSON_OBJECT, value));
-            }
-        });
-        return builder.build();
-    }
-
-    /**
-     * Generate a JSON Merge Patch from the source and target {@code JsonValue}.
-     * @param source the source
-     * @param target the target
-     * @return a JSON Patch which when applied to the source, yields the target
-     */
-    static JsonValue diff(JsonValue source, JsonValue target) {
-        if (source.getValueType() != JsonValue.ValueType.OBJECT ||
-                target.getValueType() != JsonValue.ValueType.OBJECT) {
-            return target;
-        }
-        JsonObject s = (JsonObject) source;
-        JsonObject t = (JsonObject) target;
-        JsonObjectBuilder builder = new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool());
-        // First find members to be replaced or removed
-        s.forEach((key, value) -> {
-            if (t.containsKey(key)) {
-                // key present in both.
-                if (! value.equals(t.get(key))) {
-                    // If the values are equal, nop, else get diff for the values
-                    builder.add(key, diff(value, t.get(key)));
-                }
-            } else {
-                builder.addNull(key);
-            }
-        });
-        // Then find members to be added
-        t.forEach((key, value) -> {
-            if (! s.containsKey(key))
-                builder.add(key, value);
-        });
-        return builder.build();
-    }
-
-}
-
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonMessages.java b/impl/src/main/java/org/eclipse/jsonp/JsonMessages.java
deleted file mode 100644
index e717311..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonMessages.java
+++ /dev/null
@@ -1,294 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-
-import jakarta.json.stream.JsonLocation;
-import jakarta.json.stream.JsonParser;
-import java.text.MessageFormat;
-import java.util.ResourceBundle;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonValue;
-
-/**
- * Defines string formatting method for each constant in the resource file
- *
- * @author Jitendra Kotamraju
- */
-final class JsonMessages {
-    private static final ResourceBundle BUNDLE =
-            ResourceBundle.getBundle("org.eclipse.jsonp.messages");
-
-    // global/shared messages
-    static String INTERNAL_ERROR() {
-        return localize("internal.error");
-    }
-
-    // tokenizer messages
-    static String TOKENIZER_UNEXPECTED_CHAR(int unexpected, JsonLocation location) {
-        return localize("tokenizer.unexpected.char", unexpected, location);
-    }
-
-    static String TOKENIZER_EXPECTED_CHAR(int unexpected, JsonLocation location, char expected) {
-        return localize("tokenizer.expected.char", unexpected, location, expected);
-    }
-
-    static String TOKENIZER_IO_ERR() {
-        return localize("tokenizer.io.err");
-    }
-
-
-    // parser messages
-    static String PARSER_GETSTRING_ERR(JsonParser.Event event) {
-        return localize("parser.getString.err", event);
-    }
-
-    static String PARSER_ISINTEGRALNUMBER_ERR(JsonParser.Event event) {
-        return localize("parser.isIntegralNumber.err", event);
-    }
-
-    static String PARSER_GETINT_ERR(JsonParser.Event event) {
-        return localize("parser.getInt.err", event);
-    }
-
-    static String PARSER_GETLONG_ERR(JsonParser.Event event) {
-        return localize("parser.getLong.err", event);
-    }
-
-    static String PARSER_GETBIGDECIMAL_ERR(JsonParser.Event event) {
-        return localize("parser.getBigDecimal.err", event);
-    }
-
-    static String PARSER_GETARRAY_ERR(JsonParser.Event event) {
-        return localize("parser.getArray.err", event);
-    }
-
-    static String PARSER_GETOBJECT_ERR(JsonParser.Event event) {
-        return localize("parser.getObject.err", event);
-    }
-
-    static String PARSER_GETVALUE_ERR(JsonParser.Event event) {
-        return localize("parser.getValue.err", event);
-    }
-
-    static String PARSER_GETVALUESTREAM_ERR() {
-        return localize("parser.getValueStream.err");
-    }
-
-    static String PARSER_EXPECTED_EOF(JsonTokenizer.JsonToken token) {
-        return localize("parser.expected.eof", token);
-    }
-
-    static String PARSER_TOKENIZER_CLOSE_IO() {
-        return localize("parser.tokenizer.close.io");
-    }
-
-    static String PARSER_INVALID_TOKEN(JsonTokenizer.JsonToken token, JsonLocation location, String expectedTokens) {
-        return localize("parser.invalid.token", token, location, expectedTokens);
-    }
-
-    static String PARSER_STATE_ERR(JsonValue.ValueType type) {
-        return localize("parser.state.err", type);
-    }
-
-    static String PARSER_SCOPE_ERR(JsonValue value) {
-        return localize("parser.scope.err", value);
-    }
-
-    static String PARSER_INPUT_ENC_DETECT_FAILED() {
-        return localize("parser.input.enc.detect.failed");
-    }
-
-    static String PARSER_INPUT_ENC_DETECT_IOERR() {
-        return localize("parser.input.enc.detect.ioerr");
-    }
-    
-    static String DUPLICATE_KEY(String name) {
-        return localize("parser.duplicate.key", name);
-    }
-
-    // generator messages
-    static String GENERATOR_FLUSH_IO_ERR() {
-        return localize("generator.flush.io.err");
-    }
-
-    static String GENERATOR_CLOSE_IO_ERR() {
-        return localize("generator.close.io.err");
-    }
-
-    static String GENERATOR_WRITE_IO_ERR() {
-        return localize("generator.write.io.err");
-    }
-
-    static String GENERATOR_ILLEGAL_METHOD(Object scope) {
-        return localize("generator.illegal.method", scope);
-    }
-
-    static String GENERATOR_DOUBLE_INFINITE_NAN() {
-        return localize("generator.double.infinite.nan");
-    }
-
-    static String GENERATOR_INCOMPLETE_JSON() {
-        return localize("generator.incomplete.json");
-    }
-
-    static String GENERATOR_ILLEGAL_MULTIPLE_TEXT() {
-        return localize("generator.illegal.multiple.text");
-    }
-
-
-
-    // writer messages
-    static String WRITER_WRITE_ALREADY_CALLED() {
-        return localize("writer.write.already.called");
-    }
-
-    // reader messages
-    static String READER_READ_ALREADY_CALLED() {
-        return localize("reader.read.already.called");
-    }
-
-
-    // obj builder messages
-    static String OBJBUILDER_NAME_NULL() {
-        return localize("objbuilder.name.null");
-    }
-
-    static String OBJBUILDER_VALUE_NULL() {
-        return localize("objbuilder.value.null");
-    }
-
-    static String OBJBUILDER_OBJECT_BUILDER_NULL() {
-        return localize("objbuilder.object.builder.null");
-    }
-
-    static String OBJBUILDER_ARRAY_BUILDER_NULL() {
-        return localize("objbuilder.array.builder.null");
-    }
-
-
-    // array builder messages
-    static String ARRBUILDER_VALUE_NULL() {
-        return localize("arrbuilder.value.null");
-    }
-
-    static String ARRBUILDER_OBJECT_BUILDER_NULL() {
-        return localize("arrbuilder.object.builder.null");
-    }
-
-    static String ARRBUILDER_ARRAY_BUILDER_NULL() {
-        return localize("arrbuilder.array.builder.null");
-    }
-
-    static String ARRBUILDER_VALUELIST_NULL(int index, int size) {
-        return localize("arrbuilder.valuelist.null", index, size);
-    }
-
-    // json pointer messages
-    static String POINTER_FORMAT_INVALID() {
-        return localize("pointer.format.invalid");
-    }
-
-    static String POINTER_MAPPING_MISSING(JsonObject object, String key) {
-        return localize("pointer.mapping.missing", object, key);
-    }
-
-    static String POINTER_REFERENCE_INVALID(JsonValue.ValueType type) {
-        return localize("pointer.reference.invalid", type.name());
-    }
-
-    static String POINTER_ARRAY_INDEX_ERR(String token) {
-        return localize("pointer.array.index.err", token);
-    }
-
-    static String POINTER_ARRAY_INDEX_ILLEGAL(String token) {
-        return localize("pointer.array.index.illegal", token);
-    }
-
-    // nodereference messages
-    static String NODEREF_VALUE_ADD_ERR() {
-        return localize("noderef.value.add.err");
-    }
-
-    static String NODEREF_VALUE_CANNOT_REMOVE() {
-        return localize("noderef.value.cannot.remove");
-    }
-
-    static String NODEREF_OBJECT_MISSING(String key) {
-        return localize("noderef.object.missing", key);
-    }
-
-    static String NODEREF_ARRAY_INDEX_ERR(int index, int size) {
-        return localize("noderef.array.index.err", index, size);
-    }
-
-    // json patch messages
-    static String PATCH_MUST_BE_ARRAY() {
-        return localize("patch.must.be.array");
-    }
-
-    static String PATCH_MOVE_PROPER_PREFIX(String from, String path) {
-        return localize("patch.move.proper.prefix", from, path);
-    }
-
-    static String PATCH_MOVE_TARGET_NULL(String from) {
-        return localize("patch.move.target.null", from);
-    }
-
-    static String PATCH_TEST_FAILED(String path, String value) {
-        return localize("patch.test.failed", path, value);
-    }
-
-    static String PATCH_ILLEGAL_OPERATION(String operation) {
-        return localize("patch.illegal.operation", operation);
-    }
-
-    static String PATCH_MEMBER_MISSING(String operation, String member) {
-        return localize("patch.member.missing", operation, member);
-    }
-
-    static String PATCH_OPERATION_MISSING() {
-        return localize("patch.operation.missing");
-    }
-
-
-    private static String localize(String key, Object ... args) {
-        try {
-            String msg = BUNDLE.getString(key);
-            return MessageFormat.format(msg, args);
-        } catch (Exception e) {
-            return getDefaultMessage(key, args);
-        }
-    }
-
-    private static String getDefaultMessage(String key, Object ... args) {
-        StringBuilder sb = new StringBuilder();
-        sb.append("[failed to localize] ");
-        sb.append(key);
-        if (args != null) {
-            sb.append('(');
-            for (int i = 0; i < args.length; ++i) {
-                if (i != 0)
-                    sb.append(", ");
-                sb.append(String.valueOf(args[i]));
-            }
-            sb.append(')');
-        }
-        return sb.toString();
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonNumberImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonNumberImpl.java
deleted file mode 100644
index 80fbf16..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonNumberImpl.java
+++ /dev/null
@@ -1,269 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.JsonNumber;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * JsonNumber impl. Subclasses provide optimized implementations
- * when backed by int, long, BigDecimal
- *
- * @author Jitendra Kotamraju
- */
-abstract class JsonNumberImpl implements JsonNumber {
-
-    private int hashCode;
-
-    static JsonNumber getJsonNumber(int num) {
-        return new JsonIntNumber(num);
-    }
-
-    static JsonNumber getJsonNumber(long num) {
-        return new JsonLongNumber(num);
-    }
-
-    static JsonNumber getJsonNumber(BigInteger value) {
-        return new JsonBigDecimalNumber(new BigDecimal(value));
-    }
-
-    static JsonNumber getJsonNumber(double value) {
-        //bigDecimal = new BigDecimal(value);
-        // This is the preferred way to convert double to BigDecimal
-        return new JsonBigDecimalNumber(BigDecimal.valueOf(value));
-    }
-
-    static JsonNumber getJsonNumber(BigDecimal value) {
-        return new JsonBigDecimalNumber(value);
-    }
-
-    // Optimized JsonNumber impl for int numbers.
-    private static final class JsonIntNumber extends JsonNumberImpl {
-        private final int num;
-        private BigDecimal bigDecimal;  // assigning it lazily on demand
-
-        JsonIntNumber(int num) {
-            this.num = num;
-        }
-
-        @Override
-        public boolean isIntegral() {
-            return true;
-        }
-
-        @Override
-        public int intValue() {
-            return num;
-        }
-
-        @Override
-        public int intValueExact() {
-            return num;
-        }
-
-        @Override
-        public long longValue() {
-            return num;
-        }
-
-        @Override
-        public long longValueExact() {
-            return num;
-        }
-
-        @Override
-        public double doubleValue() {
-            return num;
-        }
-
-        @Override
-        public BigDecimal bigDecimalValue() {
-            // reference assignments are atomic. At the most some more temp
-            // BigDecimal objects are created
-            BigDecimal bd = bigDecimal;
-            if (bd == null) {
-                bigDecimal = bd = new BigDecimal(num);
-            }
-            return bd;
-        }
-
-        @Override
-        public Number numberValue() {
-            return num;
-        }
-
-        @Override
-        public String toString() {
-            return Integer.toString(num);
-        }
-    }
-
-    // Optimized JsonNumber impl for long numbers.
-    private static final class JsonLongNumber extends JsonNumberImpl {
-        private final long num;
-        private BigDecimal bigDecimal;  // assigning it lazily on demand
-
-        JsonLongNumber(long num) {
-            this.num = num;
-        }
-
-        @Override
-        public boolean isIntegral() {
-            return true;
-        }
-
-        @Override
-        public int intValue() {
-            return (int) num;
-        }
-
-        @Override
-        public int intValueExact() {
-            return Math.toIntExact(num);
-        }
-
-        @Override
-        public long longValue() {
-            return num;
-        }
-
-        @Override
-        public long longValueExact() {
-            return num;
-        }
-
-        @Override
-        public double doubleValue() {
-            return num;
-        }
-
-        @Override
-        public BigDecimal bigDecimalValue() {
-            // reference assignments are atomic. At the most some more temp
-            // BigDecimal objects are created
-            BigDecimal bd = bigDecimal;
-            if (bd == null) {
-                bigDecimal = bd = new BigDecimal(num);
-            }
-            return bd;
-        }
-
-        @Override
-        public Number numberValue() {
-            return num;
-        }
-
-        @Override
-        public String toString() {
-            return Long.toString(num);
-        }
-
-    }
-
-    // JsonNumber impl using BigDecimal numbers.
-    private static final class JsonBigDecimalNumber extends JsonNumberImpl {
-        private final BigDecimal bigDecimal;
-
-        JsonBigDecimalNumber(BigDecimal value) {
-            this.bigDecimal = value;
-        }
-
-        @Override
-        public BigDecimal bigDecimalValue() {
-            return bigDecimal;
-        }
-
-        @Override
-        public Number numberValue() {
-            return bigDecimalValue();
-        }
-
-    }
-
-    @Override
-    public boolean isIntegral() {
-        return bigDecimalValue().scale() == 0;
-    }
-
-    @Override
-    public int intValue() {
-        return bigDecimalValue().intValue();
-    }
-
-    @Override
-    public int intValueExact() {
-        return bigDecimalValue().intValueExact();
-    }
-
-    @Override
-    public long longValue() {
-        return bigDecimalValue().longValue();
-    }
-
-    @Override
-    public long longValueExact() {
-        return bigDecimalValue().longValueExact();
-    }
-
-    @Override
-    public double doubleValue() {
-        return bigDecimalValue().doubleValue();
-    }
-
-    @Override
-    public BigInteger bigIntegerValue() {
-        return bigDecimalValue().toBigInteger();
-    }
-
-    @Override
-    public BigInteger bigIntegerValueExact() {
-        return bigDecimalValue().toBigIntegerExact();
-    }
-
-    @Override
-    public ValueType getValueType() {
-        return ValueType.NUMBER;
-    }
-
-    @Override
-    public int hashCode() {
-        if (hashCode == 0) {
-            hashCode = bigDecimalValue().hashCode();
-        }
-        return hashCode;
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj){
-            return true;
-        }
-        if (!(obj instanceof JsonNumber)) {
-            return false;
-        }
-        JsonNumber other = (JsonNumber)obj;
-        return bigDecimalValue().equals(other.bigDecimalValue());
-    }
-
-    @Override
-    public String toString() {
-        return bigDecimalValue().toString();
-    }
-
-}
-
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonObjectBuilderImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonObjectBuilderImpl.java
deleted file mode 100644
index 393115c..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonObjectBuilderImpl.java
+++ /dev/null
@@ -1,366 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.*;
-import java.io.StringWriter;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.*;
-
-/**
- * JsonObjectBuilder implementation
- *
- * @author Jitendra Kotamraju
- * @author Kin-man Chung
- */
-class JsonObjectBuilderImpl implements JsonObjectBuilder {
-
-    protected Map<String, JsonValue> valueMap;
-    private final BufferPool bufferPool;
-    private final boolean rejectDuplicateKeys;
-
-    JsonObjectBuilderImpl(BufferPool bufferPool) {
-        this.bufferPool = bufferPool;
-        rejectDuplicateKeys = false;
-    }
-    
-    JsonObjectBuilderImpl(BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        this.bufferPool = bufferPool;
-        this.rejectDuplicateKeys = rejectDuplicateKeys;
-    }
-
-    JsonObjectBuilderImpl(JsonObject object, BufferPool bufferPool) {
-        this.bufferPool = bufferPool;
-        valueMap = new LinkedHashMap<>();
-        valueMap.putAll(object);
-        rejectDuplicateKeys = false;
-    }
-    
-    JsonObjectBuilderImpl(JsonObject object, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        this.bufferPool = bufferPool;
-        valueMap = new LinkedHashMap<>();
-        valueMap.putAll(object);
-        this.rejectDuplicateKeys = rejectDuplicateKeys;
-    }
-
-    JsonObjectBuilderImpl(Map<String, Object> map, BufferPool bufferPool) {
-        this.bufferPool = bufferPool;
-        valueMap = new LinkedHashMap<>();
-        populate(map);
-        rejectDuplicateKeys = false;
-    }
-    
-    JsonObjectBuilderImpl(Map<String, Object> map, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-    	this.bufferPool = bufferPool;
-    	valueMap = new LinkedHashMap<>();
-    	populate(map);
-    	this.rejectDuplicateKeys = rejectDuplicateKeys;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, JsonValue value) {
-        validateName(name);
-        validateValue(value);
-        putValueMap(name, value);
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, String value) {
-        validateName(name);
-        validateValue(value);
-        putValueMap(name, new JsonStringImpl(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, BigInteger value) {
-        validateName(name);
-        validateValue(value);
-        putValueMap(name, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, BigDecimal value) {
-        validateName(name);
-        validateValue(value);
-        putValueMap(name, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, int value) {
-        validateName(name);
-        putValueMap(name, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, long value) {
-        validateName(name);
-        putValueMap(name, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, double value) {
-        validateName(name);
-        putValueMap(name, JsonNumberImpl.getJsonNumber(value));
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, boolean value) {
-        validateName(name);
-        putValueMap(name, value ? JsonValue.TRUE : JsonValue.FALSE);
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder addNull(String name) {
-        validateName(name);
-        putValueMap(name, JsonValue.NULL);
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, JsonObjectBuilder builder) {
-        validateName(name);
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.OBJBUILDER_OBJECT_BUILDER_NULL());
-        }
-        putValueMap(name, builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder add(String name, JsonArrayBuilder builder) {
-        validateName(name);
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.OBJBUILDER_ARRAY_BUILDER_NULL());
-        }
-        putValueMap(name, builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder addAll(JsonObjectBuilder builder) {
-        if (builder == null) {
-            throw new NullPointerException(JsonMessages.OBJBUILDER_OBJECT_BUILDER_NULL());
-        }
-        if (valueMap == null) {
-            this.valueMap = new LinkedHashMap<>();
-        }
-        this.valueMap.putAll(builder.build());
-        return this;
-    }
-
-    @Override
-    public JsonObjectBuilder remove(String name) {
-        validateName(name);
-        this.valueMap.remove(name);
-        return this;
-    }
-
-    @Override
-    public JsonObject build() {
-        Map<String, JsonValue> snapshot = (valueMap == null)
-                ? Collections.<String, JsonValue>emptyMap()
-                : Collections.unmodifiableMap(valueMap);
-        valueMap = null;
-        return new JsonObjectImpl(snapshot, bufferPool);
-    }
-
-    private void populate(Map<String, Object> map) {
-        final Set<String> fields = map.keySet();
-        for (String field : fields) {
-            Object value = map.get(field);
-            if (value != null && value instanceof Optional) {
-                ((Optional<?>) value).ifPresent(v ->
-                        this.valueMap.put(field, MapUtil.handle(v, bufferPool)));
-            } else {
-                this.valueMap.put(field, MapUtil.handle(value, bufferPool));
-            }
-        }
-    }
-
-    private void putValueMap(String name, JsonValue value) {
-        if (valueMap == null) {
-            this.valueMap = new LinkedHashMap<>();
-        }
-        JsonValue previousValue = valueMap.put(name, value);
-        if (rejectDuplicateKeys && previousValue != null) {
-            throw new IllegalStateException(JsonMessages.DUPLICATE_KEY(name));
-        }
-    }
-
-    private void validateName(String name) {
-        if (name == null) {
-            throw new NullPointerException(JsonMessages.OBJBUILDER_NAME_NULL());
-        }
-    }
-
-    private void validateValue(Object value) {
-        if (value == null) {
-            throw new NullPointerException(JsonMessages.OBJBUILDER_VALUE_NULL());
-        }
-    }
-
-    private static final class JsonObjectImpl extends AbstractMap<String, JsonValue> implements JsonObject {
-        private final Map<String, JsonValue> valueMap;      // unmodifiable
-        private final BufferPool bufferPool;
-        private int hashCode;
-
-        JsonObjectImpl(Map<String, JsonValue> valueMap, BufferPool bufferPool) {
-            this.valueMap = valueMap;
-            this.bufferPool = bufferPool;
-        }
-
-        @Override
-        public JsonArray getJsonArray(String name) {
-            return (JsonArray)get(name);
-        }
-
-        @Override
-        public JsonObject getJsonObject(String name) {
-            return (JsonObject)get(name);
-        }
-
-        @Override
-        public JsonNumber getJsonNumber(String name) {
-            return (JsonNumber)get(name);
-        }
-
-        @Override
-        public JsonString getJsonString(String name) {
-            return (JsonString)get(name);
-        }
-
-        @Override
-        public String getString(String name) {
-            return getJsonString(name).getString();
-        }
-
-        @Override
-        public String getString(String name, String defaultValue) {
-            JsonValue value = get(name);
-            if (value instanceof JsonString) {
-                return ((JsonString) value).getString();
-            } else {
-                return defaultValue;
-            }
-        }
-
-        @Override
-        public int getInt(String name) {
-            return getJsonNumber(name).intValue();
-        }
-
-        @Override
-        public int getInt(String name, int defaultValue) {
-            JsonValue value = get(name);
-            if (value instanceof JsonNumber) {
-                return ((JsonNumber) value).intValue();
-            } else {
-                return defaultValue;
-            }
-        }
-
-        @Override
-        public boolean getBoolean(String name) {
-            JsonValue value = get(name);
-            if (value == null) {
-                throw new NullPointerException();
-            } else if (value == JsonValue.TRUE) {
-                return true;
-            } else if (value == JsonValue.FALSE) {
-                return false;
-            } else {
-                throw new ClassCastException();
-            }
-        }
-
-        @Override
-        public boolean getBoolean(String name, boolean defaultValue) {
-            JsonValue value = get(name);
-            if (value == JsonValue.TRUE) {
-                return true;
-            } else if (value == JsonValue.FALSE) {
-                return false;
-            } else {
-                return defaultValue;
-            }
-        }
-
-        @Override
-        public boolean isNull(String name) {
-            return get(name).equals(JsonValue.NULL);
-        }
-
-        @Override
-        public ValueType getValueType() {
-            return ValueType.OBJECT;
-        }
-
-        @Override
-        public Set<Entry<String, JsonValue>> entrySet() {
-            return valueMap.entrySet();
-        }
-
-        @Override
-        public int hashCode() {
-            if (hashCode == 0) {
-                hashCode = super.hashCode();
-            }
-            return hashCode;
-        }
-
-        @Override
-        public String toString() {
-            StringWriter sw = new StringWriter();
-            try (JsonWriter jw = new JsonWriterImpl(sw, bufferPool)) {
-                jw.write(this);
-            }
-            return sw.toString();
-        }
-
-        @Override
-        public JsonObject asJsonObject() {
-            return this;
-        }
-
-        @Override
-        public int size() {
-            return valueMap.size();
-        }
-
-        @Override
-        public JsonValue get(Object key) {
-            return valueMap.get(key);
-        }
-
-        @Override
-        public boolean containsKey(Object key) {
-            return valueMap.containsKey(key);
-        }
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonParserFactoryImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonParserFactoryImpl.java
deleted file mode 100644
index f338885..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonParserFactoryImpl.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.stream.JsonParserFactory;
-import jakarta.json.stream.JsonParser;
-import java.io.InputStream;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.util.Collections;
-import java.util.Map;
-
-/**
- * @author Jitendra Kotamraju
- */
-class JsonParserFactoryImpl implements JsonParserFactory {
-    private final Map<String, ?> config = Collections.emptyMap();
-    private final BufferPool bufferPool;
-
-    JsonParserFactoryImpl(BufferPool bufferPool) {
-        this.bufferPool = bufferPool;
-    }
-
-    @Override
-    public JsonParser createParser(Reader reader) {
-        return new JsonParserImpl(reader, bufferPool);
-    }
-
-    @Override
-    public JsonParser createParser(InputStream in) {
-        return new JsonParserImpl(in, bufferPool);
-    }
-
-    @Override
-    public JsonParser createParser(InputStream in, Charset charset) {
-        return new JsonParserImpl(in, charset, bufferPool);
-    }
-
-    @Override
-    public JsonParser createParser(JsonArray array) {
-        return new JsonStructureParser(array);
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return config;
-    }
-
-    @Override
-    public JsonParser createParser(JsonObject object) {
-        return new JsonStructureParser(object);
-    }
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonParserImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonParserImpl.java
deleted file mode 100644
index ac993b4..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonParserImpl.java
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.math.BigDecimal;
-import java.nio.charset.Charset;
-import java.util.AbstractMap;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Spliterator;
-import java.util.Spliterators;
-import java.util.function.Consumer;
-import java.util.stream.Stream;
-import java.util.stream.StreamSupport;
-
-import jakarta.json.JsonArray;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonException;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonObjectBuilder;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonLocation;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParsingException;
-
-import org.eclipse.jsonp.JsonTokenizer.JsonToken;
-import org.eclipse.jsonp.api.BufferPool;
-
-/**
- * JSON parser implementation. NoneContext, ArrayContext, ObjectContext is used
- * to go to next parser state.
- *
- * @author Jitendra Kotamraju
- * @author Kin-man Chung
- */
-public class JsonParserImpl implements JsonParser {
-
-    private final BufferPool bufferPool;
-    private final boolean rejectDuplicateKeys;
-    private Context currentContext = new NoneContext();
-    private Event currentEvent;
-
-    private final Stack stack = new Stack();
-    private final JsonTokenizer tokenizer;
-
-    public JsonParserImpl(Reader reader, BufferPool bufferPool) {
-        this(reader, bufferPool, false);
-    }
-
-    public JsonParserImpl(Reader reader, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        this.bufferPool = bufferPool;
-        this.rejectDuplicateKeys = rejectDuplicateKeys;
-        tokenizer = new JsonTokenizer(reader, bufferPool);
-    }
-
-    public JsonParserImpl(InputStream in, BufferPool bufferPool) {
-        this(in, bufferPool, false);
-    }
-
-    public JsonParserImpl(InputStream in, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        this.bufferPool = bufferPool;
-        this.rejectDuplicateKeys = rejectDuplicateKeys;
-        UnicodeDetectingInputStream uin = new UnicodeDetectingInputStream(in);
-        tokenizer = new JsonTokenizer(new InputStreamReader(uin, uin.getCharset()), bufferPool);
-    }
-
-    public JsonParserImpl(InputStream in, Charset encoding, BufferPool bufferPool) {
-        this(in, encoding, bufferPool, false);
-    }
-
-    public JsonParserImpl(InputStream in, Charset encoding, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        this.bufferPool = bufferPool;
-        this.rejectDuplicateKeys = rejectDuplicateKeys;
-        tokenizer = new JsonTokenizer(new InputStreamReader(in, encoding), bufferPool);
-    }
-
-    @Override
-    public String getString() {
-        if (currentEvent == Event.KEY_NAME || currentEvent == Event.VALUE_STRING
-                || currentEvent == Event.VALUE_NUMBER) {
-            return tokenizer.getValue();
-        }
-        throw new IllegalStateException(
-                JsonMessages.PARSER_GETSTRING_ERR(currentEvent));
-    }
-
-    @Override
-    public boolean isIntegralNumber() {
-        if (currentEvent != Event.VALUE_NUMBER) {
-            throw new IllegalStateException(
-                    JsonMessages.PARSER_ISINTEGRALNUMBER_ERR(currentEvent));
-        }
-        return tokenizer.isIntegral();
-    }
-
-    @Override
-    public int getInt() {
-        if (currentEvent != Event.VALUE_NUMBER) {
-            throw new IllegalStateException(
-                    JsonMessages.PARSER_GETINT_ERR(currentEvent));
-        }
-        return tokenizer.getInt();
-    }
-
-    boolean isDefinitelyInt() {
-        return tokenizer.isDefinitelyInt();
-    }
-
-    boolean isDefinitelyLong() {
-        return tokenizer.isDefinitelyLong();
-    }
-
-    @Override
-    public long getLong() {
-        if (currentEvent != Event.VALUE_NUMBER) {
-            throw new IllegalStateException(
-                    JsonMessages.PARSER_GETLONG_ERR(currentEvent));
-        }
-        return tokenizer.getLong();
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        if (currentEvent != Event.VALUE_NUMBER) {
-            throw new IllegalStateException(
-                    JsonMessages.PARSER_GETBIGDECIMAL_ERR(currentEvent));
-        }
-        return tokenizer.getBigDecimal();
-    }
-
-    @Override
-    public JsonArray getArray() {
-        if (currentEvent != Event.START_ARRAY) {
-            throw new IllegalStateException(
-                JsonMessages.PARSER_GETARRAY_ERR(currentEvent));
-        }
-        return getArray(new JsonArrayBuilderImpl(bufferPool));
-    }
-
-    @Override
-    public JsonObject getObject() {
-        if (currentEvent != Event.START_OBJECT) {
-            throw new IllegalStateException(
-                JsonMessages.PARSER_GETOBJECT_ERR(currentEvent));
-        }
-        return getObject(new JsonObjectBuilderImpl(bufferPool, rejectDuplicateKeys));
-    }
-
-    @Override
-    public JsonValue getValue() {
-        switch (currentEvent) {
-            case START_ARRAY:
-                return getArray(new JsonArrayBuilderImpl(bufferPool));
-            case START_OBJECT:
-                return getObject(new JsonObjectBuilderImpl(bufferPool, rejectDuplicateKeys));
-            case KEY_NAME:
-            case VALUE_STRING:
-                return new JsonStringImpl(getCharSequence());
-            case VALUE_NUMBER:
-                if (isDefinitelyInt()) {
-                    return JsonNumberImpl.getJsonNumber(getInt());
-                } else if (isDefinitelyLong()) {
-                    return JsonNumberImpl.getJsonNumber(getLong());
-                }
-                return JsonNumberImpl.getJsonNumber(getBigDecimal());
-            case VALUE_TRUE:
-                return JsonValue.TRUE;
-            case VALUE_FALSE:
-                return JsonValue.FALSE;
-            case VALUE_NULL:
-                return JsonValue.NULL;
-            case END_ARRAY:
-            case END_OBJECT:
-            default:
-                throw new IllegalStateException(JsonMessages.PARSER_GETVALUE_ERR(currentEvent));
-        }
-    }
-
-    @Override
-    public Stream<JsonValue> getArrayStream() {
-        if (currentEvent != Event.START_ARRAY) {
-            throw new IllegalStateException(
-                JsonMessages.PARSER_GETARRAY_ERR(currentEvent));
-        }
-        Spliterator<JsonValue> spliterator =
-                new Spliterators.AbstractSpliterator<JsonValue>(Long.MAX_VALUE, Spliterator.ORDERED) {
-            @Override
-            public Spliterator<JsonValue> trySplit() {
-                return null;
-            }
-            @Override
-            public boolean tryAdvance(Consumer<? super JsonValue> action) {
-                if (action == null) {
-                    throw new NullPointerException();
-                }
-                if (! hasNext()) {
-                    return false;
-                }
-                if (next() == JsonParser.Event.END_ARRAY) {
-                    return false;
-                }
-                action.accept(getValue());
-                return true;
-            }
-        };
-        return StreamSupport.stream(spliterator, false);
-    }
-
-    @Override
-    public Stream<Map.Entry<String, JsonValue>> getObjectStream() {
-        if (currentEvent != Event.START_OBJECT) {
-            throw new IllegalStateException(
-                JsonMessages.PARSER_GETOBJECT_ERR(currentEvent));
-        }
-        Spliterator<Map.Entry<String, JsonValue>> spliterator =
-                new Spliterators.AbstractSpliterator<Map.Entry<String, JsonValue>>(Long.MAX_VALUE, Spliterator.ORDERED) {
-            @Override
-            public Spliterator<Map.Entry<String,JsonValue>> trySplit() {
-                return null;
-            }
-            @Override
-            public boolean tryAdvance(Consumer<? super Map.Entry<String, JsonValue>> action) {
-                if (action == null) {
-                    throw new NullPointerException();
-                }
-                if (! hasNext()) {
-                    return false;
-                }
-                JsonParser.Event e = next();
-                if (e == JsonParser.Event.END_OBJECT) {
-                    return false;
-                }
-                if (e != JsonParser.Event.KEY_NAME) {
-                    throw new JsonException(JsonMessages.INTERNAL_ERROR());
-                }
-                String key = getString();
-                if (! hasNext()) {
-                    throw new JsonException(JsonMessages.INTERNAL_ERROR());
-                }
-                next();
-                JsonValue value = getValue();
-                action.accept(new AbstractMap.SimpleImmutableEntry<>(key, value));
-                return true;
-            }
-        };
-        return StreamSupport.stream(spliterator, false);
-    }
-
-    @Override
-    public Stream<JsonValue> getValueStream() {
-        if (! (currentContext instanceof NoneContext)) {
-            throw new IllegalStateException(
-                JsonMessages.PARSER_GETVALUESTREAM_ERR());
-        }
-        Spliterator<JsonValue> spliterator =
-                new Spliterators.AbstractSpliterator<JsonValue>(Long.MAX_VALUE, Spliterator.ORDERED) {
-            @Override
-            public Spliterator<JsonValue> trySplit() {
-                return null;
-            }
-            @Override
-            public boolean tryAdvance(Consumer<? super JsonValue> action) {
-                if (action == null) {
-                    throw new NullPointerException();
-                }
-                if (! hasNext()) {
-                    return false;
-                }
-                next();
-                action.accept(getValue());
-                return true;
-            }
-        };
-        return StreamSupport.stream(spliterator, false);
-    }
-
-    @Override
-    public void skipArray() {
-        if (currentEvent == Event.START_ARRAY) {
-            currentContext.skip();
-            currentContext = stack.pop();
-            currentEvent = Event.END_ARRAY;
-        }
-    }
-
-    @Override
-    public void skipObject() {
-        if (currentEvent == Event.START_OBJECT) {
-            currentContext.skip();
-            currentContext = stack.pop();
-            currentEvent = Event.END_OBJECT;
-        }
-    }
-
-    private JsonArray getArray(JsonArrayBuilder builder) {
-        while(hasNext()) {
-            JsonParser.Event e = next();
-            if (e == JsonParser.Event.END_ARRAY) {
-                return builder.build();
-            }
-            builder.add(getValue());
-        }
-        throw parsingException(JsonToken.EOF, "[CURLYOPEN, SQUAREOPEN, STRING, NUMBER, TRUE, FALSE, NULL, SQUARECLOSE]");
-    }
-
-    private CharSequence getCharSequence() {
-      if (currentEvent == Event.KEY_NAME || currentEvent == Event.VALUE_STRING
-              || currentEvent == Event.VALUE_NUMBER) {
-          return tokenizer.getCharSequence();
-      }
-      throw new IllegalStateException(JsonMessages.PARSER_GETSTRING_ERR(currentEvent));
-  }
-
-    private JsonObject getObject(JsonObjectBuilder builder) {
-        while(hasNext()) {
-            JsonParser.Event e = next();
-            if (e == JsonParser.Event.END_OBJECT) {
-                return builder.build();
-            }
-            String key = getString();
-            next();
-            builder.add(key, getValue());
-        }
-        throw parsingException(JsonToken.EOF, "[STRING, CURLYCLOSE]");
-    }
-
-    @Override
-    public JsonLocation getLocation() {
-        return tokenizer.getLocation();
-    }
-
-    public JsonLocation getLastCharLocation() {
-        return tokenizer.getLastCharLocation();
-    }
-
-    @Override
-    public boolean hasNext() {
-        if (stack.isEmpty() && (currentEvent != null && currentEvent.compareTo(Event.KEY_NAME) > 0)) {
-            JsonToken token = tokenizer.nextToken();
-            if (token != JsonToken.EOF) {
-                throw new JsonParsingException(JsonMessages.PARSER_EXPECTED_EOF(token),
-                        getLastCharLocation());
-            }
-            return false;
-        } else if (!stack.isEmpty() && !tokenizer.hasNextToken()) {
-            currentEvent = currentContext.getNextEvent();
-            return false;
-        }
-        return true;
-    }
-
-    @Override
-    public Event next() {
-        if (!hasNext()) {
-            throw new NoSuchElementException();
-        }
-        return currentEvent = currentContext.getNextEvent();
-    }
-
-    @Override
-    public void close() {
-        try {
-            tokenizer.close();
-        } catch (IOException e) {
-            throw new JsonException(JsonMessages.PARSER_TOKENIZER_CLOSE_IO(), e);
-        }
-    }
-
-    // Using the optimized stack impl as we don't require other things
-    // like iterator etc.
-    private static final class Stack {
-        private Context head;
-
-        private void push(Context context) {
-            context.next = head;
-            head = context;
-        }
-
-        private Context pop() {
-            if (head == null) {
-                throw new NoSuchElementException();
-            }
-            Context temp = head;
-            head = head.next;
-            return temp;
-        }
-
-        private Context peek() {
-            return head;
-        }
-
-        private boolean isEmpty() {
-            return head == null;
-        }
-    }
-
-    private abstract class Context {
-        Context next;
-        abstract Event getNextEvent();
-        abstract void skip();
-    }
-
-    private final class NoneContext extends Context {
-        @Override
-        public Event getNextEvent() {
-            // Handle 1. {   2. [   3. value
-            JsonToken token = tokenizer.nextToken();
-            if (token == JsonToken.CURLYOPEN) {
-                stack.push(currentContext);
-                currentContext = new ObjectContext();
-                return Event.START_OBJECT;
-            } else if (token == JsonToken.SQUAREOPEN) {
-                stack.push(currentContext);
-                currentContext = new ArrayContext();
-                return Event.START_ARRAY;
-            } else if (token.isValue()) {
-                return token.getEvent();
-            }
-            throw parsingException(token, "[CURLYOPEN, SQUAREOPEN, STRING, NUMBER, TRUE, FALSE, NULL]");
-        }
-
-        @Override
-        void skip() {
-            // no-op
-        }
-    }
-
-    private JsonParsingException parsingException(JsonToken token, String expectedTokens) {
-        JsonLocation location = getLastCharLocation();
-        return new JsonParsingException(
-                JsonMessages.PARSER_INVALID_TOKEN(token, location, expectedTokens), location);
-    }
-
-    private final class ObjectContext extends Context {
-        private boolean firstValue = true;
-
-        /*
-         * Some more things could be optimized. For example, instead
-         * tokenizer.nextToken(), one could use tokenizer.matchColonToken() to
-         * match ':'. That might optimize a bit, but will fragment nextToken().
-         * I think the current one is more readable.
-         *
-         */
-        @Override
-        public Event getNextEvent() {
-            // Handle 1. }   2. name:value   3. ,name:value
-            JsonToken token = tokenizer.nextToken();
-            if (token == JsonToken.EOF) {
-                switch (currentEvent) {
-                    case START_OBJECT:
-                        throw parsingException(token, "[STRING, CURLYCLOSE]");
-                    case KEY_NAME:
-                        throw parsingException(token, "[COLON]");
-                    default:
-                        throw parsingException(token, "[COMMA, CURLYCLOSE]");
-                }
-            } else if (currentEvent == Event.KEY_NAME) {
-                // Handle 1. :value
-                if (token != JsonToken.COLON) {
-                    throw parsingException(token, "[COLON]");
-                }
-                token = tokenizer.nextToken();
-                if (token.isValue()) {
-                    return token.getEvent();
-                } else if (token == JsonToken.CURLYOPEN) {
-                    stack.push(currentContext);
-                    currentContext = new ObjectContext();
-                    return Event.START_OBJECT;
-                } else if (token == JsonToken.SQUAREOPEN) {
-                    stack.push(currentContext);
-                    currentContext = new ArrayContext();
-                    return Event.START_ARRAY;
-                }
-                throw parsingException(token, "[CURLYOPEN, SQUAREOPEN, STRING, NUMBER, TRUE, FALSE, NULL]");
-            } else {
-                // Handle 1. }   2. name   3. ,name
-                if (token == JsonToken.CURLYCLOSE) {
-                    currentContext = stack.pop();
-                    return Event.END_OBJECT;
-                }
-                if (firstValue) {
-                    firstValue = false;
-                } else {
-                    if (token != JsonToken.COMMA) {
-                        throw parsingException(token, "[COMMA]");
-                    }
-                    token = tokenizer.nextToken();
-                }
-                if (token == JsonToken.STRING) {
-                    return Event.KEY_NAME;
-                }
-                throw parsingException(token, "[STRING]");
-            }
-        }
-
-        @Override
-        void skip() {
-            JsonToken token;
-            int depth = 1;
-            do {
-                token = tokenizer.nextToken();
-                switch (token) {
-                    case CURLYCLOSE:
-                        depth--;
-                        break;
-                    case CURLYOPEN:
-                        depth++;
-                        break;
-                }
-            } while (!(token == JsonToken.CURLYCLOSE && depth == 0));
-        }
-
-    }
-
-    private final class ArrayContext extends Context {
-        private boolean firstValue = true;
-
-        // Handle 1. ]   2. value   3. ,value
-        @Override
-        public Event getNextEvent() {
-            JsonToken token = tokenizer.nextToken();
-            if (token == JsonToken.EOF) {
-                switch (currentEvent) {
-                    case START_ARRAY:
-                        throw parsingException(token, "[CURLYOPEN, SQUAREOPEN, STRING, NUMBER, TRUE, FALSE, NULL]");
-                    default:
-                        throw parsingException(token, "[COMMA, CURLYCLOSE]");
-                }
-            }
-            if (token == JsonToken.SQUARECLOSE) {
-                currentContext = stack.pop();
-                return Event.END_ARRAY;
-            }
-            if (firstValue) {
-                firstValue = false;
-            } else {
-                if (token != JsonToken.COMMA) {
-                    throw parsingException(token, "[COMMA]");
-                }
-                token = tokenizer.nextToken();
-            }
-            if (token.isValue()) {
-                return token.getEvent();
-            } else if (token == JsonToken.CURLYOPEN) {
-                stack.push(currentContext);
-                currentContext = new ObjectContext();
-                return Event.START_OBJECT;
-            } else if (token == JsonToken.SQUAREOPEN) {
-                stack.push(currentContext);
-                currentContext = new ArrayContext();
-                return Event.START_ARRAY;
-            }
-            throw parsingException(token, "[CURLYOPEN, SQUAREOPEN, STRING, NUMBER, TRUE, FALSE, NULL]");
-        }
-
-        @Override
-        void skip() {
-            JsonToken token;
-            int depth = 1;
-            do {
-                token = tokenizer.nextToken();
-                switch (token) {
-                    case SQUARECLOSE:
-                        depth--;
-                        break;
-                    case SQUAREOPEN:
-                        depth++;
-                        break;
-                }
-            } while (!(token == JsonToken.SQUARECLOSE && depth == 0));
-        }
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonPatchBuilderImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonPatchBuilderImpl.java
deleted file mode 100644
index 6c436f3..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonPatchBuilderImpl.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.JsonArray;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonException;
-import jakarta.json.JsonPatch;
-import jakarta.json.JsonPatch.Operation;
-import jakarta.json.JsonPatchBuilder;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-
-/**
- * A builder for constructing a JSON Patch by adding
- * JSON Patch operations incrementally.
- * <p>
- * The following illustrates the approach.
- * <pre>
- *   JsonPatchBuilder builder = Json.createPatchBuilder();
- *   JsonPatch patch = builder.add("/John/phones/office", "1234-567")
- *                            .remove("/Amy/age")
- *                            .build();
- * </pre>
- * The result is equivalent to the following JSON Patch.
- * <pre>
- * [
- *    {"op" = "add", "path" = "/John/phones/office", "value" = "1234-567"},
- *    {"op" = "remove", "path" = "/Amy/age"}
- * ] </pre>
- *
- * @since 1.1
- */
-public final class JsonPatchBuilderImpl implements JsonPatchBuilder {
-
-    private final JsonArrayBuilder builder;
-
-    /**
-     * Creates a JsonPatchBuilderImpl, starting with the specified
-     * JSON Patch
-     * @param patch the JSON Patch
-     */
-    public JsonPatchBuilderImpl(JsonArray patch) {
-        builder = new JsonArrayBuilderImpl(patch, JsonUtil.getInternalBufferPool());
-    }
-
-    /**
-     * Creates JsonPatchBuilderImpl with empty JSON Patch
-     */
-    public JsonPatchBuilderImpl() {
-        builder = new JsonArrayBuilderImpl(JsonUtil.getInternalBufferPool());
-    }
-
-    /**
-     * A convenience method for {@code new JsonPatchImpl(build()).apply(target)}.
-     * The target is not modified by the patch.
-     *
-     * @param <T> the target type, must be a subtype of {@link JsonStructure}
-     * @param target the target to apply the patch operations
-     * @return the transformed target after the patch
-     * @throws JsonException if the supplied JSON Patch is malformed or if
-     *    it contains references to non-existing members
-     */
-    public <T extends JsonStructure> T apply(T target) {
-        return build().apply(target);
-    }
-
-    /**
-     * Adds an "add" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder add(String path, JsonValue value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.ADD.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                   );
-        return this;
-    }
-
-    /**
-     * Adds an "add" JSON Patch operation
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder add(String path, String value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.ADD.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                   );
-        return this;
-    }
-
-    /**
-     * Adds an "add" JSON Patch operation
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder add(String path, int value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.ADD.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds an "add" JSON Patch operation
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder add(String path, boolean value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.ADD.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                   );
-        return this;
-    }
-
-    /**
-     * Adds a "remove" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder remove(String path) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.REMOVE.operationName())
-                           .add("path", path)
-                    );
-        return this;
-    }
-
-    /**
-     * Adds a "replace" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder replace(String path, JsonValue value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.REPLACE.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "replace" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder replace(String path, String value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.REPLACE.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "replace" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder replace(String path, int value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.REPLACE.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "replace" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder replace(String path, boolean value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.REPLACE.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "move" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param from the "from" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder move(String path, String from) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.MOVE.operationName())
-                           .add("path", path)
-                           .add("from", from)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "copy" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param from the "from" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder copy(String path, String from) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.COPY.operationName())
-                           .add("path", path)
-                           .add("from", from)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "test" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder test(String path, JsonValue value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.TEST.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "test" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder test(String path, String value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.TEST.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "test" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder test(String path, int value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.TEST.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Adds a "test" JSON Patch operation.
-     * @param path the "path" member of the operation
-     * @param value the "value" member of the operation
-     * @return this JsonPatchBuilder
-     */
-    @Override
-    public JsonPatchBuilder test(String path, boolean value) {
-        builder.add(new JsonObjectBuilderImpl(JsonUtil.getInternalBufferPool())
-                           .add("op", Operation.TEST.operationName())
-                           .add("path", path)
-                           .add("value", value)
-                  );
-        return this;
-    }
-
-    /**
-     * Returns the patch operations in a JsonArray
-     * @return the patch operations in a JsonArray
-     */
-    public JsonArray buildAsJsonArray() {
-        return builder.build();
-    }
-
-    /**
-     * Returns the patch operation in a JsonPatch
-     * @return the patch operation in a JsonPatch
-     */
-    @Override
-    public JsonPatch build() {
-        return new JsonPatchImpl(buildAsJsonArray());
-    }
-}
-
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonPatchImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonPatchImpl.java
deleted file mode 100644
index e285b6d..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonPatchImpl.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonException;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPatch;
-import jakarta.json.JsonPatchBuilder;
-import jakarta.json.JsonPointer;
-import jakarta.json.JsonString;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-import jakarta.json.JsonValue.ValueType;
-
-/**
- * This class is an immutable representation of a JSON Patch as specified in
- * <a href="http://tools.ietf.org/html/rfc6902">RFC 6902</a>.
- * <p>A {@code JsonPatch} can be instantiated with {@link Json#createPatch(JsonArray)}
- * by specifying the patch operations in a JSON Patch. Alternately, it
- * can also be constructed with a {@link JsonPatchBuilder}.
- * </p>
- * The following illustrates both approaches.
- * <p>1. Construct a JsonPatch with a JSON Patch.
- * <pre>{@code
- *   JsonArray contacts = ... // The target to be patched
- *   JsonArray patch = ...  ; // JSON Patch
- *   JsonPatch jsonpatch = Json.createPatch(patch);
- *   JsonArray result = jsonpatch.apply(contacts);
- * } </pre>
- * 2. Construct a JsonPatch with JsonPatchBuilder.
- * <pre>{@code
- *   JsonPatchBuilder builder = Json.createPatchBuilder();
- *   JsonArray result = builder.add("/John/phones/office", "1234-567")
- *                             .remove("/Amy/age")
- *                             .build()
- *                             .apply(contacts);
- * } </pre>
- *
- * @since 1.1
- */
-public class JsonPatchImpl implements JsonPatch {
-
-    private final JsonArray patch;
-
-    /**
-     * Constructs a JsonPatchImpl
-     * @param patch the JSON Patch
-     */
-    public JsonPatchImpl(JsonArray patch) {
-        this.patch = patch;
-    }
-
-    /**
-     * Compares this {@code JsonPatchImpl} with another object.
-     * @param obj the object to compare this {@code JsonPatchImpl} against
-     * @return true if the given object is a {@code JsonPatchImpl} with the same
-     * reference tokens as this one, false otherwise.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null || obj.getClass() != JsonPatchImpl.class)
-            return false;
-        return patch.equals(((JsonPatchImpl)obj).patch);
-    }
-
-    /**
-     * Returns the hash code value for this {@code JsonPatchImpl}.
-     *
-     * @return the hash code value for this {@code JsonPatchImpl} object
-     */
-    @Override
-    public int hashCode() {
-        return patch.hashCode();
-    }
-
-    /**
-     * Returns the JSON Patch text
-     * @return the JSON Patch text
-     */
-    @Override
-    public String toString() {
-        return patch.toString();
-    }
-
-    /**
-     * Applies the patch operations to the specified {@code target}.
-     * The target is not modified by the patch.
-     *
-     * @param target the target to apply the patch operations
-     * @return the transformed target after the patch
-     * @throws JsonException if the supplied JSON Patch is malformed or if
-     *    it contains references to non-existing members
-     */
-    @Override
-    public JsonStructure apply(JsonStructure target) {
-
-        JsonStructure result = target;
-
-        for (JsonValue operation: patch) {
-            if (operation.getValueType() != ValueType.OBJECT) {
-                throw new JsonException(JsonMessages.PATCH_MUST_BE_ARRAY());
-            }
-            result = apply(result, (JsonObject) operation);
-        }
-        return result;
-    }
-
-    @Override
-    public JsonArray toJsonArray() {
-        return patch;
-    }
-
-    /**
-     * Generates a JSON Patch from the source and target {@code JsonStructure}.
-     * The generated JSON Patch need not be unique.
-     * @param source the source
-     * @param target the target, must be the same type as the source
-     * @return a JSON Patch which when applied to the source, yields the target
-     */
-    public static JsonArray diff(JsonStructure source, JsonStructure target) {
-        return (new DiffGenerator()).diff(source, target);
-    }
-
-    /**
-     * Applies a JSON Patch operation to the target.
-     * @param target the target to apply the operation
-     * @param operation the JSON Patch operation
-     * @return the target after the patch
-     */
-    private JsonStructure apply(JsonStructure target, JsonObject operation) {
-
-        JsonPointer pointer = getPointer(operation, "path");
-        JsonPointer from;
-        JsonString op = operation.getJsonString("op");
-        if (op == null) {
-            throw new JsonException(JsonMessages.PATCH_OPERATION_MISSING());
-        }
-        switch (Operation.fromOperationName(op.getString())) {
-            case ADD:
-                return pointer.add(target, getValue(operation));
-            case REPLACE:
-                return pointer.replace(target, getValue(operation));
-            case REMOVE:
-                return pointer.remove(target);
-            case COPY:
-                from = getPointer(operation, "from");
-                return pointer.add(target, from.getValue(target));
-            case MOVE:
-                // Check if from is a proper prefix of path
-                String dest = operation.getString("path");
-                String src = operation.getString("from");
-                if (dest.startsWith(src) && src.length() < dest.length()) {
-                    throw new JsonException(JsonMessages.PATCH_MOVE_PROPER_PREFIX(src, dest));
-                }
-                from = getPointer(operation, "from");
-                // Check if 'from' exists in target object
-                if (!from.containsValue(target)) {
-                    throw new JsonException(JsonMessages.PATCH_MOVE_TARGET_NULL(src));
-                }
-                if (pointer.equals(from)) {
-                    // nop
-                    return target;
-                }
-                return pointer.add(from.remove(target), from.getValue(target));
-            case TEST:
-                if (! getValue(operation).equals(pointer.getValue(target))) {
-                    throw new JsonException(JsonMessages.PATCH_TEST_FAILED(operation.getString("path"), getValue(operation).toString()));
-                }
-                return target;
-            default:
-                throw new JsonException(JsonMessages.PATCH_ILLEGAL_OPERATION(operation.getString("op")));
-        }
-    }
-
-    private JsonPointer getPointer(JsonObject operation, String member) {
-        JsonString pointerString = operation.getJsonString(member);
-        if (pointerString == null) {
-            missingMember(operation.getString("op"), member);
-        }
-        return new JsonPointerImpl(pointerString.getString());
-    }
-
-    private JsonValue getValue(JsonObject operation) {
-        JsonValue value = operation.get("value");
-        if (value == null) {
-            missingMember(operation.getString("op"), "value");
-        }
-        return value;
-    }
-
-    private void missingMember(String op, String  member) {
-        throw new JsonException(JsonMessages.PATCH_MEMBER_MISSING(op, member));
-    }
-
-    static class DiffGenerator {
-        private JsonPatchBuilder builder;
-
-        JsonArray diff(JsonStructure source, JsonStructure target) {
-            builder = new JsonPatchBuilderImpl();
-            diff("", source, target);
-            return builder.build().toJsonArray();
-        }
-
-        private void diff(String path, JsonValue source, JsonValue target) {
-            if (source.equals(target)) {
-                return;
-            }
-            ValueType s = source.getValueType();
-            ValueType t = target.getValueType();
-            if (s == ValueType.OBJECT && t == ValueType.OBJECT) {
-                diffObject(path, (JsonObject) source, (JsonObject) target);
-            } else if (s == ValueType.ARRAY && t == ValueType.ARRAY) {
-                diffArray(path, (JsonArray) source, (JsonArray) target);
-            } else {
-                builder.replace(path, target);
-            }
-        }
-
-        private void diffObject(String path, JsonObject source, JsonObject target) {
-            source.forEach((key, value) -> {
-                if (target.containsKey(key)) {
-                    diff(path + '/' + Json.encodePointer(key), value, target.get(key));
-                } else {
-                    builder.remove(path + '/' + Json.encodePointer(key));
-                }
-            });
-            target.forEach((key, value) -> {
-                if (! source.containsKey(key)) {
-                    builder.add(path + '/' + Json.encodePointer(key), value);
-                }
-            });
-        }
-
-        /*
-         * For array element diff, find the longest common subsequence, per
-         * http://en.wikipedia.org/wiki/Longest_common_subsequence_problem .
-         * We modify the algorithm to generate a replace if possible.
-         */
-        private void diffArray(String path, JsonArray source, JsonArray target) {
-            /* The array c keeps track of length of the subsequence. To avoid
-             * computing the equality of array elements again, we
-             * left shift its value by 1, and use the low order bit to mark
-             * that two items are equal.
-             */
-            int m = source.size();
-            int n = target.size();
-            int [][] c = new int[m+1][n+1];
-            for (int i = 0; i < m+1; i++)
-                c[i][0] = 0;
-            for (int i = 0; i < n+1; i++)
-                c[0][i] = 0;
-            for (int i = 0; i < m; i++) {
-                for (int j = 0; j < n; j++) {
-                    if (source.get(i).equals(target.get(j))) {
-                        c[i+1][j+1] = ((c[i][j]) & ~1) + 3;
-                        // 3 = (1 << 1) | 1;
-                    } else {
-                        c[i+1][j+1] = Math.max(c[i+1][j], c[i][j+1]) & ~1;
-                    }
-                }
-            }
-
-            emit(path, source, target, c, m, n);
-        }
-
-        private void emit(final String path,
-                          final JsonArray source,
-                          final JsonArray target,
-                          final int[][] c,
-                          final int i,
-                          final int j) {
-           if (i == 0) {
-               if (j > 0) {
-                   emit(path, source, target, c, i, j - 1);
-                   builder.add(path + '/' + (j - 1), target.get(j - 1));
-               }
-           } else if (j == 0) {
-               if (i > 0) {
-                   builder.remove(path + '/' + (i - 1));
-                   emit(path, source, target, c, i - 1, j);
-               }
-           } else if ((c[i][j] & 1) == 1) {
-               emit(path, source, target, c, i - 1, j - 1);
-           } else {
-               final int f = c[i][j-1] >> 1;
-               final int g = c[i-1][j] >> 1;
-               if (f > g) {
-                   emit(path, source, target, c, i, j - 1);
-                   builder.add(path + '/' + (j - 1), target.get(j - 1));
-               } else if (f < g) {
-                   builder.remove(path + '/' + (i - 1));
-                   emit(path, source, target, c, i - 1, j);
-               } else { // f == g) {
-                   diff(path + '/' + (i - 1), source.get(i - 1),
-                     target.get(j - 1));
-                   emit(path, source, target, c, i - 1, j - 1);
-               }
-           }
-        }
-    }
-}
-
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonPointerImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonPointerImpl.java
deleted file mode 100644
index 395dcc8..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonPointerImpl.java
+++ /dev/null
@@ -1,300 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.JsonArray;
-import jakarta.json.JsonException;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPointer;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-import java.io.Serializable;
-import java.util.function.BiFunction;
-
-/**
- * <p>This class is an immutable representation of a JSON Pointer as specified in
- * <a href="http://tools.ietf.org/html/rfc6901">RFC 6901</a>.
- * </p>
- * <p> A JSON Pointer, when applied to a target {@link JsonValue},
- * defines a reference location in the target.</p>
- * <p> An empty JSON Pointer string defines a reference to the target itself.</p>
- * <p> If the JSON Pointer string is non-empty, it must be a sequence
- * of '/' prefixed tokens, and the target must either be a {@link JsonArray}
- * or {@link JsonObject}. If the target is a {@code JsonArray}, the pointer
- * defines a reference to an array element, and the last token specifies the index.
- * If the target is a {@link JsonObject}, the pointer defines a reference to a
- * name/value pair, and the last token specifies the name.
- * </p>
- * <p> The method {@link #getValue getValue()} returns the referenced value.
- * The methods {@link #add add()}, {@link #replace replace()},
- * and {@link #remove remove()} executes the operations specified in
- * <a href="http://tools.ietf.org/html/rfc6902">RFC 6902</a>. </p>
- *
- * @since 1.1
- */
-
-public final class JsonPointerImpl implements JsonPointer, Serializable {
-
-    private static final long serialVersionUID = -8123110179640843141L;
-    private final String[] tokens;
-    private final String jsonPointer;
-
-    /**
-     * Constructs and initializes a JsonPointerImpl.
-     * @param jsonPointer the JSON Pointer string
-     * @throws NullPointerException if {@code jsonPointer} is {@code null}
-     * @throws JsonException if {@code jsonPointer} is not a valid JSON Pointer
-     */
-    public JsonPointerImpl(String jsonPointer) {
-        this.jsonPointer = jsonPointer;
-        tokens = jsonPointer.split("/", -1);  // keep the trailing blanks
-        if (! "".equals(tokens[0])) {
-            throw new JsonException(JsonMessages.POINTER_FORMAT_INVALID());
-        }
-        for (int i = 1; i < tokens.length; i++) {
-            String token = tokens[i];
-            StringBuilder reftoken = new StringBuilder();
-            for (int j = 0; j < token.length(); j++) {
-                char ch = token.charAt(j);
-                if (ch == '~' && j < token.length() - 1) {
-                    char ch1 = token.charAt(j+1);
-                    if (ch1 == '0') {
-                        ch = '~'; j++;
-                    } else if (ch1 == '1') {
-                        ch = '/'; j++;
-                    }
-                }
-                reftoken.append(ch);
-            }
-            tokens[i] = reftoken.toString();
-        }
-    }
-
-    /**
-     * Compares this {@code JsonPointer} with another object.
-     * @param obj the object to compare this {@code JsonPointer} against
-     * @return true if the given object is a {@code JsonPointer} with the same
-     * reference tokens as this one, false otherwise.
-     */
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj)
-            return true;
-        if (obj == null || obj.getClass() != JsonPointerImpl.class)
-            return false;
-        return jsonPointer.equals(((JsonPointerImpl)obj).jsonPointer);
-    }
-
-    /**
-     * Returns the hash code value for this {@code JsonPointer} object.
-     * The hash code of this object is defined by the hash codes of it's reference tokens.
-     *
-     * @return the hash code value for this {@code JsonPointer} object
-     */
-    @Override
-    public int hashCode() {
-        return jsonPointer.hashCode();
-    }
-
-    /**
-     * Returns {@code true} if there is a value at the referenced location in the specified {@code target}.
-     *
-     * @param target the target referenced by this {@code JsonPointer}
-     * @return {@code true} if this pointer points to a value in a specified {@code target}.
-     */
-    @Override
-    public boolean containsValue(JsonStructure target) {
-        NodeReference[] refs = getReferences(target);
-        return refs[0].contains();
-    }
-
-    /**
-     * Returns the value at the referenced location in the specified {@code target}
-     *
-     * @param target the target referenced by this {@code JsonPointer}
-     * @return the referenced value in the target.
-     * @throws NullPointerException if {@code target} is null
-     * @throws JsonException if the referenced value does not exist
-     */
-    @Override
-    public JsonValue getValue(JsonStructure target) {
-        NodeReference[] refs = getReferences(target);
-        return refs[0].get();
-    }
-
-    /**
-     * Adds or replaces a value at the referenced location in the specified
-     * {@code target} with the specified {@code value}.
-     * <ol>
-     * <li>If the reference is the target (empty JSON Pointer string),
-     * the specified {@code value}, which must be the same type as
-     * specified {@code target}, is returned.</li>
-     * <li>If the reference is an array element, the specified {@code value} is inserted
-     * into the array, at the referenced index. The value currently at that location, and
-     * any subsequent values, are shifted to the right (adds one to the indices).
-     * Index starts with 0. If the reference is specified with a "-", or if the
-     * index is equal to the size of the array, the value is appended to the array.</li>
-     * <li>If the reference is a name/value pair of a {@code JsonObject}, and the
-     * referenced value exists, the value is replaced by the specified {@code value}.
-     * If the value does not exist, a new name/value pair is added to the object.</li>
-     * </ol>
-     *
-     * @param target the target referenced by this {@code JsonPointer}
-     * @param value the value to be added
-     * @return the transformed {@code target} after the value is added.
-     * @throws NullPointerException if {@code target} is {@code null}
-     * @throws JsonException if the reference is an array element and
-     * the index is out of range ({@code index < 0 || index > array size}),
-     * or if the pointer contains references to non-existing objects or arrays.
-     */
-    @Override
-    public JsonStructure add(JsonStructure target, JsonValue value) {
-        return execute(NodeReference::add, target, value);
-    }
-
-    /**
-     * Replaces the value at the referenced location in the specified
-     * {@code target} with the specified {@code value}.
-     *
-     * @param target the target referenced by this {@code JsonPointer}
-     * @param value the value to be stored at the referenced location
-     * @return the transformed {@code target} after the value is replaced.
-     * @throws NullPointerException if {@code target} is {@code null}
-     * @throws JsonException if the referenced value does not exist,
-     *    or if the reference is the target.
-     */
-    @Override
-    public JsonStructure replace(JsonStructure target, JsonValue value) {
-        return execute(NodeReference::replace, target, value);
-    }
-
-    /**
-     * Removes the value at the reference location in the specified {@code target}
-     *
-     * @param target the target referenced by this {@code JsonPointer}
-     * @return the transformed {@code target} after the value is removed.
-     * @throws NullPointerException if {@code target} is {@code null}
-     * @throws JsonException if the referenced value does not exist,
-     *    or if the reference is the target.
-     */
-    @Override
-    public JsonStructure remove(JsonStructure target) {
-        return execute((r,v)->r.remove(), target, null);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String toString() {
-        return jsonPointer;
-    }
-
-    /**
-     * Executes the operation
-     * @param op a {code BiFunction} used to specify the operation to execute on
-     *    the leaf node of the Json Pointer
-     * @param target the target JsonStructure for this JsonPointer
-     * @param value the JsonValue for add and replace, can be null for getvalue and remove
-     */
-    private JsonStructure execute(BiFunction<NodeReference, JsonValue, JsonStructure> op,
-            JsonStructure target, JsonValue value) {
-
-        NodeReference[] refs = getReferences(target);
-        JsonStructure result = op.apply(refs[0], value);
-        for (int i = 1; i < refs.length; i++) {
-            result = refs[i].replace(result);
-        }
-        return result;
-    }
-
-    /**
-     * Computes the {@code NodeReference}s for each node on the path of
-     * the JSON Pointer, in reverse order, starting from the leaf node
-     */
-    private NodeReference[] getReferences(JsonStructure target) {
-        NodeReference[] references;
-        // First check if this is a reference to a JSON value tree
-        if (tokens.length == 1) {
-            references = new NodeReference[1];
-            references[0] = NodeReference.of(target);
-            return references;
-        }
-
-        references = new NodeReference[tokens.length-1];
-        JsonValue value = target;
-        int s = tokens.length;
-        for (int i = 1; i < s; i++) {
-             // Start with index 1, skipping the "" token
-            switch (value.getValueType()) {
-                case OBJECT:
-                    JsonObject object = (JsonObject) value;
-                    references[s-i-1] = NodeReference.of(object, tokens[i]);
-                    if (i < s-1) {
-                        value = object.get(tokens[i]);
-                        if (value == null) {
-                            // Except for the last name, the mapping must exist
-                            throw new JsonException(JsonMessages.POINTER_MAPPING_MISSING(object, tokens[i]));
-                        }
-                    }
-                    break;
-                case ARRAY:
-                    int index = getIndex(tokens[i]);
-                    JsonArray array = (JsonArray) value;
-                    references[s-i-1] = NodeReference.of(array, index);
-                    if (i < s-1 && index != -1) {
-                        if (index >= array.size()) {
-                            throw new JsonException(JsonMessages.NODEREF_ARRAY_INDEX_ERR(index, array.size()));
-                        }
-                        // The last array index in the path can have index value of -1
-                        // ("-" in the JSON pointer)
-                        value = array.get(index);
-                    }
-                    break;
-                default:
-                    throw new JsonException(JsonMessages.POINTER_REFERENCE_INVALID(value.getValueType()));
-             }
-        }
-        return references;
-    }
-
-    /**
-     * Computes the array index
-     * @param token the input string token
-     * @return the array index. -1 if the token is "-"
-     * @throws JsonException if the string token is not in correct format
-     */
-    static private int getIndex(String token) {
-        if (token == null || token.length() == 0) {
-            throw new JsonException(JsonMessages.POINTER_ARRAY_INDEX_ERR(token));
-        }
-        if (token.equals("-")) {
-            return -1;
-        }
-        if (token.equals("0")) {
-            return 0;
-        }
-        if (token.charAt(0) == '+' || token.charAt(0) == '-') {
-            throw new JsonException(JsonMessages.POINTER_ARRAY_INDEX_ERR(token));
-        }
-        try {
-            return Integer.parseInt(token);
-        } catch (NumberFormatException ex) {
-            throw new JsonException(JsonMessages.POINTER_ARRAY_INDEX_ILLEGAL(token), ex);
-       }
-    }
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonPrettyGeneratorImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonPrettyGeneratorImpl.java
deleted file mode 100644
index fc75005..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonPrettyGeneratorImpl.java
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.stream.JsonGenerator;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.nio.charset.Charset;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class JsonPrettyGeneratorImpl extends JsonGeneratorImpl {
-    private int indentLevel;
-    private static final String INDENT = "    ";
-
-    public JsonPrettyGeneratorImpl(Writer writer, BufferPool bufferPool) {
-        super(writer, bufferPool);
-    }
-
-    public JsonPrettyGeneratorImpl(OutputStream out, BufferPool bufferPool) {
-        super(out, bufferPool);
-    }
-
-    public JsonPrettyGeneratorImpl(OutputStream out, Charset encoding, BufferPool bufferPool) {
-        super(out, encoding, bufferPool);
-    }
-
-    @Override
-    public JsonGenerator writeStartObject() {
-        super.writeStartObject();
-        indentLevel++;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartObject(String name) {
-        super.writeStartObject(name);
-        indentLevel++;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray() {
-        super.writeStartArray();
-        indentLevel++;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray(String name) {
-        super.writeStartArray(name);
-        indentLevel++;
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeEnd() {
-        writeNewLine();
-        indentLevel--;
-        writeIndent();
-        super.writeEnd();
-        return this;
-    }
-
-    private void writeIndent() {
-        for(int i=0; i < indentLevel; i++) {
-            writeString(INDENT);
-        }
-    }
-
-    @Override
-    protected void writeComma() {
-        super.writeComma();
-        if (isCommaAllowed() && !inNone()) {
-            writeChar('\n');
-            writeIndent();
-        }
-    }
-
-    @Override
-    protected void writeColon() {
-        super.writeColon();
-        writeChar(' ');
-    }
-
-    private void writeNewLine() {
-        writeChar('\n');
-    }
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonProviderImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonProviderImpl.java
deleted file mode 100644
index 698e71a..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonProviderImpl.java
+++ /dev/null
@@ -1,290 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-import org.eclipse.jsonp.api.JsonConfig;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonGeneratorFactory;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParserFactory;
-import jakarta.json.spi.JsonProvider;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * @author Jitendra Kotamraju
- * @author Kin-man Chung
- * @author Alex Soto
- */
-public class JsonProviderImpl extends JsonProvider {
-    private final BufferPool bufferPool = new BufferPoolImpl();
-
-    @Override
-    public JsonGenerator createGenerator(Writer writer) {
-        return new JsonGeneratorImpl(writer, bufferPool);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(OutputStream out) {
-        return new JsonGeneratorImpl(out, bufferPool);
-    }
-
-    @Override
-    public JsonParser createParser(Reader reader) {
-        return new JsonParserImpl(reader, bufferPool);
-    }
-
-    @Override
-    public JsonParser createParser(InputStream in) {
-        return new JsonParserImpl(in, bufferPool);
-    }
-
-    @Override
-    public JsonParserFactory createParserFactory(Map<String, ?> config) {
-        BufferPool pool = null;
-        if (config != null && config.containsKey(BufferPool.class.getName())) {
-            pool = (BufferPool)config.get(BufferPool.class.getName());
-        }
-        if (pool == null) {
-            pool = bufferPool;
-        }
-        return new JsonParserFactoryImpl(pool);
-    }
-
-    @Override
-    public JsonGeneratorFactory createGeneratorFactory(Map<String, ?> config) {
-        Map<String, Object> providerConfig;
-        boolean prettyPrinting;
-        BufferPool pool;
-        if (config == null) {
-            providerConfig = Collections.emptyMap();
-            prettyPrinting = false;
-            pool = bufferPool;
-        } else {
-            providerConfig = new HashMap<>();
-            if (prettyPrinting=JsonProviderImpl.isPrettyPrintingEnabled(config)) {
-                providerConfig.put(JsonGenerator.PRETTY_PRINTING, true);
-            }
-            pool = (BufferPool)config.get(BufferPool.class.getName());
-            if (pool != null) {
-                providerConfig.put(BufferPool.class.getName(), pool);
-            } else {
-                pool = bufferPool;
-            }
-            providerConfig = Collections.unmodifiableMap(providerConfig);
-        }
-
-        return new JsonGeneratorFactoryImpl(providerConfig, prettyPrinting, pool);
-    }
-
-    @Override
-    public JsonReader createReader(Reader reader) {
-        return new JsonReaderImpl(reader, bufferPool);
-    }
-
-    @Override
-    public JsonReader createReader(InputStream in) {
-        return new JsonReaderImpl(in, bufferPool);
-    }
-
-    @Override
-    public JsonWriter createWriter(Writer writer) {
-        return new JsonWriterImpl(writer, bufferPool);
-    }
-
-    @Override
-    public JsonWriter createWriter(OutputStream out) {
-        return new JsonWriterImpl(out, bufferPool);
-    }
-
-    @Override
-    public JsonWriterFactory createWriterFactory(Map<String, ?> config) {
-        Map<String, Object> providerConfig;
-        boolean prettyPrinting;
-        BufferPool pool;
-        if (config == null) {
-            providerConfig = Collections.emptyMap();
-            prettyPrinting = false;
-            pool = bufferPool;
-        } else {
-            providerConfig = new HashMap<>();
-            if (prettyPrinting=JsonProviderImpl.isPrettyPrintingEnabled(config)) {
-                providerConfig.put(JsonGenerator.PRETTY_PRINTING, true);
-            }
-            pool = (BufferPool)config.get(BufferPool.class.getName());
-            if (pool != null) {
-                providerConfig.put(BufferPool.class.getName(), pool);
-            } else {
-                pool = bufferPool;
-            }
-            providerConfig = Collections.unmodifiableMap(providerConfig);
-        }
-        return new JsonWriterFactoryImpl(providerConfig, prettyPrinting, pool);
-    }
-
-    @Override
-    public JsonReaderFactory createReaderFactory(Map<String, ?> config) {
-        Map<String, Object> providerConfig;
-        boolean rejectDuplicateKeys;
-        BufferPool pool;
-        if (config == null) {
-            providerConfig = Collections.emptyMap();
-            rejectDuplicateKeys = false;
-            pool = bufferPool;
-        } else {
-            providerConfig = new HashMap<>();
-            if (rejectDuplicateKeys = JsonProviderImpl.isRejectDuplicateKeysEnabled(config)) {
-                providerConfig.put(JsonConfig.REJECT_DUPLICATE_KEYS, true);
-            }
-            pool = (BufferPool) config.get(BufferPool.class.getName());
-            if (pool != null) {
-                providerConfig.put(BufferPool.class.getName(), pool);
-            } else {
-                pool = bufferPool;
-            }
-            providerConfig = Collections.unmodifiableMap(providerConfig);
-        }
-        return new JsonReaderFactoryImpl(providerConfig, pool, rejectDuplicateKeys);
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder() {
-        return new JsonObjectBuilderImpl(bufferPool);
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder(JsonObject object) {
-        return new JsonObjectBuilderImpl(object, bufferPool);
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder(Map<String, Object> map) {
-        return new JsonObjectBuilderImpl(map, bufferPool);
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder() {
-        return new JsonArrayBuilderImpl(bufferPool);
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder(JsonArray array) {
-        return new JsonArrayBuilderImpl(array, bufferPool);
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder(Collection<?> collection) {
-        return new JsonArrayBuilderImpl(collection, bufferPool);
-    }
-
-    @Override
-    public JsonPointer createPointer(String jsonPointer) {
-        return new JsonPointerImpl(jsonPointer);
-    }
-
-    @Override
-    public JsonPatchBuilder createPatchBuilder() {
-        return new JsonPatchBuilderImpl();
-    }
-
-    @Override
-    public JsonPatchBuilder createPatchBuilder(JsonArray array) {
-        return new JsonPatchBuilderImpl(array);
-    }
-
-    @Override
-    public JsonPatch createPatch(JsonArray array) {
-        return new JsonPatchImpl(array);
-    }
-
-    @Override
-    public JsonPatch createDiff(JsonStructure source, JsonStructure target) {
-        return new JsonPatchImpl(JsonPatchImpl.diff(source, target));
-    }
-
-    @Override
-    public JsonMergePatch createMergePatch(JsonValue patch) {
-        return new JsonMergePatchImpl(patch);
-    }
-
-    @Override
-    public JsonMergePatch createMergeDiff(JsonValue source, JsonValue target) {
-        return new JsonMergePatchImpl(JsonMergePatchImpl.diff(source, target));
-    }
-
-    @Override
-    public JsonString createValue(String value) {
-        return new JsonStringImpl(value);
-    }
-
-    @Override
-    public JsonNumber createValue(int value) {
-        return JsonNumberImpl.getJsonNumber(value);
-    }
-
-    @Override
-    public JsonNumber createValue(long value) {
-        return JsonNumberImpl.getJsonNumber(value);
-    }
-
-    @Override
-    public JsonNumber createValue(double value) {
-        return JsonNumberImpl.getJsonNumber(value);
-    }
-
-    @Override
-    public JsonNumber createValue(BigInteger value) {
-        return JsonNumberImpl.getJsonNumber(value);
-    }
-
-    @Override
-    public JsonNumber createValue(BigDecimal value) {
-        return JsonNumberImpl.getJsonNumber(value);
-    }
-
-    @Override
-    public JsonBuilderFactory createBuilderFactory(Map<String, ?> config) {
-    	BufferPool pool = bufferPool;
-    	boolean rejectDuplicateKeys = false;
-    	if (config != null) {
-    		if (config.containsKey(BufferPool.class.getName())) {
-    			pool = (BufferPool) config.get(BufferPool.class.getName());
-    		}
-    		rejectDuplicateKeys = JsonProviderImpl.isRejectDuplicateKeysEnabled(config);
-    	}
-        return new JsonBuilderFactoryImpl(pool, rejectDuplicateKeys);
-    }
-
-    static boolean isPrettyPrintingEnabled(Map<String, ?> config) {
-        return config.containsKey(JsonGenerator.PRETTY_PRINTING);
-    }
-
-    static boolean isRejectDuplicateKeysEnabled(Map<String, ?> config) {
-        return config.containsKey(JsonConfig.REJECT_DUPLICATE_KEYS);
-    }
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonReaderFactoryImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonReaderFactoryImpl.java
deleted file mode 100644
index d55d07a..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonReaderFactoryImpl.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.JsonReader;
-import jakarta.json.JsonReaderFactory;
-import java.io.InputStream;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import java.util.Map;
-
-/**
- * @author Jitendra Kotamraju
- */
-class JsonReaderFactoryImpl implements JsonReaderFactory {
-    private final Map<String, ?> config;
-    private final BufferPool bufferPool;
-    private final boolean rejectDuplicateKeys;
-
-    JsonReaderFactoryImpl(Map<String, ?> config, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        this.config = config;
-        this.bufferPool = bufferPool;
-        this.rejectDuplicateKeys = rejectDuplicateKeys;
-    }
-
-    @Override
-    public JsonReader createReader(Reader reader) {
-        return new JsonReaderImpl(reader, bufferPool, rejectDuplicateKeys);
-    }
-
-    @Override
-    public JsonReader createReader(InputStream in) {
-        return new JsonReaderImpl(in, bufferPool, rejectDuplicateKeys);
-    }
-
-    @Override
-    public JsonReader createReader(InputStream in, Charset charset) {
-        return new JsonReaderImpl(in, charset, bufferPool, rejectDuplicateKeys);
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return config;
-    }
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonReaderImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonReaderImpl.java
deleted file mode 100644
index b830034..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonReaderImpl.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import java.io.InputStream;
-import java.io.Reader;
-import java.nio.charset.Charset;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonException;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParsingException;
-
-/**
- * JsonReader impl using parser and builders.
- *
- * @author Jitendra Kotamraju
- */
-class JsonReaderImpl implements JsonReader {
-    private final JsonParserImpl parser;
-    private boolean readDone;
-    private final BufferPool bufferPool;
-    
-    JsonReaderImpl(Reader reader, BufferPool bufferPool) {
-        this(reader, bufferPool, false);
-    }
-
-    JsonReaderImpl(Reader reader, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        parser = new JsonParserImpl(reader, bufferPool, rejectDuplicateKeys);
-        this.bufferPool = bufferPool;
-    }
-
-    JsonReaderImpl(InputStream in, BufferPool bufferPool) {
-        this(in, bufferPool, false);
-    }
-
-    JsonReaderImpl(InputStream in, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        parser = new JsonParserImpl(in, bufferPool, rejectDuplicateKeys);
-        this.bufferPool = bufferPool;
-    }
-
-    JsonReaderImpl(InputStream in, Charset charset, BufferPool bufferPool) {
-        this(in, charset, bufferPool, false);
-    }
-
-    JsonReaderImpl(InputStream in, Charset charset, BufferPool bufferPool, boolean rejectDuplicateKeys) {
-        parser = new JsonParserImpl(in, charset, bufferPool, rejectDuplicateKeys);
-        this.bufferPool = bufferPool;
-    }
-
-    @Override
-    public JsonStructure read() {
-        if (readDone) {
-            throw new IllegalStateException(JsonMessages.READER_READ_ALREADY_CALLED());
-        }
-        readDone = true;
-        if (parser.hasNext()) {
-            try {
-                JsonParser.Event e = parser.next();
-                if (e == JsonParser.Event.START_ARRAY) {
-                    return parser.getArray();
-                } else if (e == JsonParser.Event.START_OBJECT) {
-                    return parser.getObject();
-                }
-            } catch (IllegalStateException ise) {
-                throw new JsonParsingException(ise.getMessage(), ise, parser.getLastCharLocation());
-            }
-        }
-        throw new JsonException(JsonMessages.INTERNAL_ERROR());
-    }
-
-    @Override
-    public JsonObject readObject() {
-        if (readDone) {
-            throw new IllegalStateException(JsonMessages.READER_READ_ALREADY_CALLED());
-        }
-        readDone = true;
-        if (parser.hasNext()) {
-            try {
-                parser.next();
-                return parser.getObject();
-            } catch (IllegalStateException ise) {
-                throw new JsonParsingException(ise.getMessage(), ise, parser.getLastCharLocation());
-            }
-        }
-        throw new JsonException(JsonMessages.INTERNAL_ERROR());
-    }
-
-    @Override
-    public JsonArray readArray() {
-        if (readDone) {
-            throw new IllegalStateException(JsonMessages.READER_READ_ALREADY_CALLED());
-        }
-        readDone = true;
-        if (parser.hasNext()) {
-            try {
-                parser.next();
-                return parser.getArray();
-            } catch (IllegalStateException ise) {
-                throw new JsonParsingException(ise.getMessage(), ise, parser.getLastCharLocation());
-            }
-        }
-        throw new JsonException(JsonMessages.INTERNAL_ERROR());
-    }
-
-    @Override
-    public JsonValue readValue() {
-        if (readDone) {
-            throw new IllegalStateException(JsonMessages.READER_READ_ALREADY_CALLED());
-        }
-        readDone = true;
-        if (parser.hasNext()) {
-            try {
-                parser.next();
-                return parser.getValue();
-            } catch (IllegalStateException ise) {
-                throw new JsonParsingException(ise.getMessage(), ise, parser.getLastCharLocation());
-            }
-        }
-        throw new JsonException(JsonMessages.INTERNAL_ERROR());
-    }
-
-    @Override
-    public void close() {
-        readDone = true;
-        parser.close();
-    }
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonStringImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonStringImpl.java
deleted file mode 100644
index d75ae86..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonStringImpl.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.JsonString;
-
-/**
- * JsonString impl
- *
- * @author Jitendra Kotamraju
- */
-final class JsonStringImpl implements JsonString {
-
-    private final CharSequence value;
-
-    JsonStringImpl(CharSequence value) {
-        this.value = value;
-    }
-
-    @Override
-    public String getString() {
-        return value.toString();
-    }
-
-    @Override
-    public CharSequence getChars() {
-        return value;
-    }
-
-    @Override
-    public ValueType getValueType() {
-        return ValueType.STRING;
-    }
-
-    @Override
-    public int hashCode() {
-        return getString().hashCode();
-    }
-
-    @Override
-    public boolean equals(Object obj) {
-        if (this == obj){
-            return true;
-        }
-        if (!(obj instanceof JsonString)) {
-            return false;
-        }
-        JsonString other = (JsonString)obj;
-        return getString().equals(other.getString());
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder();
-        sb.append('"');
-
-        for(int i = 0; i < value.length(); i++) {
-            char c = value.charAt(i);
-            // unescaped = %x20-21 | %x23-5B | %x5D-10FFFF
-            if (c >= 0x20 && c <= 0x10ffff && c != 0x22 && c != 0x5c) {
-                sb.append(c);
-            } else {
-                switch (c) {
-                    case '"':
-                    case '\\':
-                        sb.append('\\'); sb.append(c);
-                        break;
-                    case '\b':
-                        sb.append('\\'); sb.append('b');
-                        break;
-                    case '\f':
-                        sb.append('\\'); sb.append('f');
-                        break;
-                    case '\n':
-                        sb.append('\\'); sb.append('n');
-                        break;
-                    case '\r':
-                        sb.append('\\'); sb.append('r');
-                        break;
-                    case '\t':
-                        sb.append('\\'); sb.append('t');
-                        break;
-                    default:
-                        String hex = "000" + Integer.toHexString(c);
-                        sb.append("\\u").append(hex.substring(hex.length() - 4));
-                }
-            }
-        }
-
-        sb.append('"');
-        return sb.toString();
-    }
-}
-
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonStructureParser.java b/impl/src/main/java/org/eclipse/jsonp/JsonStructureParser.java
deleted file mode 100644
index 1d5a414..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonStructureParser.java
+++ /dev/null
@@ -1,311 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonLocation;
-import jakarta.json.stream.JsonParser;
-import java.math.BigDecimal;
-import java.util.ArrayDeque;
-import java.util.Deque;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.NoSuchElementException;
-
-/**
- * {@link JsonParser} implementation on top of JsonArray/JsonObject
- *
- * @author Jitendra Kotamraju
- */
-class JsonStructureParser implements JsonParser {
-
-    private Scope current;
-    private Event state;
-    private final Deque<Scope> scopeStack = new ArrayDeque<>();
-
-    JsonStructureParser(JsonArray array) {
-        current = new ArrayScope(array);
-    }
-
-    JsonStructureParser(JsonObject object) {
-        current = new ObjectScope(object);
-    }
-
-    @Override
-    public String getString() {
-        switch (state) {
-            case KEY_NAME:
-                return ((ObjectScope)current).key;
-            case VALUE_STRING:
-                return ((JsonString)current.getJsonValue()).getString();
-            case VALUE_NUMBER:
-                return ((JsonNumber)current.getJsonValue()).toString();
-            default:
-                throw new IllegalStateException(JsonMessages.PARSER_GETSTRING_ERR(state));
-        }
-    }
-
-    @Override
-    public boolean isIntegralNumber() {
-        if (state == Event.VALUE_NUMBER) {
-            return ((JsonNumber)current.getJsonValue()).isIntegral();
-        }
-        throw new IllegalStateException(JsonMessages.PARSER_ISINTEGRALNUMBER_ERR(state));
-    }
-
-    @Override
-    public int getInt() {
-        if (state == Event.VALUE_NUMBER) {
-            return ((JsonNumber)current.getJsonValue()).intValue();
-        }
-        throw new IllegalStateException(JsonMessages.PARSER_GETINT_ERR(state));
-    }
-
-    @Override
-    public long getLong() {
-        if (state == Event.VALUE_NUMBER) {
-            return ((JsonNumber)current.getJsonValue()).longValue();
-        }
-        throw new IllegalStateException(JsonMessages.PARSER_GETLONG_ERR(state));
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        if (state == Event.VALUE_NUMBER) {
-            return ((JsonNumber)current.getJsonValue()).bigDecimalValue();
-        }
-        throw new IllegalStateException(JsonMessages.PARSER_GETBIGDECIMAL_ERR(state));
-    }
-
-    @Override
-    public JsonLocation getLocation() {
-        return JsonLocationImpl.UNKNOWN;
-    }
-
-    @Override
-    public boolean hasNext() {
-        return !((state == Event.END_OBJECT || state == Event.END_ARRAY) && scopeStack.isEmpty());
-    }
-
-    @Override
-    public Event next() {
-        if (!hasNext()) {
-            throw new NoSuchElementException();
-        }
-        transition();
-        return state;
-    }
-
-    private void transition() {
-        if (state == null) {
-            state = current instanceof ArrayScope ? Event.START_ARRAY : Event.START_OBJECT;
-        } else {
-            if (state == Event.END_OBJECT || state == Event.END_ARRAY) {
-                current = scopeStack.pop();
-            }
-            if (current instanceof ArrayScope) {
-                if (current.hasNext()) {
-                    current.next();
-                    state = getState(current.getJsonValue());
-                    if (state == Event.START_ARRAY || state == Event.START_OBJECT) {
-                        scopeStack.push(current);
-                        current = Scope.createScope(current.getJsonValue());
-                    }
-                } else {
-                    state = Event.END_ARRAY;
-                }
-            } else {
-                // ObjectScope
-                if (state == Event.KEY_NAME) {
-                    state = getState(current.getJsonValue());
-                    if (state == Event.START_ARRAY || state == Event.START_OBJECT) {
-                        scopeStack.push(current);
-                        current = Scope.createScope(current.getJsonValue());
-                    }
-                } else {
-                    if (current.hasNext()) {
-                        current.next();
-                        state = Event.KEY_NAME;
-                    } else {
-                        state = Event.END_OBJECT;
-                    }
-                }
-            }
-        }
-    }
-
-    @Override
-    public void close() {
-        // no-op
-    }
-
-    @Override
-    public void skipObject() {
-        if (current instanceof ObjectScope) {
-            int depth = 1;
-            do {
-                if (state == Event.KEY_NAME) {
-                    state = getState(current.getJsonValue());
-                    switch (state) {
-                        case START_OBJECT:
-                            depth++;
-                            break;
-                        case END_OBJECT:
-                            depth--;
-                            break;
-                        default:
-                            //no-op
-                    }
-                } else {
-                    if (current.hasNext()) {
-                        current.next();
-                        state = Event.KEY_NAME;
-                    } else {
-                        state = Event.END_OBJECT;
-                        depth--;
-                    }
-                }
-            } while (state != Event.END_OBJECT && depth > 0);
-        }
-    }
-
-    @Override
-    public void skipArray() {
-        if (current instanceof ArrayScope) {
-            int depth = 1;
-            do {
-                if (current.hasNext()) {
-                    current.next();
-                    state = getState(current.getJsonValue());
-                    switch (state) {
-                        case START_ARRAY:
-                            depth++;
-                            break;
-                        case END_ARRAY:
-                            depth--;
-                            break;
-                        default:
-                            //no-op
-                    }
-                } else {
-                    state = Event.END_ARRAY;
-                    depth--;
-                }
-            } while (!(state == Event.END_ARRAY && depth == 0));
-        }
-    }
-
-    private static Event getState(JsonValue value) {
-        switch (value.getValueType()) {
-            case ARRAY:
-                return Event.START_ARRAY;
-            case OBJECT:
-                return Event.START_OBJECT;
-            case STRING:
-                return Event.VALUE_STRING;
-            case NUMBER:
-                return Event.VALUE_NUMBER;
-            case TRUE:
-                return Event.VALUE_TRUE;
-            case FALSE:
-                return Event.VALUE_FALSE;
-            case NULL:
-                return Event.VALUE_NULL;
-            default:
-                throw new JsonException(JsonMessages.PARSER_STATE_ERR(value.getValueType()));
-        }
-    }
-
-    private static abstract class Scope implements Iterator {
-        abstract JsonValue getJsonValue();
-
-        static Scope createScope(JsonValue value) {
-            if (value instanceof JsonArray) {
-                return new ArrayScope((JsonArray)value);
-            } else if (value instanceof JsonObject) {
-                return new ObjectScope((JsonObject)value);
-            }
-            throw new JsonException(JsonMessages.PARSER_SCOPE_ERR(value));
-        }
-    }
-
-    private static class ArrayScope extends Scope {
-        private final Iterator<JsonValue> it;
-        private JsonValue value;
-
-        ArrayScope(JsonArray array) {
-            this.it = array.iterator();
-        }
-
-        @Override
-        public boolean hasNext() {
-            return it.hasNext();
-        }
-
-        @Override
-        public JsonValue next() {
-            value = it.next();
-            return value;
-        }
-
-        @Override
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        JsonValue getJsonValue() {
-            return value;
-        }
-
-    }
-
-    private static class ObjectScope extends Scope {
-        private final Iterator<Map.Entry<String, JsonValue>> it;
-        private JsonValue value;
-        private String key;
-
-        ObjectScope(JsonObject object) {
-            this.it = object.entrySet().iterator();
-        }
-
-        @Override
-        public boolean hasNext() {
-            return it.hasNext();
-        }
-
-        @Override
-        public Map.Entry<String, JsonValue> next() {
-            Map.Entry<String, JsonValue> next = it.next();
-            this.key = next.getKey();
-            this.value = next.getValue();
-            return next;
-        }
-
-        @Override
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
-        JsonValue getJsonValue() {
-            return value;
-        }
-
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonTokenizer.java b/impl/src/main/java/org/eclipse/jsonp/JsonTokenizer.java
deleted file mode 100644
index c1b980d..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonTokenizer.java
+++ /dev/null
@@ -1,593 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.JsonException;
-import jakarta.json.stream.JsonLocation;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParsingException;
-import java.io.Closeable;
-import java.io.IOException;
-import java.io.Reader;
-import java.math.BigDecimal;
-import java.util.Arrays;
-
-import jakarta.json.stream.JsonParser.Event;
-
-/**
- * JSON Tokenizer
- *
- * @author Jitendra Kotamraju
- */
-final class JsonTokenizer implements Closeable {
-    // Table to look up hex ch -> value (for e.g HEX['F'] = 15, HEX['5'] = 5)
-    private final static int[] HEX = new int[128];
-    static {
-        Arrays.fill(HEX, -1);
-        for (int i='0'; i <= '9'; i++) {
-            HEX[i] = i-'0';
-        }
-        for (int i='A'; i <= 'F'; i++) {
-            HEX[i] = 10+i-'A';
-        }
-        for (int i='a'; i <= 'f'; i++) {
-            HEX[i] = 10+i-'a';
-        }
-    }
-    private final static int HEX_LENGTH = HEX.length;
-
-    private final BufferPool bufferPool;
-
-    private final Reader reader;
-
-    // Internal buffer that is used for parsing. It is also used
-    // for storing current string and number value token
-    private char[] buf;
-
-    // Indexes in buffer
-    //
-    // XXXssssssssssssXXXXXXXXXXXXXXXXXXXXXXrrrrrrrrrrrrrrXXXXXX
-    //    ^           ^                     ^             ^
-    //    |           |                     |             |
-    //   storeBegin  storeEnd            readBegin      readEnd
-    private int readBegin;
-    private int readEnd;
-    private int storeBegin;
-    private int storeEnd;
-
-    // line number of the current pointer of parsing char
-    private long lineNo = 1;
-
-    // XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
-    // ^
-    // |
-    // bufferOffset
-    //
-    // offset of the last \r\n or \n. will be used to calculate column number
-    // of a token or an error. This may be outside of the buffer.
-    private long lastLineOffset = 0;
-    // offset in the stream for the start of the buffer, will be used in
-    // calculating JsonLocation's stream offset, column no.
-    private long bufferOffset = 0;
-
-    private boolean minus;
-    private boolean fracOrExp;
-    private BigDecimal bd;
-
-    enum JsonToken {
-        CURLYOPEN(Event.START_OBJECT, false),
-        SQUAREOPEN(Event.START_ARRAY, false),
-        COLON(null, false),
-        COMMA(null, false),
-        STRING(Event.VALUE_STRING, true),
-        NUMBER(Event.VALUE_NUMBER, true),
-        TRUE(Event.VALUE_TRUE, true),
-        FALSE(Event.VALUE_FALSE, true),
-        NULL(Event.VALUE_NULL, true),
-        CURLYCLOSE(Event.END_OBJECT, false),
-        SQUARECLOSE(Event.END_ARRAY, false),
-        EOF(null, false);
-
-        private final JsonParser.Event event;
-        private final boolean value;
-
-        JsonToken(JsonParser.Event event, boolean value) {
-            this.event = event;
-            this.value = value;
-        }
-
-        JsonParser.Event getEvent() {
-            return event;
-        }
-
-        boolean isValue() {
-            return value;
-        }
-    }
-
-    JsonTokenizer(Reader reader, BufferPool bufferPool) {
-        this.reader = reader;
-        this.bufferPool = bufferPool;
-        buf = bufferPool.take();
-    }
-
-    private void readString() {
-        // when inPlace is true, no need to copy chars
-        boolean inPlace = true;
-        storeBegin = storeEnd = readBegin;
-
-        do {
-            // Write unescaped char block within the current buffer
-            if (inPlace) {
-                int ch;
-                while(readBegin < readEnd && ((ch=buf[readBegin]) >= 0x20) && ch != '\\') {
-                    if (ch == '"') {
-                        storeEnd = readBegin++; // ++ to consume quote char
-                        return;                 // Got the entire string
-                    }
-                    readBegin++;                // consume unescaped char
-                }
-                storeEnd = readBegin;
-            }
-
-            // string may be crossing buffer boundaries and may contain
-            // escaped characters.
-            int ch = read();
-            if (ch >= 0x20 && ch != 0x22 && ch != 0x5c) {
-                if (!inPlace) {
-                    buf[storeEnd] = (char)ch;
-                }
-                storeEnd++;
-                continue;
-            }
-            switch (ch) {
-                case '\\':
-                    inPlace = false;        // Now onwards need to copy chars
-                    unescape();
-                    break;
-                case '"':
-                    return;
-                default:
-                    throw unexpectedChar(ch);
-            }
-        } while (true);
-    }
-
-    private void unescape() {
-        int ch = read();
-        switch (ch) {
-            case 'b':
-                buf[storeEnd++] = '\b';
-                break;
-            case 't':
-                buf[storeEnd++] = '\t';
-                break;
-            case 'n':
-                buf[storeEnd++] = '\n';
-                break;
-            case 'f':
-                buf[storeEnd++] = '\f';
-                break;
-            case 'r':
-                buf[storeEnd++] = '\r';
-                break;
-            case '"':
-            case '\\':
-            case '/':
-                buf[storeEnd++] = (char)ch;
-                break;
-            case 'u': {
-                int unicode = 0;
-                for (int i = 0; i < 4; i++) {
-                    int ch3 = read();
-                    int digit = (ch3 >= 0 && ch3 < HEX_LENGTH) ? HEX[ch3] : -1;
-                    if (digit < 0) {
-                        throw unexpectedChar(ch3);
-                    }
-                    unicode = (unicode << 4)|digit;
-                }
-                buf[storeEnd++] = (char)unicode;
-                break;
-            }
-            default:
-                throw unexpectedChar(ch);
-        }
-    }
-
-    // Reads a number char. If the char is within the buffer, directly
-    // reads from the buffer. Otherwise, uses read() which takes care
-    // of resizing, filling up the buf, adjusting the pointers
-    private int readNumberChar() {
-        if (readBegin < readEnd) {
-            return buf[readBegin++];
-        } else {
-            storeEnd = readBegin;
-            return read();
-        }
-    }
-
-    private void readNumber(int ch)  {
-        storeBegin = storeEnd = readBegin-1;
-        // sign
-        if (ch == '-') {
-            this.minus = true;
-            ch = readNumberChar();
-            if (ch < '0' || ch >'9') {
-                throw unexpectedChar(ch);
-            }
-        }
-
-        // int
-        if (ch == '0') {
-            ch = readNumberChar();
-        } else {
-            do {
-                ch = readNumberChar();
-            } while (ch >= '0' && ch <= '9');
-        }
-
-        // frac
-        if (ch == '.') {
-            this.fracOrExp = true;
-            int count = 0;
-            do {
-                ch = readNumberChar();
-                count++;
-            } while (ch >= '0' && ch <= '9');
-            if (count == 1) {
-                throw unexpectedChar(ch);
-            }
-        }
-
-        // exp
-        if (ch == 'e' || ch == 'E') {
-            this.fracOrExp = true;
-            ch = readNumberChar();
-            if (ch == '+' || ch == '-') {
-                ch = readNumberChar();
-            }
-            int count;
-            for (count = 0; ch >= '0' && ch <= '9'; count++) {
-                ch = readNumberChar();
-            }
-            if (count == 0) {
-                throw unexpectedChar(ch);
-            }
-        }
-        if (ch != -1) {
-            // Only reset readBegin if eof has not been reached
-            readBegin--;
-            storeEnd = readBegin;
-        }
-    }
-
-    private void readTrue() {
-        int ch1 = read();
-        if (ch1 != 'r') {
-            throw expectedChar(ch1, 'r');
-        }
-        int ch2 = read();
-        if (ch2 != 'u') {
-            throw expectedChar(ch2, 'u');
-        }
-        int ch3 = read();
-        if (ch3 != 'e') {
-            throw expectedChar(ch3, 'e');
-        }
-    }
-
-    private void readFalse() {
-        int ch1 = read();
-        if (ch1 != 'a') {
-            throw expectedChar(ch1, 'a');
-        }
-        int ch2 = read();
-        if (ch2 != 'l') {
-            throw expectedChar(ch2, 'l');
-        }
-        int ch3 = read();
-        if (ch3 != 's') {
-            throw expectedChar(ch3, 's');
-        }
-        int ch4 = read();
-        if (ch4 != 'e') {
-            throw expectedChar(ch4, 'e');
-        }
-    }
-
-    private void readNull() {
-        int ch1 = read();
-        if (ch1 != 'u') {
-            throw expectedChar(ch1, 'u');
-        }
-        int ch2 = read();
-        if (ch2 != 'l') {
-            throw expectedChar(ch2, 'l');
-        }
-        int ch3 = read();
-        if (ch3 != 'l') {
-            throw expectedChar(ch3, 'l');
-        }
-    }
-
-    /*
-     * Could be optimized if the parser uses separate methods to match colon
-     * etc (that would avoid the switch statement cost in certain cases)
-     */
-    JsonToken nextToken() {
-        reset();
-        int ch = read();
-
-        // whitespace
-        while (ch == 0x20 || ch == 0x09 || ch == 0x0a || ch == 0x0d) {
-            if (ch == '\r') {
-                ++lineNo;
-                ch = read();
-                if (ch == '\n') {
-                    lastLineOffset = bufferOffset+readBegin;
-                } else {
-                    lastLineOffset = bufferOffset+readBegin-1;
-                    continue;
-                }
-            } else if (ch == '\n') {
-                ++lineNo;
-                lastLineOffset = bufferOffset+readBegin;
-            }
-            ch = read();
-        }
-
-        switch (ch) {
-            case '"':
-                readString();
-                return JsonToken.STRING;
-            case '{':
-                return JsonToken.CURLYOPEN;
-            case '[':
-                return JsonToken.SQUAREOPEN;
-            case ':':
-                return JsonToken.COLON;
-            case ',':
-                return JsonToken.COMMA;
-            case 't':
-                readTrue();
-                return JsonToken.TRUE;
-            case 'f':
-                readFalse();
-                return JsonToken.FALSE;
-            case 'n':
-                readNull();
-                return JsonToken.NULL;
-            case ']':
-                return JsonToken.SQUARECLOSE;
-            case '}':
-                return JsonToken.CURLYCLOSE;
-            case '0':
-            case '1':
-            case '2':
-            case '3':
-            case '4':
-            case '5':
-            case '6':
-            case '7':
-            case '8':
-            case '9':
-            case '-':
-                readNumber(ch);
-                return JsonToken.NUMBER;
-            case -1:
-                return JsonToken.EOF;
-            default:
-                throw unexpectedChar(ch);
-        }
-    }
-
-    boolean hasNextToken() {
-        reset();
-        int ch = peek();
-
-        // whitespace
-        while (ch == 0x20 || ch == 0x09 || ch == 0x0a || ch == 0x0d) {
-            if (ch == '\r') {
-                ++lineNo;
-                ++readBegin;
-                ch = peek();
-                if (ch == '\n') {
-                    lastLineOffset = bufferOffset+readBegin+1;
-                } else {
-                    lastLineOffset = bufferOffset+readBegin;
-                    continue;
-                }
-            } else if (ch == '\n') {
-                ++lineNo;
-                lastLineOffset = bufferOffset+readBegin+1;
-            }
-            ++readBegin;
-            ch = peek();
-        }
-        return ch != -1;
-    }
-
-    private int peek() {
-        try {
-            if (readBegin == readEnd) {     // need to fill the buffer
-                int len = fillBuf();
-                if (len == -1) {
-                    return -1;
-                }
-                assert len != 0;
-                readBegin = storeEnd;
-                readEnd = readBegin+len;
-            }
-            return buf[readBegin];
-        } catch (IOException ioe) {
-            throw new JsonException(JsonMessages.TOKENIZER_IO_ERR(), ioe);
-        }
-    }
-
-    // Gives the location of the last char. Used for
-    // JsonParsingException.getLocation
-    JsonLocation getLastCharLocation() {
-        // Already read the char, so subtracting -1
-        return new JsonLocationImpl(lineNo, bufferOffset +readBegin-lastLineOffset, bufferOffset +readBegin-1);
-    }
-
-    // Gives the parser location. Used for JsonParser.getLocation
-    JsonLocation getLocation() {
-        return new JsonLocationImpl(lineNo, bufferOffset +readBegin-lastLineOffset+1, bufferOffset +readBegin);
-    }
-
-    private int read() {
-        try {
-            if (readBegin == readEnd) {     // need to fill the buffer
-                int len = fillBuf();
-                if (len == -1) {
-                    return -1;
-                }
-                assert len != 0;
-                readBegin = storeEnd;
-                readEnd = readBegin+len;
-            }
-            return buf[readBegin++];
-        } catch (IOException ioe) {
-            throw new JsonException(JsonMessages.TOKENIZER_IO_ERR(), ioe);
-        }
-    }
-
-    private int fillBuf() throws IOException {
-        if (storeEnd != 0) {
-            int storeLen = storeEnd-storeBegin;
-            if (storeLen > 0) {
-                // there is some store data
-                if (storeLen == buf.length) {
-                    // buffer is full, double the capacity
-                    char[] doubleBuf = Arrays.copyOf(buf, 2 * buf.length);
-                    bufferPool.recycle(buf);
-                    buf = doubleBuf;
-                } else {
-                    // Left shift all the stored data to make space
-                    System.arraycopy(buf, storeBegin, buf, 0, storeLen);
-                    storeEnd = storeLen;
-                    storeBegin = 0;
-                    bufferOffset += readBegin-storeEnd;
-                }
-            } else {
-                storeBegin = storeEnd = 0;
-                bufferOffset += readBegin;
-            }
-        } else {
-            bufferOffset += readBegin;
-        }
-        // Fill the rest of the buf
-        return reader.read(buf, storeEnd, buf.length-storeEnd);
-    }
-
-    // state associated with the current token is no more valid
-    private void reset() {
-        if (storeEnd != 0) {
-            storeBegin = 0;
-            storeEnd = 0;
-            bd = null;
-            minus = false;
-            fracOrExp = false;
-        }
-    }
-
-    String getValue() {
-        return new String(buf, storeBegin, storeEnd-storeBegin);
-    }
-
-    CharSequence getCharSequence() {
-      int len = storeEnd - storeBegin;
-      return new StringBuilder(len).append(buf, storeBegin, len);
-    }
-
-    BigDecimal getBigDecimal() {
-        if (bd == null) {
-            bd = new BigDecimal(buf, storeBegin, storeEnd-storeBegin);
-        }
-        return bd;
-    }
-
-    int getInt() {
-        // no need to create BigDecimal for common integer values (1-9 digits)
-        int storeLen = storeEnd-storeBegin;
-        if (!fracOrExp && (storeLen <= 9 || (minus && storeLen <= 10))) {
-            int num = 0;
-            int i = minus ? 1 : 0;
-            for(; i < storeLen; i++) {
-                num = num * 10 + (buf[storeBegin+i] - '0');
-            }
-            return minus ? -num : num;
-        } else {
-            return getBigDecimal().intValue();
-        }
-    }
-
-    long getLong() {
-        // no need to create BigDecimal for common integer values (1-18 digits)
-        int storeLen = storeEnd-storeBegin;
-        if (!fracOrExp && (storeLen <= 18 || (minus && storeLen <= 19))) {
-            long num = 0;
-            int i = minus ? 1 : 0;
-            for(; i < storeLen; i++) {
-                num = num * 10 + (buf[storeBegin+i] - '0');
-            }
-            return minus ? -num : num;
-        } else {
-            return getBigDecimal().longValue();
-        }
-    }
-
-    // returns true for common integer values (1-9 digits).
-    // So there are cases it will return false even though the number is int
-    boolean isDefinitelyInt() {
-        int storeLen = storeEnd-storeBegin;
-        return !fracOrExp && (storeLen <= 9 || (minus && storeLen <= 10));
-    }
-
-    // returns true for common long values (1-18 digits).
-    // So there are cases it will return false even though the number is long
-    boolean isDefinitelyLong() {
-    	int storeLen = storeEnd-storeBegin;
-    	return !fracOrExp && (storeLen <= 18 || (minus && storeLen <= 19));
-    }
-
-    boolean isIntegral() {
-        return !fracOrExp || getBigDecimal().scale() == 0;
-    }
-
-    @Override
-    public void close() throws IOException {
-        reader.close();
-        bufferPool.recycle(buf);
-    }
-
-    private JsonParsingException unexpectedChar(int ch) {
-        JsonLocation location = getLastCharLocation();
-        return new JsonParsingException(
-            JsonMessages.TOKENIZER_UNEXPECTED_CHAR(ch, location), location);
-    }
-
-    private JsonParsingException expectedChar(int unexpected, char expected) {
-        JsonLocation location = getLastCharLocation();
-        return new JsonParsingException(
-                JsonMessages.TOKENIZER_EXPECTED_CHAR(unexpected, location, expected), location);
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonUtil.java b/impl/src/main/java/org/eclipse/jsonp/JsonUtil.java
deleted file mode 100644
index 1ca9f2f..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonUtil.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import java.io.StringReader;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonParsingException;
-import org.eclipse.jsonp.api.BufferPool;
-
-/**
- * A utility class
- * 
- * @since 1.1
- */
-public final class JsonUtil {
-
-    private static BufferPool internalPool;
-
-    private JsonUtil() {
-    }
-
-    static BufferPool getInternalBufferPool() {
-        if (internalPool == null) {
-            internalPool = new BufferPoolImpl();
-        }
-        return internalPool;
-    }
-
-    /**
-     * Reads the input JSON text and returns a JsonValue.
-     * <p>For convenience, single quotes as well as double quotes
-     * are allowed to delimit JSON strings. If single quotes are
-     * used, any quotes, single or double, in the JSON string must be
-     * escaped (prepend with a '\').
-     *
-     * @param jsonString the input JSON data
-     * @return the object model for {@code jsonString}
-     * @throws JsonParsingException if the input is not legal JSON text
-     */
-    public static JsonValue toJson(String jsonString) {
-        StringBuilder builder = new StringBuilder();
-        boolean single_context = false;
-        for (int i = 0; i < jsonString.length(); i++) {
-            char ch = jsonString.charAt(i);
-            if (ch == '\\') {
-                i = i + 1;
-                if (i < jsonString.length()) {
-                    ch = jsonString.charAt(i);
-                    if (!(single_context && ch == '\'')) {
-                        // unescape ' inside single quotes
-                        builder.append('\\');
-                    }
-                }
-            } else if (ch == '\'') {
-                // Turn ' into ", for proper JSON string
-                ch = '"';
-                single_context = ! single_context;
-            }
-            builder.append(ch);
-        }
-                   
-        JsonReader reader = new JsonReaderImpl(
-                                new StringReader(builder.toString()),
-                                getInternalBufferPool());
-        JsonValue value = reader.readValue();
-        reader.close();
-        return value;
-    }
-}
-
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonWriterFactoryImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonWriterFactoryImpl.java
deleted file mode 100644
index f48f2d4..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonWriterFactoryImpl.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.JsonWriter;
-import jakarta.json.JsonWriterFactory;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.util.Map;
-
-/**
- * @author Jitendra Kotamraju
- */
-class JsonWriterFactoryImpl implements JsonWriterFactory {
-    private final Map<String, ?> config;        // unmodifiable map
-    private final boolean prettyPrinting;
-    private final BufferPool bufferPool;
-
-    JsonWriterFactoryImpl(Map<String, ?> config, boolean prettyPrinting,
-            BufferPool bufferPool) {
-        this.config = config;
-        this.prettyPrinting = prettyPrinting;
-        this.bufferPool = bufferPool;
-    }
-
-    @Override
-    public JsonWriter createWriter(Writer writer) {
-        return new JsonWriterImpl(writer, prettyPrinting, bufferPool);
-    }
-
-    @Override
-    public JsonWriter createWriter(OutputStream out) {
-        return new JsonWriterImpl(out, prettyPrinting, bufferPool);
-    }
-
-    @Override
-    public JsonWriter createWriter(OutputStream out, Charset charset) {
-        return new JsonWriterImpl(out, charset, prettyPrinting, bufferPool);
-    }
-
-    @Override
-    public Map<String, ?> getConfigInUse() {
-        return config;
-    }
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/JsonWriterImpl.java b/impl/src/main/java/org/eclipse/jsonp/JsonWriterImpl.java
deleted file mode 100644
index b8db100..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/JsonWriterImpl.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.*;
-import java.io.FilterOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.Writer;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.Map;
-
-/**
- * JsonWriter impl using generator.
- *
- * @author Jitendra Kotamraju
- */
-class JsonWriterImpl implements JsonWriter {
-
-    private final JsonGeneratorImpl generator;
-    private boolean writeDone;
-    private final NoFlushOutputStream os;
-
-    JsonWriterImpl(Writer writer, BufferPool bufferPool) {
-        this(writer, false, bufferPool);
-    }
-
-    JsonWriterImpl(Writer writer, boolean prettyPrinting, BufferPool bufferPool) {
-        generator = prettyPrinting
-                ? new JsonPrettyGeneratorImpl(writer, bufferPool)
-                : new JsonGeneratorImpl(writer, bufferPool);
-        os = null;
-    }
-
-    JsonWriterImpl(OutputStream out, BufferPool bufferPool) {
-        this(out, StandardCharsets.UTF_8, false, bufferPool);
-    }
-
-    JsonWriterImpl(OutputStream out, boolean prettyPrinting, BufferPool bufferPool) {
-        this(out, StandardCharsets.UTF_8, prettyPrinting, bufferPool);
-    }
-
-    JsonWriterImpl(OutputStream out, Charset charset,
-                   boolean prettyPrinting, BufferPool bufferPool) {
-        // Decorating the given stream, so that buffered contents can be
-        // written without actually flushing the stream.
-        this.os = new NoFlushOutputStream(out);
-        generator = prettyPrinting
-                ? new JsonPrettyGeneratorImpl(os, charset, bufferPool)
-                : new JsonGeneratorImpl(os, charset, bufferPool);
-    }
-
-    @Override
-    public void writeArray(JsonArray array) {
-        if (writeDone) {
-            throw new IllegalStateException(JsonMessages.WRITER_WRITE_ALREADY_CALLED());
-        }
-        writeDone = true;
-        generator.writeStartArray();
-        for(JsonValue value : array) {
-            generator.write(value);
-        }
-        generator.writeEnd();
-        // Flush the generator's buffered contents. This won't work for byte
-        // streams as intermediary OutputStreamWriter buffers.
-        generator.flushBuffer();
-        // Flush buffered contents but not the byte stream. generator.flush()
-        // does OutputStreamWriter#flushBuffer (package private) and underlying
-        // byte stream#flush(). Here underlying stream's flush() is no-op.
-        if (os != null) {
-            generator.flush();
-        }
-    }
-
-    @Override
-    public void writeObject(JsonObject object) {
-        if (writeDone) {
-            throw new IllegalStateException(JsonMessages.WRITER_WRITE_ALREADY_CALLED());
-        }
-        writeDone = true;
-        generator.writeStartObject();
-        for(Map.Entry<String, JsonValue> e : object.entrySet()) {
-            generator.write(e.getKey(), e.getValue());
-        }
-        generator.writeEnd();
-        // Flush the generator's buffered contents. This won't work for byte
-        // streams as intermediary OutputStreamWriter buffers.
-        generator.flushBuffer();
-        // Flush buffered contents but not the byte stream. generator.flush()
-        // does OutputStreamWriter#flushBuffer (package private) and underlying
-        // byte stream#flush(). Here underlying stream's flush() is no-op.
-        if (os != null) {
-            generator.flush();
-        }
-    }
-
-    @Override
-    public void write(JsonStructure value) {
-        if (value instanceof JsonArray) {
-            writeArray((JsonArray)value);
-        } else {
-            writeObject((JsonObject)value);
-        }
-    }
-
-    @Override
-    public void write(JsonValue value) {
-        switch (value.getValueType()) {
-            case OBJECT:
-                writeObject((JsonObject) value);
-                return;
-            case ARRAY:
-                writeArray((JsonArray) value);
-                return;
-            default:
-                if (writeDone) {
-                    throw new IllegalStateException(JsonMessages.WRITER_WRITE_ALREADY_CALLED());
-                }
-                writeDone = true;
-                generator.write(value);
-                generator.flushBuffer();
-                if (os != null) {
-                    generator.flush();
-                }
-        }
-    }
-
-    @Override
-    public void close() {
-        writeDone = true;
-        generator.close();
-    }
-
-    private static final class NoFlushOutputStream extends FilterOutputStream {
-        public NoFlushOutputStream(OutputStream out) {
-            super(out);
-        }
-
-        @Override
-        public void write(byte b[], int off, int len) throws IOException {
-            out.write(b, off ,len);
-        }
-
-        @Override
-        public void flush() {
-            // no-op
-        }
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/MapUtil.java b/impl/src/main/java/org/eclipse/jsonp/MapUtil.java
deleted file mode 100644
index 640a52a..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/MapUtil.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonObjectBuilder;
-import jakarta.json.JsonValue;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Collection;
-import java.util.Map;
-
-/**
- * Util for transforming a Map to a Json objects.
- *
- * @author asotobu
- */
-public final class MapUtil {
-
-    private MapUtil() {
-        super();
-    }
-
-    static JsonValue handle(Object value, BufferPool bufferPool) {
-        if (value == null) {
-            return JsonValue.NULL;
-        } else if (value instanceof JsonValue) {
-            return (JsonValue) value;
-        } else if (value instanceof JsonArrayBuilder) {
-            return ((JsonArrayBuilder) value).build();
-        } else if (value instanceof JsonObjectBuilder) {
-            return ((JsonObjectBuilder) value).build();
-        } else if (value instanceof BigDecimal) {
-            return JsonNumberImpl.getJsonNumber((BigDecimal) value);
-        } else if (value instanceof BigInteger) {
-            return JsonNumberImpl.getJsonNumber((BigInteger) value);
-        } else if (value instanceof Boolean) {
-            Boolean b = (Boolean) value;
-            return b ? JsonValue.TRUE : JsonValue.FALSE;
-        } else if (value instanceof Double) {
-            return JsonNumberImpl.getJsonNumber((Double) value);
-        } else if (value instanceof Integer) {
-            return JsonNumberImpl.getJsonNumber((Integer) value);
-        } else if (value instanceof Long) {
-            return JsonNumberImpl.getJsonNumber((Long) value);
-        } else if (value instanceof String) {
-            return new JsonStringImpl((String) value);
-        } else if (value instanceof Collection) {
-            @SuppressWarnings("unchecked")
-            Collection<?> collection = (Collection<?>) value;
-            JsonArrayBuilder jsonArrayBuilder = new JsonArrayBuilderImpl(collection, bufferPool);
-            return jsonArrayBuilder.build();
-        } else if (value instanceof Map) {
-            @SuppressWarnings("unchecked")
-            JsonObjectBuilder object = new JsonObjectBuilderImpl((Map<String, Object>) value, bufferPool);
-            return object.build();
-        }
-
-        throw new IllegalArgumentException(String.format("Type %s is not supported.", value.getClass()));
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/NodeReference.java b/impl/src/main/java/org/eclipse/jsonp/NodeReference.java
deleted file mode 100644
index 992bcff..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/NodeReference.java
+++ /dev/null
@@ -1,282 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.JsonArray;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonException;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-
-/**
- * This class is a helper class for JsonPointer implementation,
- * and is not part of the API.
- *
- * This class encapsulates a reference to a JSON node.
- * There are three types of references.
- * <ol><li>a reference to the root of a JSON tree.</li>
- *     <li>a reference to a name/value (possibly non-existing) pair of a JSON object, identified by a name.</li>
- *     <li>a reference to a member value of a JSON array, identified by an index.</li>
- * </ol>
- * Static factory methods are provided for creating these references.
- *
- * <p>A referenced value can be retrieved or replaced.
- * The value of a JSON object or JSON array can be
- * removed.  A new value can be added to a JSON object or
- * inserted into a JSON array</p>
- *
- * <p>Since a {@code JsonObject} or {@code JsonArray} is immutable, these operations
- * must not modify the referenced JSON object or array. The methods {@link #add},
- * {@link #replace}, and {@link #remove} returns a new
- * JSON object or array after the execution of the operation.</p>
- */
-abstract class NodeReference {
-
-    /**
-     * Return {@code true} if a reference points to a valid value, {@code false} otherwise.
-     *
-     * @return {@code true} if a reference points to a value
-     */
-    abstract public boolean contains();
-
-    /**
-     * Get the value at the referenced location.
-     *
-     * @return the JSON value referenced
-     * @throws JsonException if the referenced value does not exist
-     */
-    abstract public JsonValue get();
-
-    /**
-     * Add or replace a value at the referenced location.
-     * If the reference is the root of a JSON tree, the added value must be
-     * a JSON object or array, which becomes the referenced JSON value.
-     * If the reference is an index of a JSON array, the value is inserted
-     * into the array at the index.  If the index is -1, the value is
-     * appended to the array.
-     * If the reference is a name of a JSON object, the name/value pair is added
-     * to the object, replacing any pair with the same name.
-     *
-     * @param value the value to be added
-     * @return the JsonStructure after the operation
-     * @throws JsonException if the index to the array is not -1 or is out of range
-     */
-    abstract public JsonStructure add(JsonValue value);
-
-    /**
-     * Remove the name/value pair from the JSON object, or the value in a JSON array, as specified by the reference
-     *
-     * @return the JsonStructure after the operation
-     * @throws JsonException if the name/value pair of the referenced JSON object
-     *    does not exist, or if the index of the referenced JSON array is
-     *    out of range, or if the reference is a root reference
-     */
-    abstract public JsonStructure remove();
-
-    /**
-     * Replace the referenced value with the specified value.
-     *
-     * @param value the JSON value to be stored at the referenced location
-     * @return the JsonStructure after the operation
-     * @throws JsonException if the name/value pair of the referenced JSON object
-     *    does not exist, or if the index of the referenced JSON array is
-     *    out of range, or if the reference is a root reference
-     */
-    abstract public JsonStructure replace(JsonValue value);
-
-    /**
-     * Returns a {@code NodeReference} for a {@code JsonStructure}.
-     *
-     * @param structure the {@code JsonStructure} referenced
-     * @return the {@code NodeReference}
-     */
-    public static NodeReference of(JsonStructure structure) {
-        return new RootReference(structure);
-    }
-
-    /**
-     * Returns a {@code NodeReference} for a name/value pair in a
-     * JSON object.
-     *
-     * @param object the referenced JSON object
-     * @param name the name of the name/pair
-     * @return the {@code NodeReference}
-     */
-    public static NodeReference of(JsonObject object, String name) {
-        return new ObjectReference(object, name);
-    }
-
-    /**
-     * Returns a {@code NodeReference} for a member value in a
-     * JSON array.
-     *
-     * @param array the referenced JSON array
-     * @param index the index of the member value in the JSON array
-     * @return the {@code NodeReference}
-     */
-    public static NodeReference of(JsonArray array, int index) {
-        return new ArrayReference(array, index);
-    }
-
-    static class RootReference extends NodeReference {
-
-        private JsonStructure root;
-
-        RootReference(JsonStructure root) {
-            this.root = root;
-        }
-
-        @Override
-        public boolean contains() {
-            return root != null;
-        }
-
-        @Override
-        public JsonValue get() {
-            return root;
-        }
-
-        @Override
-        public JsonStructure add(JsonValue value) {
-            switch (value.getValueType() ) {
-                case OBJECT:
-                case ARRAY:
-                    this.root = (JsonStructure) value;
-                    break;
-                default:
-                    throw new JsonException(JsonMessages.NODEREF_VALUE_ADD_ERR());
-            }
-            return root;
-        }
-
-        @Override
-        public JsonStructure remove() {
-            throw new JsonException(JsonMessages.NODEREF_VALUE_CANNOT_REMOVE());
-        }
-
-        @Override
-        public JsonStructure replace(JsonValue value) {
-            return add(value);
-        }
-    }
-
-    static class ObjectReference extends NodeReference {
-
-        private final JsonObject object;
-        private final String key;
-
-        ObjectReference(JsonObject object, String key) {
-            this.object = object;
-            this.key = key;
-        }
-
-        @Override
-        public boolean contains() {
-            return object != null && object.containsKey(key);
-        }
-
-        @Override
-        public JsonValue get() {
-            if (!contains()) {
-                throw new JsonException(JsonMessages.NODEREF_OBJECT_MISSING(key));
-            }
-            return object.get(key);
-        }
-
-        @Override
-        public JsonObject add(JsonValue value) {
-            return new JsonObjectBuilderImpl(object, JsonUtil.getInternalBufferPool()).add(key, value).build();
-        }
-
-        @Override
-        public JsonObject remove() {
-            if (!contains()) {
-                throw new JsonException(JsonMessages.NODEREF_OBJECT_MISSING(key));
-            }
-            return new JsonObjectBuilderImpl(object, JsonUtil.getInternalBufferPool()).remove(key).build();
-        }
-
-        @Override
-        public JsonObject replace(JsonValue value) {
-            if (!contains()) {
-                throw new JsonException(JsonMessages.NODEREF_OBJECT_MISSING(key));
-            }
-            return add(value);
-        }
-    }
-
-    static class ArrayReference extends NodeReference {
-
-        private final JsonArray array;
-        private final int index; // -1 means "-" in JSON Pointer
-
-        ArrayReference(JsonArray array, int index) {
-            this.array = array;
-            this.index = index;
-        }
-
-        @Override
-        public boolean contains() {
-            return array != null && index > -1 && index < array.size();
-        }
-
-        @Override
-        public JsonValue get() {
-            if (!contains()) {
-                throw new JsonException(JsonMessages.NODEREF_ARRAY_INDEX_ERR(index, array.size()));
-            }
-            return array.get(index);
-        }
-
-        @Override
-        public JsonArray add(JsonValue value) {
-            //TODO should we check for arrayoutofbounds?
-            // The spec seems to say index = array.size() is allowed. This is handled as append
-            JsonArrayBuilder builder = new JsonArrayBuilderImpl(this.array, JsonUtil.getInternalBufferPool());
-            if (index == -1 || index == array.size()) {
-                builder.add(value);
-            } else {
-                if(index < array.size()) {
-                    builder.add(index, value);
-                } else {
-                    throw new JsonException(JsonMessages.NODEREF_ARRAY_INDEX_ERR(index, array.size()));
-                }
-            }
-            return builder.build();
-        }
-
-        @Override
-        public JsonArray remove() {
-            if (!contains()) {
-                throw new JsonException(JsonMessages.NODEREF_ARRAY_INDEX_ERR(index, array.size()));
-            }
-            JsonArrayBuilder builder = new JsonArrayBuilderImpl(this.array, JsonUtil.getInternalBufferPool());
-            return builder.remove(index).build();
-        }
-
-        @Override
-        public JsonArray replace(JsonValue value) {
-            if (!contains()) {
-                throw new JsonException(JsonMessages.NODEREF_ARRAY_INDEX_ERR(index, array.size()));
-            }
-            JsonArrayBuilder builder = new JsonArrayBuilderImpl(this.array, JsonUtil.getInternalBufferPool());
-            return builder.set(index, value).build();
-        }
-    }
-}
-
diff --git a/impl/src/main/java/org/eclipse/jsonp/UnicodeDetectingInputStream.java b/impl/src/main/java/org/eclipse/jsonp/UnicodeDetectingInputStream.java
deleted file mode 100644
index f722f34..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/UnicodeDetectingInputStream.java
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp;
-
-import jakarta.json.JsonException;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-
-/**
- * A filter stream that detects the unicode encoding for the original
- * stream
- *
- * @author Jitendra Kotamraju
- */
-class UnicodeDetectingInputStream extends FilterInputStream {
-
-    private static final Charset UTF_32LE = Charset.forName("UTF-32LE");
-    private static final Charset UTF_32BE = Charset.forName("UTF-32BE");
-
-    private static final byte FF = (byte)0xFF;
-    private static final byte FE = (byte)0xFE;
-    private static final byte EF = (byte)0xEF;
-    private static final byte BB = (byte)0xBB;
-    private static final byte BF = (byte)0xBF;
-    private static final byte NUL = (byte)0x00;
-
-    private final byte[] buf = new byte[4];
-    private int bufLen;
-    private int curIndex;
-    private final Charset charset;
-
-    UnicodeDetectingInputStream(InputStream is) {
-        super(is);
-        charset = detectEncoding();
-    }
-
-    Charset getCharset() {
-        return charset;
-    }
-
-    private void fillBuf() {
-        int b1;
-        int b2;
-        int b3;
-        int b4;
-
-        try {
-            b1 = in.read();
-            if (b1 == -1) {
-                return;
-            }
-
-            b2 = in.read();
-            if (b2 == -1) {
-                bufLen = 1;
-                buf[0] = (byte)b1;
-                return;
-            }
-
-            b3 = in.read();
-            if (b3 == -1) {
-                bufLen = 2;
-                buf[0] = (byte)b1;
-                buf[1] = (byte)b2;
-                return;
-            }
-
-            b4 = in.read();
-            if (b4 == -1) {
-                bufLen = 3;
-                buf[0] = (byte)b1;
-                buf[1] = (byte)b2;
-                buf[2] = (byte)b3;
-                return;
-            }
-            bufLen = 4;
-            buf[0] = (byte)b1;
-            buf[1] = (byte)b2;
-            buf[2] = (byte)b3;
-            buf[3] = (byte)b4;
-        } catch (IOException ioe) {
-            throw new JsonException(JsonMessages.PARSER_INPUT_ENC_DETECT_IOERR(), ioe);
-        }
-    }
-
-    private Charset detectEncoding() {
-        fillBuf();
-        if (bufLen < 2) {
-            throw new JsonException(JsonMessages.PARSER_INPUT_ENC_DETECT_FAILED());
-        } else if (bufLen == 4) {
-            // Use BOM to detect encoding
-            if (buf[0] == NUL && buf[1] == NUL && buf[2] == FE && buf[3] == FF) {
-                curIndex = 4;
-                return UTF_32BE;
-            } else if (buf[0] == FF && buf[1] == FE && buf[2] == NUL && buf[3] == NUL) {
-                curIndex = 4;
-                return UTF_32LE;
-            } else if (buf[0] == FE && buf[1] == FF) {
-                curIndex = 2;
-                return StandardCharsets.UTF_16BE;
-            } else if (buf[0] == FF && buf[1] == FE) {
-                curIndex = 2;
-                return StandardCharsets.UTF_16LE;
-            } else if (buf[0] == EF && buf[1] == BB && buf[2] == BF) {
-                curIndex = 3;
-                return StandardCharsets.UTF_8;
-            }
-            // No BOM, just use JSON RFC's encoding algo to auto-detect
-            if (buf[0] == NUL && buf[1] == NUL && buf[2] == NUL) {
-                return UTF_32BE;
-            } else if (buf[0] == NUL && buf[2] == NUL) {
-                return StandardCharsets.UTF_16BE;
-            } else if (buf[1] == NUL && buf[2] == NUL && buf[3] == NUL) {
-                return UTF_32LE;
-            } else if (buf[1] == NUL && buf[3] == NUL) {
-                return StandardCharsets.UTF_16LE;
-            }
-        }
-        return StandardCharsets.UTF_8;
-    }
-
-    @Override
-    public int read() throws IOException {
-        if (curIndex < bufLen) {
-            return buf[curIndex++];
-        }
-        return in.read();
-    }
-
-    @Override
-    public int read(byte b[], int off, int len) throws IOException {
-        if (curIndex < bufLen) {
-            if (len == 0) {
-                return 0;
-            }
-            if (off < 0 || len < 0 || len > b.length -off) {
-                throw new IndexOutOfBoundsException();
-            }
-            int min = Math.min(bufLen-curIndex, len);
-            System.arraycopy(buf, curIndex, b, off, min);
-            curIndex += min;
-            return min;
-        }
-        return in.read(b, off, len);
-    }
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/api/BufferPool.java b/impl/src/main/java/org/eclipse/jsonp/api/BufferPool.java
deleted file mode 100644
index 1950b93..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/api/BufferPool.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.api;
-
-/**
- * char[] pool that pool instances of char[] which are expensive to create.
- *
- * @author Jitendra Kotamraju
- */
-public interface BufferPool {
-
-    /**
-     * Gets a new char[] object from the pool.
-     *
-     * <p>
-     * If no object is available in the pool, this method creates a new one.
-     *
-     * @return
-     *      always non-null.
-     */
-    char[] take();
-
-    /**
-     * Returns an object back to the pool.
-     *
-     * @param buf object to return back to the pool
-     */
-    void recycle(char[] buf);
-
-}
diff --git a/impl/src/main/java/org/eclipse/jsonp/api/JsonConfig.java b/impl/src/main/java/org/eclipse/jsonp/api/JsonConfig.java
deleted file mode 100644
index d2f16ae..0000000
--- a/impl/src/main/java/org/eclipse/jsonp/api/JsonConfig.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2020, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.api;
-
-public interface JsonConfig {
-    /**
-     * Configuration property to reject duplicate keys. The value of the property could be
-     * be anything.
-     */
-    String REJECT_DUPLICATE_KEYS = "org.eclipse.jsonp.rejectDuplicateKeys";
-}
diff --git a/impl/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider b/impl/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider
deleted file mode 100644
index 4ff9d59..0000000
--- a/impl/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.eclipse.jsonp.JsonProviderImpl
diff --git a/impl/src/main/resources/org/eclipse/jsonp/messages.properties b/impl/src/main/resources/org/eclipse/jsonp/messages.properties
deleted file mode 100644
index 1c69310..0000000
--- a/impl/src/main/resources/org/eclipse/jsonp/messages.properties
+++ /dev/null
@@ -1,92 +0,0 @@
-#
-# Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
-#
-# This program and the accompanying materials are made available under the
-# terms of the Eclipse Public License v. 2.0, which is available at
-# http://www.eclipse.org/legal/epl-2.0.
-#
-# This Source Code may also be made available under the following Secondary
-# Licenses when the conditions for such availability set forth in the
-# Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-# version 2 with the GNU Classpath Exception, which is available at
-# https://www.gnu.org/software/classpath/license.html.
-#
-# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-#
-
-
-
-internal.error=Internal Error
-
-parser.getString.err=JsonParser#getString() is valid only for KEY_NAME, VALUE_STRING, VALUE_NUMBER parser states. \
-  But current parser state is {0}
-parser.isIntegralNumber.err=JsonParser#isIntegralNumber() is valid only for VALUE_NUMBER parser state. \
-  But current parser state is {0}
-parser.getInt.err=JsonParser#getInt() is valid only for VALUE_NUMBER parser state. \
-  But current parser state is {0}
-parser.getLong.err=JsonParser#getLong() is valid only for VALUE_NUMBER parser state. \
-  But current parser state is {0}
-parser.getBigDecimal.err=JsonParser#getBigDecimal() is valid only for VALUE_NUMBER parser state. \
-  But current parser state is {0}
-parser.getArray.err=JsonParser#getArray() or JsonParser#getArrayStream() is valid only for START_ARRAY parser state. \
-  But current parser state is {0}
-parser.getObject.err=JsonParser#getObject() or JsonParser#getObjectStream() is valid only for START_OBJECT parser state. \
-  But current parser state is {0}
-parser.getValue.err=JsonParser#getValue() is valid only for START_ARRAY, START_OBJECT, KEY_NAME, VALUE_STRING, VALUE_NUMBER, VALUE_NULL, VALUE_FALSE, VALUE_TRUE parser states. \
-  But current parser state is {0}
-parser.getValueStream.err=JsonParser#getValueStream() the parser must not be in an array or object. \
-  But current parser state is {0}
-parser.expected.eof=Expected EOF token, but got {0}
-parser.tokenizer.close.io=I/O error while closing JSON tokenizer
-parser.invalid.token=Invalid token={0} at {1}. Expected tokens are: {2}
-parser.state.err=Unknown value type {0}
-parser.scope.err=Cannot be called for value {0}
-parser.input.enc.detect.failed=Cannot auto-detect encoding, not enough chars
-parser.input.enc.detect.ioerr=I/O error while auto-detecting the encoding of stream
-parser.duplicate.key=Duplicate key ''{0}'' is not allowed
-
-generator.flush.io.err=I/O error while flushing generated JSON
-generator.close.io.err=I/O error while closing JsonGenerator
-generator.write.io.err=I/O error while writing in JsonGenerator
-generator.illegal.method=Illegal method during JSON generation, \
-  not valid in current context {0}
-generator.double.infinite.nan=double value cannot be Infinite or NaN
-generator.incomplete.json=Generating incomplete JSON
-generator.illegal.multiple.text=Cannot generate more than one JSON text
-
-writer.write.already.called=write/writeObject/writeArray/close method is already called
-
-reader.read.already.called=read/readObject/readArray/close method is already called
-
-objbuilder.name.null=Name in JsonObject's name/value pair cannot be null
-objbuilder.value.null=Value in JsonObject's name/value pair cannot be null
-objbuilder.object.builder.null=Object builder that is used to create a value in JsonObject's name/value pair cannot be null
-objbuilder.array.builder.null=Array builder that is used to create a value in JsonObject's name/value pair cannot be null
-
-arrbuilder.value.null=Cannot invoke add(null) while building JsonArray.
-arrbuilder.object.builder.null=Object builder that is used to add a value to JSON array cannot be null
-arrbuilder.array.builder.null=Array builder that is used to add a value to JSON array cannot be null
-arrbuilder.valuelist.null=Index: {0}, Size: {1}
-
-tokenizer.unexpected.char=Unexpected char {0} at {1}
-tokenizer.expected.char=Unexpected char {0} at {1}, expecting ''{2}''
-tokenizer.io.err=I/O error while parsing JSON
-
-pointer.format.invalid=A non-empty JSON Pointer must begin with a ''/''
-pointer.mapping.missing=The JSON Object ''{0}'' contains no mapping for the name ''{1}''
-pointer.reference.invalid=The reference value in a JSON Pointer must be a JSON Object or a JSON Array, was ''{0}''
-pointer.array.index.err=Array index format error, was ''{0}''
-pointer.array.index.illegal=Illegal integer format, was ''{0}''
-
-noderef.value.add.err=The root value only allows adding a JSON object or array
-noderef.value.cannot.remove=The JSON value at the root cannot be removed
-noderef.object.missing=Non-existing name/value pair in the object for key {0}
-noderef.array.index.err=An array item index is out of range. Index: {0}, Size: {1}
-
-patch.must.be.array=A JSON Patch must be an array of JSON Objects
-patch.move.proper.prefix=The ''{0}'' path of the patch operation ''move'' is a proper prefix of the ''{1}'' path
-patch.move.target.null=The ''{0}'' path of the patch operation ''move'' does not exist in target object
-patch.test.failed=The JSON Patch operation ''test'' failed for path ''{0}'' and value ''{1}''
-patch.illegal.operation=Illegal value for the op member of the JSON Patch operation: ''{0}''
-patch.member.missing=The JSON Patch operation ''{0}'' must contain a ''{1}'' member
-patch.operation.missing=The JSON Patch must contain ''op'' member
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonArrayTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonArrayTest.java
deleted file mode 100644
index ea65e3b..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonArrayTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.*;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class JsonArrayTest extends TestCase {
-    public JsonArrayTest(String testName) {
-        super(testName);
-    }
-
-    public void testArrayEquals() throws Exception {
-        JsonArray expected = Json.createArrayBuilder()
-                .add(JsonValue.TRUE)
-                .add(JsonValue.FALSE)
-                .add(JsonValue.NULL)
-                .add(Integer.MAX_VALUE)
-                .add(Long.MAX_VALUE)
-                .add(Double.MAX_VALUE)
-                .add(Integer.MIN_VALUE)
-                .add(Long.MIN_VALUE)
-                .add(Double.MIN_VALUE)
-                .add(Json.createArrayBuilder().add("abc"))
-                .add(Json.createObjectBuilder().add("one", 1))
-                .build();
-
-        StringWriter sw = new StringWriter();
-        JsonWriter writer = Json.createWriter(sw);
-        writer.writeArray(expected);
-        writer.close();
-
-        JsonReader reader = Json.createReader(new StringReader(sw.toString()));
-        JsonArray actual = reader.readArray();
-        reader.close();
-
-        assertEquals(expected, actual);
-    }
-
-    public void testArrayEqualsUsingCollection() {
-        List<Object> list = new ArrayList<>();
-        list.add(JsonValue.TRUE);
-        list.add(JsonValue.FALSE);
-        list.add(JsonValue.NULL);
-        list.add(Integer.MAX_VALUE);
-        list.add(Long.MAX_VALUE);
-        list.add(Double.MAX_VALUE);
-        list.add(Integer.MIN_VALUE);
-        list.add(Long.MIN_VALUE);
-        list.add(Double.MIN_VALUE);
-        list.add(Json.createArrayBuilder().add("abc"));
-        list.add(Json.createObjectBuilder().add("one", 1));
-
-        JsonArray expected = Json.createArrayBuilder(list).build();
-
-        StringWriter sw = new StringWriter();
-        JsonWriter writer = Json.createWriter(sw);
-        writer.writeArray(expected);
-        writer.close();
-
-        JsonReader reader = Json.createReader(new StringReader(sw.toString()));
-        JsonArray actual = reader.readArray();
-        reader.close();
-
-        assertEquals(expected, actual);
-    }
-
-    public void testStringValue() throws Exception {
-        JsonArray array = Json.createArrayBuilder()
-                .add("John")
-                .build();
-        assertEquals("John", array.getString(0));
-    }
-
-    public void testIntValue() throws Exception {
-        JsonArray array = Json.createArrayBuilder()
-                .add(20)
-                .build();
-        assertEquals(20, array.getInt(0));
-    }
-
-    public void testAdd() {
-        JsonArray array = Json.createArrayBuilder().build();
-        try {
-            array.add(JsonValue.FALSE);
-            fail("JsonArray#add() should throw UnsupportedOperationException");
-        } catch(UnsupportedOperationException e) {
-            // Expected
-        }
-    }
-
-    public void testRemove() {
-        JsonArray array = Json.createArrayBuilder().build();
-        try {
-            array.remove(0);
-            fail("JsonArray#remove() should throw UnsupportedOperationException");
-        } catch(UnsupportedOperationException e) {
-            // Expected
-        }
-    }
-
-    public void testNumberView() throws Exception {
-        JsonArray array = Json.createArrayBuilder().add(20).add(10).build();
-
-        List<JsonNumber> numberList = array.getValuesAs(JsonNumber.class);
-        for(JsonNumber num : numberList) {
-            num.intValue();
-        }
-
-        assertEquals(20, array.getInt(0));
-        assertEquals(10, array.getInt(1));
-    }
-
-    public void testArrayBuilderNpe() {
-        try {
-            JsonArray array = Json.createArrayBuilder().add((JsonValue)null).build();
-            fail("JsonArrayBuilder#add(null) should throw NullPointerException");
-        } catch(NullPointerException e) {
-            // Expected
-        }
-    }
-
-    public void testHashCode() {
-        JsonArray array1 = Json.createArrayBuilder().add(1).add(2).add(3).build();
-        assertTrue(array1.hashCode() == array1.hashCode()); //1st call compute hashCode, 2nd call returns cached value
-
-        JsonArray array2 = Json.createArrayBuilder().add(1).add(2).add(3).build();
-        assertTrue(array1.hashCode() == array2.hashCode());
-
-        JsonArray array3 = Json.createArrayBuilder().build(); //org.eclipse.jsonp.JsonArrayBuilderImpl.JsonArrayImpl
-        JsonArray array4 = JsonValue.EMPTY_JSON_ARRAY; //jakarta.json.EmptyArray
-
-        assertTrue(array3.equals(array4));
-        assertTrue(array3.hashCode() == array4.hashCode()); //equal instances have same hashCode
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonBuilderFactoryTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonBuilderFactoryTest.java
deleted file mode 100644
index 1d5f44c..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonBuilderFactoryTest.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import java.util.Map;
-import jakarta.json.Json;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonBuilderFactory;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonObjectBuilder;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- *
- * @author lukas
- */
-public class JsonBuilderFactoryTest {
-    
-    @Test
-    public void testArrayBuilder() {
-        JsonBuilderFactory builderFactory = Json.createBuilderFactory(null);
-        Assert.assertNotNull(builderFactory.createArrayBuilder());
-    }
-    
-    @Test(expected = NullPointerException.class)
-    public void testArrayBuilderNPE() {
-        JsonBuilderFactory builderFactory = Json.createBuilderFactory(null);
-        builderFactory.createArrayBuilder(null);
-    }
-
-    @Test
-    public void testArrayBuilderFromArray() {
-        JsonBuilderFactory builderFactory = Json.createBuilderFactory(null);
-        JsonArrayBuilder builder = builderFactory.createArrayBuilder(JsonBuilderTest.buildPhone());
-        Assert.assertEquals(JsonBuilderTest.buildPhone(), builder.build());
-    }
-
-    @Test
-    public void testObjectBuilder() {
-        JsonBuilderFactory builderFactory = Json.createBuilderFactory(null);
-        Assert.assertNotNull(builderFactory.createObjectBuilder());
-    }
-    
-    @Test(expected = NullPointerException.class)
-    public void testObjectBuilderNPE() {
-        JsonBuilderFactory builderFactory = Json.createBuilderFactory(null);
-        builderFactory.createObjectBuilder((JsonObject) null);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void testObjectBuilderNPE_map() {
-        JsonBuilderFactory builderFactory = Json.createBuilderFactory(null);
-        builderFactory.createObjectBuilder((Map<String, Object>) null);
-    }
-
-    @Test
-    public void testObjectBuilderFromObject() {
-        JsonBuilderFactory builderFactory = Json.createBuilderFactory(null);
-        JsonObjectBuilder builder = builderFactory.createObjectBuilder(JsonBuilderTest.buildPerson());
-        Assert.assertEquals(JsonBuilderTest.buildPerson(), builder.build());
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonBuilderTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonBuilderTest.java
deleted file mode 100644
index 621fcef..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonBuilderTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.*;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Optional;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class JsonBuilderTest extends TestCase {
-    public JsonBuilderTest(String testName) {
-        super(testName);
-    }
-
-    public void testEmptyObject() throws Exception {
-        JsonObject empty = Json.createObjectBuilder()
-                .build();
-
-        JsonObjectTest.testEmpty(empty);
-    }
-
-    public void testEmptyArray() throws Exception {
-        JsonArray empty = Json.createArrayBuilder()
-                .build();
-
-        assertTrue(empty.isEmpty());
-    }
-
-    public void testObject() throws Exception {
-        JsonObject person = buildPerson();
-        JsonObjectTest.testPerson(person);
-    }
-
-    public void testNumber() throws Exception {
-        JsonObject person = buildPerson();
-        JsonNumber number = person.getJsonNumber("age");
-        assertEquals(25, number.intValueExact());
-        assertEquals(25, number.intValue());
-        assertTrue(number.isIntegral());
-        JsonObjectTest.testPerson(person);
-    }
-
-    public void testJsonObjectCopy() {
-        JsonObject person = buildPerson();
-        final JsonObjectBuilder objectBuilder = Json.createObjectBuilder(person);
-        final JsonObject copyPerson = objectBuilder.build();
-
-        JsonNumber number = copyPerson.getJsonNumber("age");
-        assertEquals(25, number.intValueExact());
-        assertEquals(25, number.intValue());
-        assertTrue(number.isIntegral());
-        JsonObjectTest.testPerson(copyPerson);
-
-    }
-
-    public void testJsonObjectMap() {
-        Map<String, Object> person = buildPersonAsMap();
-        final JsonObjectBuilder objectBuilder = Json.createObjectBuilder(person);
-        final JsonObject copyPerson = objectBuilder.build();
-
-        JsonNumber number = copyPerson.getJsonNumber("age");
-        assertEquals(25, number.intValueExact());
-        assertEquals(25, number.intValue());
-        assertTrue(number.isIntegral());
-        JsonObjectTest.testPerson(copyPerson);
-    }
-
-    static Map<String, Object> buildPersonAsMap() {
-        Map<String, Object> person = new HashMap<>();
-        person.put("firstName", "John");
-        person.put("lastName", "Smith");
-        person.put("age", 25);
-
-        Map<String, Object> address = Optional.of(new HashMap<String, Object>()).get();
-        address.put("streetAddress", "21 2nd Street");
-        address.put("city", "New York");
-        address.put("state", "NY");
-        address.put("postalCode", "10021");
-
-        person.put("address", address);
-        person.put("mailingAddress", Optional.empty());
-
-        Collection<Map<String, Object>> phones = new ArrayList<>();
-
-        Map<String, Object> phone1 = new HashMap<>();
-        phone1.put("type", "home");
-        phone1.put("number", "212 555-1234");
-        phones.add(phone1);
-
-        Map<String, Object> phone2 = new HashMap<>();
-        phone2.put("type", "fax");
-        phone2.put("number", "646 555-4567");
-        phones.add(phone2);
-
-        person.put("phoneNumber", phones);
-
-        return person;
-    }
-
-    static JsonObject buildPerson() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-
-    static JsonObject buildAddress() {
-        return Json.createObjectBuilder()
-                .add("streetAddress", "21 2nd Street")
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021")
-                .build();
-    }
-
-    static JsonArray buildPhone() {
-        return Json.createArrayBuilder()
-                .add(Json.createObjectBuilder()
-                        .add("type", "home")
-                        .add("number", "212 555-1234"))
-                .add(Json.createObjectBuilder()
-                        .add("type", "fax")
-                        .add("number", "646 555-4567"))
-                .build();
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonCollectorTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonCollectorTest.java
deleted file mode 100644
index f43a4e9..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonCollectorTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPatchBuilder;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonCollectors;
-import org.eclipse.jsonp.JsonUtil;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * Some JSON query tests/examples, using Java stream operations, with JSON collectors.
- * @author Kin-man Chung
- */
-public class JsonCollectorTest {
-
-    static JsonArray contacts;
-
-    @BeforeClass
-    public static void setUpClass() {
-        // The JSON source
-        contacts = (JsonArray) JsonUtil.toJson(
-        "[                                 " +
-        "  { 'name': 'Duke',               " +
-        "    'age': 18,                    " +
-        "    'gender': 'M',                " +
-        "    'phones': {                   " +
-        "       'home': '650-123-4567',    " +
-        "       'mobile': '650-234-5678'}}," +
-        "  { 'name': 'Jane',               " +
-        "    'age': 23,                    " +
-        "    'gender': 'F',                " +
-        "    'phones': {                   " +
-        "       'mobile': '707-999-5555'}}," +
-        "  { 'name': 'Joanna',             " +
-        "    'gender': 'F',                " +
-        "    'phones': {                   " +
-        "       'mobile': '505-333-4444'}} " +
-        " ]");
-    }
-
-    @Test
-    public void testToJsonArray() {
-        /*
-         * Query: retrieve the names of female contacts
-         * Returns a JsonArray of names
-         */
-        JsonArray result = contacts.getValuesAs(JsonObject.class).stream()
-                   .filter(x->"F".equals(x.getString("gender")))
-                   .map(x-> x.get("name"))
-                   .collect(JsonCollectors.toJsonArray());
-        JsonValue expected = JsonUtil.toJson("['Jane','Joanna']");
-        assertEquals(expected, result);
-    }
-
-    @Test
-    public void testToJsonObject() {
-        /*
-         * Query: retrieve the names and mobile phones of female contacts
-         * Returns a JsonObject of name phones pairs
-         */
-        JsonObject result = contacts.getValuesAs(JsonObject.class).stream()
-                    .filter(x->"F".equals(x.getString("gender")))
-                    .collect(JsonCollectors.toJsonObject(
-                            x->x.asJsonObject().getString("name"),
-                            x->x.asJsonObject().getJsonObject("phones").get("mobile")))
-                    ;
-        JsonValue expected = JsonUtil.toJson(
-                "{'Jane': '707-999-5555', 'Joanna': '505-333-4444'}");
-        assertEquals(expected, result);
-    }
-
-    @Test
-    public void testGroupBy() {
-        /*
-         * Query: group the contacts according to gender
-         * Returns a JsonObject, with gender/constacts value pairs
-         */
-        JsonObject result = contacts.getValuesAs(JsonObject.class).stream()
-            .collect(JsonCollectors.groupingBy(x->((JsonObject)x).getString("gender")));
-        JsonValue expected = JsonUtil.toJson(
-        "{'F':                               " +
-        "  [                                 " +
-        "    { 'name': 'Jane',               " +
-        "      'age': 23,                    " +
-        "      'gender': 'F',                " +
-        "      'phones': {                   " +
-        "         'mobile': '707-999-5555'}}," +
-        "    { 'name': 'Joanna',             " +
-        "      'gender': 'F',                " +
-        "      'phones': {                   " +
-        "         'mobile': '505-333-4444'}} " +
-        "  ],                                " +
-        "'M':                                " +
-        "  [                                 " +
-        "    { 'name': 'Duke',               " +
-        "      'age': 18,                    " +
-        "      'gender': 'M',                " +
-        "      'phones': {                   " +
-        "         'home': '650-123-4567',    " +
-        "         'mobile': '650-234-5678'}} " +
-        "  ]                                 " +
-        "}");
-
-        assertEquals(result,expected);
-    }
-
-    static int index; //for keeping track of the array index
-    @Test
-    public void testQueryAndPatch() {
-        /*
-         * Query and patch: Increment the ages of contacts with an age entry
-         * PatchBuilder is used for building the necessary JsonPatch.
-         */
-        index = -1;
-        JsonPatchBuilder builder = Json.createPatchBuilder();
-        contacts.getValuesAs(JsonObject.class).stream()
-            .peek(p->index++)
-            .filter(p->p.containsKey("age"))
-            .forEach(p-> builder.replace("/"+index+"/age", p.getInt("age")+1));
-        JsonArray result = builder.build().apply(contacts);
-
-        JsonValue expected = (JsonArray) JsonUtil.toJson(
-        "[                                 " +
-        "  { 'name': 'Duke',               " +
-        "    'age': 19,                    " +
-        "    'gender': 'M',                " +
-        "    'phones': {                   " +
-        "       'home': '650-123-4567',    " +
-        "       'mobile': '650-234-5678'}}," +
-        "  { 'name': 'Jane',               " +
-        "    'age': 24,                    " +
-        "    'gender': 'F',                " +
-        "    'phones': {                   " +
-        "       'mobile': '707-999-5555'}}," +
-        "  { 'name': 'Joanna',             " +
-        "    'gender': 'F',                " +
-        "    'phones': {                   " +
-        "       'mobile': '505-333-4444'}} " +
-        " ]");
- 
-        assertEquals(expected, result);
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonDuplicateKeyTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonDuplicateKeyTest.java
deleted file mode 100644
index 0fdbeb1..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonDuplicateKeyTest.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2020, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import java.io.StringReader;
-import java.util.Collections;
-
-import org.eclipse.jsonp.api.JsonConfig;
-import org.junit.Test;
-
-import jakarta.json.Json;
-import jakarta.json.JsonBuilderFactory;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonObjectBuilder;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonReaderFactory;
-import jakarta.json.stream.JsonParsingException;
-
-public class JsonDuplicateKeyTest {
-    @Test
-    public void testJsonReaderDuplicateKey1() {
-        String json = "{\"a\":\"b\",\"a\":\"c\"}";
-        JsonReader jsonReader = Json.createReader(new StringReader(json));
-        JsonObject jsonObject = jsonReader.readObject();
-        assertEquals(jsonObject.getString("a"), "c");
-    }
-
-    @Test
-    public void testJsonReaderDuplicateKey2() {
-        String json = "{\"a\":\"b\",\"a\":\"c\"}";
-        JsonReaderFactory jsonReaderFactory = Json.createReaderFactory(Collections.singletonMap(JsonConfig.REJECT_DUPLICATE_KEYS, true));
-        JsonReader jsonReader = jsonReaderFactory.createReader(new StringReader(json));
-        try {
-            jsonReader.readObject();
-            fail();
-        } catch (Exception e) {
-            assertTrue(e instanceof JsonParsingException);
-            assertEquals("Duplicate key 'a' is not allowed", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testJsonReaderDuplicateKey3() {
-        String json = "{\"a\":\"b\",\"b\":{\"c\":\"d\",\"c\":\"e\"}}";
-        JsonReader jsonReader = Json.createReader(new StringReader(json));
-        JsonObject jsonObject = jsonReader.readObject();
-        assertEquals(jsonObject.getJsonObject("b").getString("c"), "e");
-    }
-
-    @Test
-    public void testJsonReaderDuplicateKey4() {
-        String json = "{\"a\":\"b\",\"b\":{\"c\":\"d\",\"c\":\"e\"}}";;
-        JsonReaderFactory jsonReaderFactory = Json.createReaderFactory(Collections.singletonMap(JsonConfig.REJECT_DUPLICATE_KEYS, true));
-        JsonReader jsonReader = jsonReaderFactory.createReader(new StringReader(json));
-        try {
-            jsonReader.readObject();
-            fail();
-        } catch (Exception e) {
-            assertTrue(e instanceof JsonParsingException);
-            assertEquals("Duplicate key 'c' is not allowed", e.getMessage());
-        }
-    }
-
-    @Test
-    public void testJsonObjectBuilderDuplcateKey1() {
-        JsonObjectBuilder objectBuilder = Json.createObjectBuilder();
-        JsonObject jsonObject = objectBuilder.add("a", "b").add("a", "c").build();
-        assertEquals(jsonObject.getString("a"), "c");
-    }
-
-    @Test
-    public void testJsonObjectBuilderDuplcateKey2() {
-        JsonBuilderFactory jsonBuilderFactory = Json.createBuilderFactory(Collections.singletonMap(JsonConfig.REJECT_DUPLICATE_KEYS, true));
-        JsonObjectBuilder objectBuilder = jsonBuilderFactory.createObjectBuilder();
-        try {
-            objectBuilder.add("a", "b").add("a", "c").build();
-            fail();
-        } catch (Exception e) {
-            assertTrue(e instanceof IllegalStateException);
-            assertEquals("Duplicate key 'a' is not allowed", e.getMessage());
-        }
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonFieldTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonFieldTest.java
deleted file mode 100644
index 0f9530b..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonFieldTest.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.Json;
-import jakarta.json.JsonBuilderFactory;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonObjectBuilder;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonGenerationException;
-import jakarta.json.stream.JsonGenerator;
-import java.io.StringWriter;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.concurrent.Callable;
-
-/**
- * Test for writing json field names without values.
- *
- * @author Roman Grigoriadi
- */
-public class JsonFieldTest extends TestCase {
-
-    public void testFieldAsOnlyMember() {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-
-        generator.writeStartObject();
-        generator.writeKey("fName");
-        generator.write("fValue");
-        generator.writeEnd();
-
-        generator.close();
-        assertEquals("{\"fName\":\"fValue\"}", sw.toString());
-    }
-
-    public void testFieldAsFirstMember() {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-
-        generator.writeStartObject();
-        generator.writeKey("f1Name");
-        generator.write("f1Value");
-        generator.write("f2Name", "f2Value");
-        generator.writeEnd();
-
-        generator.close();
-        assertEquals("{\"f1Name\":\"f1Value\",\"f2Name\":\"f2Value\"}", sw.toString());
-    }
-
-    public void testFieldAsLastMember() {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-
-        generator.writeStartObject();
-        generator.write("f1Name", "f1Value");
-        generator.writeKey("f2Name");
-        generator.write("f2Value");
-        generator.writeEnd();
-
-        generator.close();
-        assertEquals("{\"f1Name\":\"f1Value\",\"f2Name\":\"f2Value\"}", sw.toString());
-    }
-
-
-    public void testFieldObject() {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-
-        generator.writeStartObject();
-        generator.writeKey("f1Name");
-        generator.writeStartObject();
-        generator.write("innerFieldName", "innerFieldValue");
-        generator.writeEnd();
-        generator.write("f2Name", "f2Value");
-        generator.writeEnd();
-
-        generator.close();
-        assertEquals("{\"f1Name\":{\"innerFieldName\":\"innerFieldValue\"},\"f2Name\":\"f2Value\"}", sw.toString());
-    }
-
-    public void testFieldArray() {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-
-        generator.writeStartObject();
-        generator.writeKey("f1Name");
-        generator.writeStartArray();
-        generator.write("arrayValue");
-        generator.writeEnd();
-        generator.write("f2Name", "f2Value");
-        generator.writeEnd();
-
-        generator.close();
-        assertEquals("{\"f1Name\":[\"arrayValue\"],\"f2Name\":\"f2Value\"}", sw.toString());
-    }
-
-    public void testFailFieldInField() {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-
-        generator.writeStartObject();
-        generator.writeKey("f1Name");
-
-        try {
-            generator.write("f2Name", "f2Value");
-            fail("Field value, start object/array expected");
-        } catch (JsonGenerationException exception) {
-            //ok
-        }
-    }
-
-
-    public void testFailFieldKeyInArray() {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-
-        generator.writeStartArray();
-
-        try {
-            generator.writeKey("f1Value");
-            fail("Not allowed in array .");
-        } catch (JsonGenerationException exception) {
-            //ok
-        }
-    }
-
-    public void  testWriteString() {
-        assertEquals("{\"f1Name\":\"f1Value\"}", writeValue((gen)->gen.write("f1Value")));
-    }
-
-    public void  testWriteBigDec() {
-        assertEquals("{\"f1Name\":10}", writeValue((gen)->gen.write(BigDecimal.TEN)));
-    }
-
-    public void  testWriteBigInt() {
-        assertEquals("{\"f1Name\":10}", writeValue((gen)->gen.write(BigInteger.TEN)));
-    }
-
-    public void  testWriteBool() {
-        assertEquals("{\"f1Name\":true}", writeValue((gen)->gen.write(true)));
-    }
-
-    public void  testWriteInt() {
-        assertEquals("{\"f1Name\":10}", writeValue((gen)->gen.write(10)));
-    }
-
-    public void  testWriteLong() {
-        assertEquals("{\"f1Name\":10}", writeValue((gen)->gen.write(10L)));
-    }
-
-    public void  testWriteDouble() {
-        assertEquals("{\"f1Name\":10.0}", writeValue((gen)->gen.write(10d)));
-    }
-
-    public void  testWriteNull() {
-        assertEquals("{\"f1Name\":null}", writeValue(JsonGenerator::writeNull));
-    }
-
-    public void  testWriteJsonValue() {
-        JsonObjectBuilder builder = Json.createObjectBuilder();
-        builder.add("first", "value");
-        final JsonObject build = builder.build();
-        assertEquals("{\"f1Name\":\"value\"}", writeValue((gen)->gen.write(build.getValue("/first"))));
-    }
-
-    private String writeValue(WriteValueFunction writeValueCallback) {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-
-        generator.writeStartObject();
-        generator.writeKey("f1Name");
-        writeValueCallback.writeValue(generator);
-        generator.writeEnd();
-        generator.close();
-        return sw.toString();
-    }
-
-    private interface WriteValueFunction {
-        void writeValue(JsonGenerator generator);
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonGeneratorFactoryTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonGeneratorFactoryTest.java
deleted file mode 100644
index 2748965..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonGeneratorFactoryTest.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonGeneratorFactory;
-import java.io.StringWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Tests JsonGeneratorFactory
- *
- * @author Jitendra Kotamraju
- */
-public class JsonGeneratorFactoryTest extends TestCase {
-
-    public JsonGeneratorFactoryTest(String testName) {
-        super(testName);
-    }
-
-    public void testGeneratorFactory() {
-        JsonGeneratorFactory generatorFactory = Json.createGeneratorFactory(null);
-
-        JsonGenerator generator1 = generatorFactory.createGenerator(new StringWriter());
-        generator1.writeStartArray().writeEnd();
-        generator1.close();
-
-        JsonGenerator generator2 = generatorFactory.createGenerator(new StringWriter());
-        generator2.writeStartArray().writeEnd();
-        generator2.close();
-    }
-
-    public void testGeneratorFactoryWithConfig() {
-        Map<String, Object> config = new HashMap<>();
-        config.put(JsonGenerator.PRETTY_PRINTING, true);
-        JsonGeneratorFactory generatorFactory = Json.createGeneratorFactory(config);
-        Map<String, ?> config1 = generatorFactory.getConfigInUse();
-        if (config1.size() != 1) {
-            throw new JsonException("Expecting no of properties=1, got="+config1.size());
-        }
-        assertTrue(config1.containsKey(JsonGenerator.PRETTY_PRINTING));
-
-        JsonGenerator generator1 = generatorFactory.createGenerator(new StringWriter());
-        generator1.writeStartArray().writeEnd();
-        generator1.close();
-
-        JsonGenerator generator2 = generatorFactory.createGenerator(new StringWriter());
-        generator2.writeStartArray().writeEnd();
-        generator2.close();
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonGeneratorTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonGeneratorTest.java
deleted file mode 100644
index 1ca810d..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonGeneratorTest.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-import org.eclipse.jsonp.api.BufferPool;
-
-import jakarta.json.*;
-import jakarta.json.stream.*;
-import java.io.*;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-
-/**
- * {@link JsonGenerator} tests
- *
- * @author Jitendra Kotamraju
- */
-public class JsonGeneratorTest extends TestCase {
-    public JsonGeneratorTest(String testName) {
-        super(testName);
-    }
-
-    public void testObjectWriter() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        testObject(generator);
-        generator.close();
-        writer.close();
-
-        JsonReader reader = Json.createReader(new StringReader(writer.toString()));
-        JsonObject person = reader.readObject();
-        JsonObjectTest.testPerson(person);
-    }
-
-    public void testObjectStream() throws Exception {
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        JsonGenerator generator = Json.createGenerator(out);
-        testObject(generator);
-        generator.close();
-        out.close();
-
-        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-        JsonReader reader = Json.createReader(in);
-        JsonObject person = reader.readObject();
-        JsonObjectTest.testPerson(person);
-        reader.close();
-        in.close();
-    }
-
-    static void testObject(JsonGenerator generator) throws Exception {
-        generator
-                .writeStartObject()
-                .write("firstName", "John")
-                .write("lastName", "Smith")
-                .write("age", 25)
-                .writeStartObject("address")
-                .write("streetAddress", "21 2nd Street")
-                .write("city", "New York")
-                .write("state", "NY")
-                .write("postalCode", "10021")
-                .writeEnd()
-                .writeStartArray("phoneNumber")
-                .writeStartObject()
-                .write("type", "home")
-                .write("number", "212 555-1234")
-                .writeEnd()
-                .writeStartObject()
-                .write("type", "fax")
-                .write("number", "646 555-4567")
-                .writeEnd()
-                .writeEnd()
-                .writeEnd();
-    }
-
-    public void testArray() throws Exception {
-        Writer sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-        generator
-                .writeStartArray()
-                .writeStartObject()
-                .write("type", "home")
-                .write("number", "212 555-1234")
-                .writeEnd()
-                .writeStartObject()
-                .write("type", "fax")
-                .write("number", "646 555-4567")
-                .writeEnd()
-                .writeEnd();
-        generator.close();
-    }
-
-    // tests JsonGenerator when JsonValue is used for generation
-    public void testJsonValue() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator
-                .writeStartObject()
-                .write("firstName", "John")
-                .write("lastName", "Smith")
-                .write("age", 25)
-                .write("address", JsonBuilderTest.buildAddress())
-                .write("phoneNumber", JsonBuilderTest.buildPhone())
-                .writeEnd();
-        generator.close();
-        writer.close();
-
-        JsonReader reader = Json.createReader(new StringReader(writer.toString()));
-        JsonObject person = reader.readObject();
-        JsonObjectTest.testPerson(person);
-    }
-
-    public void testArrayString() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartArray().write("string").writeEnd();
-        generator.close();
-        writer.close();
-
-        assertEquals("[\"string\"]", writer.toString());
-    }
-
-    public void testEscapedString() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartArray().write("\u0000").writeEnd();
-        generator.close();
-        writer.close();
-
-        assertEquals("[\"\\u0000\"]", writer.toString());
-    }
-
-    public void testEscapedString1() throws Exception {
-        String expected = "\u0000\u00ff";
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-        generator.writeStartArray().write("\u0000\u00ff").writeEnd();
-        generator.close();
-        sw.close();
-
-        JsonReader jr = Json.createReader(new StringReader(sw.toString()));
-        JsonArray array = jr.readArray();
-        String got = array.getString(0);
-        jr.close();
-
-        assertEquals(expected, got);
-    }
-
-    public void testGeneratorEquals() throws Exception {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-        generator.writeStartArray()
-                .write(JsonValue.TRUE)
-                .write(JsonValue.FALSE)
-                .write(JsonValue.NULL)
-                .write(Integer.MAX_VALUE)
-                .write(Long.MAX_VALUE)
-                .write(Double.MAX_VALUE)
-                .write(Integer.MIN_VALUE)
-                .write(Long.MIN_VALUE)
-                .write(Double.MIN_VALUE)
-                .writeEnd();
-        generator.close();
-
-        JsonReader reader = Json.createReader(new StringReader(sw.toString()));
-        JsonArray expected = reader.readArray();
-        reader.close();
-
-        JsonArray actual = Json.createArrayBuilder()
-                .add(JsonValue.TRUE)
-                .add(JsonValue.FALSE)
-                .add(JsonValue.NULL)
-                .add(Integer.MAX_VALUE)
-                .add(Long.MAX_VALUE)
-                .add(Double.MAX_VALUE)
-                .add(Integer.MIN_VALUE)
-                .add(Long.MIN_VALUE)
-                .add(Double.MIN_VALUE)
-                .build();
-
-        assertEquals(expected, actual);
-    }
-
-    public void testPrettyObjectWriter() throws Exception {
-        StringWriter writer = new StringWriter();
-        Map<String, Object> config = new HashMap<>();
-        config.put(JsonGenerator.PRETTY_PRINTING, true);
-        JsonGenerator generator = Json.createGeneratorFactory(config)
-                .createGenerator(writer);
-        testObject(generator);
-        generator.close();
-        writer.close();
-
-        JsonReader reader = Json.createReader(new StringReader(writer.toString()));
-        JsonObject person = reader.readObject();
-        JsonObjectTest.testPerson(person);
-    }
-
-    public void testPrettyPrinting() throws Exception {
-        String[][] lines = {{"firstName", "John"}, {"lastName", "Smith"}};
-        StringWriter writer = new StringWriter();
-        Map<String, Object> config = new HashMap<>();
-        config.put(JsonGenerator.PRETTY_PRINTING, true);
-        JsonGenerator generator = Json.createGeneratorFactory(config)
-                .createGenerator(writer);
-        generator.writeStartObject()
-                .write("firstName", "John")
-                .write("lastName", "Smith")
-                .writeEnd();
-        generator.close();
-        writer.close();
-
-        BufferedReader reader = new BufferedReader(new StringReader(writer.toString()));
-        int numberOfLines = 0;
-        String line;
-        while ((line = reader.readLine()) != null) {
-            numberOfLines++;
-            if (numberOfLines > 1 && numberOfLines < 4) {
-                assertTrue(line.contains("\"" + lines[numberOfLines - 2][0] + "\": \"" + lines[numberOfLines - 2][1] + "\""));
-            }
-        }
-        assertEquals(4, numberOfLines);
-    }
-
-    public void testPrettyObjectStream() throws Exception {
-        ByteArrayOutputStream out = new ByteArrayOutputStream();
-        Map<String, Object> config = new HashMap<>();
-        config.put(JsonGenerator.PRETTY_PRINTING, true);
-        JsonGenerator generator = Json.createGeneratorFactory(config)
-                .createGenerator(out);
-        testObject(generator);
-        generator.close();
-        out.close();
-
-        ByteArrayInputStream in = new ByteArrayInputStream(out.toByteArray());
-        JsonReader reader = Json.createReader(in);
-        JsonObject person = reader.readObject();
-        JsonObjectTest.testPerson(person);
-        reader.close();
-        in.close();
-    }
-
-    public void testGenerationException1() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartObject();
-        try {
-            generator.writeStartObject();
-            fail("Expected JsonGenerationException, writeStartObject() cannot be called more than once");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-    public void testGenerationException2() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartObject();
-        try {
-            generator.writeStartArray();
-            fail("Expected JsonGenerationException, writeStartArray() is valid in no context");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-    public void testGenerationException3() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        try {
-            generator.close();
-            fail("Expected JsonGenerationException, no JSON is generated");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-    public void testGenerationException4() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartArray();
-        try {
-            generator.close();
-            fail("Expected JsonGenerationException, writeEnd() is not called");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-    public void testGenerationException5() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartObject();
-        try {
-            generator.close();
-            fail("Expected JsonGenerationException, writeEnd() is not called");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-    public void testGenerationException6() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartObject().writeEnd();
-        try {
-            generator.writeStartObject();
-            fail("Expected JsonGenerationException, cannot generate one more JSON text");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-    public void testGenerationException7() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartArray().writeEnd();
-        try {
-            generator.writeStartArray();
-            fail("Expected JsonGenerationException, cannot generate one more JSON text");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-
-    public void testGenerationException8() throws Exception {
-        StringWriter sWriter = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sWriter);
-        generator.writeStartObject();
-        try {
-            generator.write(JsonValue.TRUE);
-            fail("Expected JsonGenerationException, cannot generate one more JSON text");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-    public void testGenerationException9() throws Exception {
-        StringWriter sWriter = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sWriter);
-        generator.writeStartObject();
-        try {
-            generator.write("name");
-            fail("Expected JsonGenerationException, cannot generate one more JSON text");
-        } catch (JsonGenerationException je) {
-            // Expected exception
-        }
-    }
-
-    public void testGeneratorArrayDouble() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartArray();
-        try {
-            generator.write(Double.NaN);
-            fail("JsonGenerator.write(Double.NaN) should produce NumberFormatException");
-        } catch (NumberFormatException ne) {
-            // expected
-        }
-        try {
-            generator.write(Double.POSITIVE_INFINITY);
-            fail("JsonGenerator.write(Double.POSITIVE_INIFINITY) should produce NumberFormatException");
-        } catch (NumberFormatException ne) {
-            // expected
-        }
-        try {
-            generator.write(Double.NEGATIVE_INFINITY);
-            fail("JsonGenerator.write(Double.NEGATIVE_INIFINITY) should produce NumberFormatException");
-        } catch (NumberFormatException ne) {
-            // expected
-        }
-        generator.writeEnd();
-        generator.close();
-    }
-
-    public void testGeneratorObjectDouble() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(writer);
-        generator.writeStartObject();
-        try {
-            generator.write("foo", Double.NaN);
-            fail("JsonGenerator.write(String, Double.NaN) should produce NumberFormatException");
-        } catch (NumberFormatException ne) {
-            // expected
-        }
-        try {
-            generator.write("foo", Double.POSITIVE_INFINITY);
-            fail("JsonGenerator.write(String, Double.POSITIVE_INIFINITY) should produce NumberFormatException");
-        } catch (NumberFormatException ne) {
-            // expected
-        }
-        try {
-            generator.write("foo", Double.NEGATIVE_INFINITY);
-            fail("JsonGenerator.write(String, Double.NEGATIVE_INIFINITY) should produce NumberFormatException");
-        } catch (NumberFormatException ne) {
-            // expected
-        }
-        generator.writeEnd();
-        generator.close();
-    }
-
-    public void testIntGenerator() throws Exception {
-        Random r = new Random(System.currentTimeMillis());
-        JsonGeneratorFactory gf = Json.createGeneratorFactory(null);
-        JsonReaderFactory rf = Json.createReaderFactory(null);
-        JsonBuilderFactory bf = Json.createBuilderFactory(null);
-        for(int i=0; i < 100000; i++) {
-            int num = r.nextInt();
-            StringWriter sw = new StringWriter();
-            JsonGenerator generator = gf.createGenerator(sw);
-            generator.writeStartArray().write(num).writeEnd().close();
-
-            JsonReader reader = rf.createReader(new StringReader(sw.toString()));
-            JsonArray got = reader.readArray();
-            reader.close();
-
-            JsonArray expected = bf.createArrayBuilder().add(num).build();
-
-            assertEquals(expected, got);
-        }
-    }
-
-    public void testGeneratorBuf() throws Exception {
-        JsonGeneratorFactory gf = Json.createGeneratorFactory(null);
-        JsonReaderFactory rf = Json.createReaderFactory(null);
-        JsonBuilderFactory bf = Json.createBuilderFactory(null);
-        StringBuilder sb = new StringBuilder();
-        int value = 10;
-        for(int i=0; i < 25000; i++) {
-            sb.append('a');
-            String name = sb.toString();
-            StringWriter sw = new StringWriter();
-            JsonGenerator generator = gf.createGenerator(sw);
-            generator.writeStartObject().write(name, value).writeEnd().close();
-
-            JsonReader reader = rf.createReader(new StringReader(sw.toString()));
-            JsonObject got = reader.readObject();
-            reader.close();
-
-            JsonObject expected = bf.createObjectBuilder().add(name, value).build();
-
-            assertEquals(expected, got);
-        }
-    }
-
-    public void testBufferPoolFeature() {
-        final JsonParserTest.MyBufferPool bufferPool = new JsonParserTest.MyBufferPool(1024);
-        Map<String, Object> config = new HashMap<String, Object>() {{
-            put(BufferPool.class.getName(), bufferPool);
-        }};
-
-        JsonGeneratorFactory factory = Json.createGeneratorFactory(config);
-        JsonGenerator generator = factory.createGenerator(new StringWriter());
-        generator.writeStartArray();
-        generator.writeEnd();
-        generator.close();
-        assertTrue(bufferPool.isTakeCalled());
-        assertTrue(bufferPool.isRecycleCalled());
-    }
-
-    public void testBufferSizes() {
-        JsonReaderFactory rf = Json.createReaderFactory(null);
-        JsonBuilderFactory bf = Json.createBuilderFactory(null);
-        for(int size=10; size < 1000; size++) {
-            final JsonParserTest.MyBufferPool bufferPool = new JsonParserTest.MyBufferPool(size);
-            Map<String, Object> config = new HashMap<String, Object>() {{
-                put(BufferPool.class.getName(), bufferPool);
-            }};
-            JsonGeneratorFactory gf = Json.createGeneratorFactory(config);
-
-            StringBuilder sb = new StringBuilder();
-            int value = 10;
-            for(int i=0; i < 1500; i++) {
-                sb.append('a');
-                String name = sb.toString();
-                StringWriter sw = new StringWriter();
-                JsonGenerator generator = gf.createGenerator(sw);
-                generator.writeStartObject().write(name, value).writeEnd().close();
-
-                JsonReader reader = rf.createReader(new StringReader(sw.toString()));
-                JsonObject got = reader.readObject();
-                reader.close();
-
-                JsonObject expected = bf.createObjectBuilder().add(name, value).build();
-
-                assertEquals(expected, got);
-            }
-
-        }
-    }
-
-    public void testString() throws Exception {
-        escapedString("");
-        escapedString("abc");
-        escapedString("abc\f");
-        escapedString("abc\na");
-        escapedString("abc\tabc");
-        escapedString("abc\n\tabc");
-        escapedString("abc\n\tabc\r");
-        escapedString("\n\tabc\r");
-        escapedString("\bab\tb\rc\\\"\ftesting1234");
-        escapedString("\f\babcdef\tb\rc\\\"\ftesting1234");
-    }
-
-    void escapedString(String expected) throws Exception {
-        StringWriter sw = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(sw);
-        generator.writeStartArray().write(expected).writeEnd();
-        generator.close();
-        sw.close();
-
-        JsonReader jr = Json.createReader(new StringReader(sw.toString()));
-        JsonArray array = jr.readArray();
-        String got = array.getString(0);
-        jr.close();
-
-        assertEquals(expected, got);
-    }
-
-    public void testFlush() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        JsonGenerator gen = Json.createGenerator(baos);
-        gen.writeStartObject().writeEnd();
-        gen.flush();
-
-        assertEquals("{}", baos.toString("UTF-8"));
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonMergePatchDiffTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonMergePatchDiffTest.java
deleted file mode 100644
index 1a5e0c8..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonMergePatchDiffTest.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonString;
-import jakarta.json.JsonValue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-@RunWith(Parameterized.class)
-public class JsonMergePatchDiffTest {
-
-    @Parameters(name = "{index}: ({0})={1}")
-    public static Iterable<Object[]> data() throws Exception {
-        List<Object[]> examples = new ArrayList<Object[]>();
-        JsonArray data = loadData();
-        for (JsonValue jsonValue : data) {
-            JsonObject test = (JsonObject) jsonValue;
-            Object[] testData = new Object[4];
-            testData[0] = test.get("original");
-            testData[1] = test.get("target");
-            testData[2] = test.get("expected");
-            testData[3] = createExceptionClass((JsonString)test.get("exception"));
-
-            examples.add(testData);
-        }
-
-        return examples;
-    }
-
-    private static Class<? extends Exception> createExceptionClass(
-            JsonString exceptionClassName) throws ClassNotFoundException {
-        if (exceptionClassName != null) {
-            return (Class<? extends Exception>) Class
-                    .forName(exceptionClassName.getString());
-        }
-        return null;
-    }
-
-    private static JsonArray loadData() {
-        InputStream testData = JsonPatchTest.class
-                .getResourceAsStream("/jsonmergepatchdiff.json");
-        JsonReader reader = Json.createReader(testData);
-        JsonArray data = (JsonArray) reader.read();
-        return data;
-    }
-
-    private JsonValue original;
-    private JsonValue target;
-    private JsonValue expected;
-    private Class<? extends Exception> expectedException;
-
-    public JsonMergePatchDiffTest(JsonValue original, JsonValue target,
-            JsonValue expected, Class<? extends Exception> expectedException) {
-        super();
-        this.original = original;
-        this.target = target;
-        this.expected = expected;
-        this.expectedException = expectedException;
-    }
-    @Test
-    public void shouldExecuteJsonMergePatchDiffOperationsToJsonDocument() {
-        try {
-            JsonValue output = Json.createMergeDiff(original, target).toJsonValue();
-            assertThat(output, is(expected));
-            assertThat(expectedException, nullValue());
-        } catch (Exception e) {
-            if (expectedException == null) {
-                fail(e.getMessage());
-            } else {
-                assertThat(e, instanceOf(expectedException));
-            }
-        }
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonMergePatchTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonMergePatchTest.java
deleted file mode 100644
index ed8a438..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonMergePatchTest.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonString;
-import jakarta.json.JsonValue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-@RunWith(Parameterized.class)
-public class JsonMergePatchTest {
-
-        @Parameters(name = "{index}: ({0})={1}")
-        public static Iterable<Object[]> data() throws Exception {
-            List<Object[]> examples = new ArrayList<Object[]>();
-            JsonArray data = loadData();
-            for (JsonValue jsonValue : data) {
-                JsonObject test = (JsonObject) jsonValue;
-                Object[] testData = new Object[4];
-                testData[0] = test.get("patch");
-                testData[1] = test.get("target");
-                testData[2] = test.get("expected");
-                testData[3] = createExceptionClass((JsonString)test.get("exception"));
-
-                examples.add(testData);
-            }
-
-            return examples;
-        }
-
-        private static Class<? extends Exception> createExceptionClass(
-                JsonString exceptionClassName) throws ClassNotFoundException {
-            if (exceptionClassName != null) {
-                return (Class<? extends Exception>) Class
-                        .forName(exceptionClassName.getString());
-            }
-            return null;
-        }
-
-        private static JsonArray loadData() {
-            InputStream testData = JsonPatchTest.class
-                    .getResourceAsStream("/jsonmergepatch.json");
-            JsonReader reader = Json.createReader(testData);
-            JsonArray data = (JsonArray) reader.read();
-            return data;
-        }
-
-        private JsonValue patch;
-        private JsonValue target;
-        private JsonValue expected;
-        private Class<? extends Exception> expectedException;
-
-        public JsonMergePatchTest(JsonValue patch, JsonValue target,
-                JsonValue expected, Class<? extends Exception> expectedException) {
-            super();
-            this.patch = patch;
-            this.target = target;
-            this.expected = expected;
-            this.expectedException = expectedException;
-        }
-
-        @Test
-        public void shouldExecuteJsonMergePatchDiffOperationsToJsonDocument() {
-            try {
-                JsonValue output = Json.createMergePatch(patch).apply(target);
-                assertThat(output, is(expected));
-                assertThat(expectedException, nullValue());
-            } catch (Exception e) {
-                if (expectedException == null) {
-                    fail(e.getMessage());
-                } else {
-                    assertThat(e, instanceOf(expectedException));
-                }
-            }
-        }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonNumberTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonNumberTest.java
deleted file mode 100644
index 37b60f1..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonNumberTest.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.*;
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class JsonNumberTest extends TestCase {
-    public JsonNumberTest(String testName) {
-        super(testName);
-    }
-
-    public void testFloating() throws Exception {
-        JsonArray array1 = Json.createArrayBuilder().add(10.4).build();
-        JsonReader reader = Json.createReader(new StringReader("[10.4]"));
-        JsonArray array2 = reader.readArray();
-
-        assertEquals(array1.get(0), array2.get(0));
-        assertEquals(array1, array2);
-    }
-
-    public void testBigDecimal() throws Exception {
-        JsonArray array1 = Json.createArrayBuilder().add(new BigDecimal("10.4")).build();
-        JsonReader reader = Json.createReader(new StringReader("[10.4]"));
-        JsonArray array2 = reader.readArray();
-
-        assertEquals(array1.get(0), array2.get(0));
-        assertEquals(array1, array2);
-    }
-
-    public void testIntNumberType() throws Exception {
-        JsonArray array1 = Json.createArrayBuilder()
-                .add(Integer.MIN_VALUE)
-                .add(Integer.MAX_VALUE)
-                .add(Integer.MIN_VALUE + 1)
-                .add(Integer.MAX_VALUE - 1)
-                .add(12)
-                .add(12l)
-                .add(new BigInteger("0"))
-                .build();
-        testNumberType(array1, true);
-
-        StringReader sr = new StringReader("[" +
-                "-2147483648, " +
-                "2147483647, " +
-                "-2147483647, " +
-                "2147483646, " +
-                "12, " +
-                "12, " +
-                "0 " +
-                "]");
-        JsonReader reader = Json.createReader(sr);
-        JsonArray array2 = reader.readArray();
-        reader.close();
-        testNumberType(array2, true);
-
-        assertEquals(array1, array2);
-    }
-
-    private void testNumberType(JsonArray array, boolean integral) {
-        for (JsonValue value : array) {
-            assertEquals(integral, ((JsonNumber) value).isIntegral());
-        }
-    }
-
-    public void testLongNumberType() throws Exception {
-        JsonArray array1 = Json.createArrayBuilder()
-                .add(Long.MIN_VALUE)
-                .add(Long.MAX_VALUE)
-                .add(Long.MIN_VALUE + 1)
-                .add(Long.MAX_VALUE - 1)
-                .add((long) Integer.MIN_VALUE - 1)
-                .add((long) Integer.MAX_VALUE + 1)
-                .build();
-        testNumberType(array1, true);
-
-        StringReader sr = new StringReader("[" +
-                "-9223372036854775808, " +
-                "9223372036854775807, " +
-                "-9223372036854775807, " +
-                "9223372036854775806, " +
-                "-2147483649, " +
-                "2147483648 " +
-                "]");
-        JsonReader reader = Json.createReader(sr);
-        JsonArray array2 = reader.readArray();
-        reader.close();
-        testNumberType(array2, true);
-
-        assertEquals(array1, array2);
-    }
-
-
-//    public void testBigIntegerNumberType() throws Exception {
-//        JsonArray array1 = new JsonBuilder()
-//            .startArray()
-//                .add(new BigInteger("-9223372036854775809"))
-//                .add(new BigInteger("9223372036854775808"))
-//                .add(new BigInteger("012345678901234567890"))
-//            .end()
-//        .build();
-//        testNumberType(array1, JsonNumber.NumberType.BIG_INTEGER);
-//
-//        StringReader sr = new StringReader("[" +
-//            "-9223372036854775809, " +
-//            "9223372036854775808, " +
-//            "12345678901234567890 " +
-//        "]");
-//        JsonReader reader = new JsonReader(sr);
-//        JsonArray array2 = reader.readArray();
-//        reader.close();
-//        testNumberType(array2, JsonNumber.NumberType.BIG_INTEGER);
-//
-//        assertEquals(array1, array2);
-//    }
-
-    public void testBigDecimalNumberType() throws Exception {
-        JsonArray array1 = Json.createArrayBuilder()
-                .add(12d)
-                .add(12.0d)
-                .add(12.1d)
-                .add(Double.MIN_VALUE)
-                .add(Double.MAX_VALUE)
-                .build();
-        testNumberType(array1, false);
-
-        StringReader sr = new StringReader("[" +
-                "12.0, " +
-                "12.0, " +
-                "12.1, " +
-                "4.9E-324, " +
-                "1.7976931348623157E+308 " +
-                "]");
-        JsonReader reader = Json.createReader(sr);
-        JsonArray array2 = reader.readArray();
-        reader.close();
-        testNumberType(array2, false);
-
-        assertEquals(array1, array2);
-    }
-
-    public void testMinMax() throws Exception {
-        JsonArray expected = Json.createArrayBuilder()
-                .add(Integer.MIN_VALUE)
-                .add(Integer.MAX_VALUE)
-                .add(Long.MIN_VALUE)
-                .add(Long.MAX_VALUE)
-                .add(Double.MIN_VALUE)
-                .add(Double.MAX_VALUE)
-                .build();
-
-        StringWriter sw = new StringWriter();
-        JsonWriter writer = Json.createWriter(sw);
-        writer.writeArray(expected);
-        writer.close();
-
-        JsonReader reader = Json.createReader(new StringReader(sw.toString()));
-        JsonArray actual = reader.readArray();
-        reader.close();
-
-        assertEquals(expected, actual);
-    }
-
-    public void testLeadingZeroes() {
-        JsonArray array = Json.createArrayBuilder()
-                .add(0012.1d)
-                .build();
-
-        StringWriter sw = new StringWriter();
-        JsonWriter jw = Json.createWriter(sw);
-        jw.write(array);
-        jw.close();
-
-        assertEquals("[12.1]", sw.toString());
-    }
-
-    public void testBigIntegerExact() {
-        try {
-            JsonArray array = Json.createArrayBuilder().add(12345.12345).build();
-            array.getJsonNumber(0).bigIntegerValueExact();
-            fail("Expected Arithmetic exception");
-        } catch (ArithmeticException expected) {
-            // no-op
-        }
-    }
-
-    public void testHashCode() {
-        JsonNumber jsonNumber1 = Json.createValue(1);
-        assertTrue(jsonNumber1.hashCode() == jsonNumber1.bigDecimalValue().hashCode());
-
-        JsonNumber jsonNumber2 = Json.createValue(1);
-
-        assertTrue(jsonNumber1.equals(jsonNumber2));
-        assertTrue(jsonNumber1.hashCode() == jsonNumber2.hashCode());
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonObjectTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonObjectTest.java
deleted file mode 100644
index e7d61ef..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonObjectTest.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import java.io.StringReader;
-import java.io.StringWriter;
-import java.util.HashMap;
-import java.util.Map;
-
-import jakarta.json.*;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class JsonObjectTest extends TestCase {
-    public JsonObjectTest(String testName) {
-        super(testName);
-    }
-
-    public void test() {
-    }
-
-    public void testEmptyObjectEquals() throws Exception {
-        JsonObject empty1 = Json.createObjectBuilder()
-                .build();
-
-        JsonObject empty2 = Json.createObjectBuilder()
-                .build();
-
-        assertEquals(empty1, empty2);
-    }
-
-    public void testPersonObjectEquals() throws Exception {
-        JsonObject person1 = JsonBuilderTest.buildPerson();
-        JsonObject person2 = JsonReaderTest.readPerson();
-
-        assertEquals(person1, person2);
-    }
-
-    public void testGetStringOrDefault() throws Exception {
-        JsonObject object = Json.createObjectBuilder()
-                .add("string", "value")
-                .add("number", 25)
-                .add("boolean", false)
-                .build();
-        assertEquals("value", object.getString("string", "default"));
-        assertEquals("default", object.getString("missing", "default"));
-        assertEquals("default", object.getString("number", "default"));
-    }
-
-    public void testGetIntOrDefault() throws Exception {
-        JsonObject object = Json.createObjectBuilder()
-                .add("string", "value")
-                .add("number", 25)
-                .add("boolean", false)
-                .build();
-        assertEquals(25, object.getInt("number", 10));
-        assertEquals(10, object.getInt("missing", 10));
-        assertEquals(10, object.getInt("string", 10));
-    }
-
-    public void testGetBooleanOrDefault() throws Exception {
-        JsonObject object = Json.createObjectBuilder()
-                .add("string", "value")
-                .add("number", 25)
-                .add("boolean", false)
-                .build();
-        assertFalse(object.getBoolean("boolean", true));
-        assertTrue(object.getBoolean("missing", true));
-        assertTrue(object.getBoolean("string", true));
-    }
-
-    static void testPerson(JsonObject person) {
-        assertEquals(5, person.size());
-        assertEquals("John", person.getString("firstName"));
-        assertEquals("Smith", person.getString("lastName"));
-        assertEquals(25, person.getJsonNumber("age").intValue());
-        assertEquals(25, person.getInt("age"));
-
-        JsonObject address = person.getJsonObject("address");
-        assertEquals(4, address.size());
-        assertEquals("21 2nd Street", address.getString("streetAddress"));
-        assertEquals("New York", address.getString("city"));
-        assertEquals("NY", address.getString("state"));
-        assertEquals("10021", address.getString("postalCode"));
-
-        JsonArray phoneNumber = person.getJsonArray("phoneNumber");
-        assertEquals(2, phoneNumber.size());
-        JsonObject home = phoneNumber.getJsonObject(0);
-        assertEquals(2, home.size());
-        assertEquals("home", home.getString("type"));
-        assertEquals("212 555-1234", home.getString("number"));
-        assertEquals("212 555-1234", home.getString("number"));
-
-        JsonObject fax = phoneNumber.getJsonObject(1);
-        assertEquals(2, fax.size());
-        assertEquals("fax", fax.getString("type"));
-        assertEquals("646 555-4567", fax.getString("number"));
-
-        assertEquals("\"646 555-4567\"", fax.getJsonString("number").toString());
-    }
-
-    static void testEmpty(JsonObject empty) {
-        assertTrue(empty.isEmpty());
-    }
-
-    public void testClassCastException() {
-        JsonObject obj = Json.createObjectBuilder()
-                .add("foo", JsonValue.FALSE).build();
-        try {
-            obj.getJsonNumber("foo");
-            fail("Expected ClassCastException for casting JsonValue.FALSE to JsonNumber");
-        } catch (ClassCastException ce) {
-            // Expected
-        }
-    }
-
-    public void testPut() {
-        JsonObject obj = Json.createObjectBuilder().add("foo", 1).build();
-        try {
-            obj.put("bar", JsonValue.FALSE);
-            fail("JsonObject#put() should throw UnsupportedOperationException");
-        } catch(UnsupportedOperationException e) {
-            // Expected
-        }
-    }
-
-    public void testRemove() {
-        JsonObject obj = Json.createObjectBuilder().add("foo", 1).build();
-        try {
-            obj.remove("foo");
-            fail("JsonObject#remove() should throw UnsupportedOperationException");
-        } catch(UnsupportedOperationException e) {
-            // Expected
-        }
-    }
-
-    public void testObjectBuilderWithVariousValues() {
-        JsonObject expected = Json.createObjectBuilder()
-                .add("a", JsonValue.TRUE)
-                .add("b", JsonValue.FALSE)
-                .add("c", JsonValue.NULL)
-                .add("d", Integer.MAX_VALUE)
-                .add("e", Long.MAX_VALUE)
-                .add("f", Double.MAX_VALUE)
-                .add("g", Integer.MIN_VALUE)
-                .add("h", Long.MIN_VALUE)
-                .add("i", Double.MIN_VALUE)
-                .add("j", Json.createArrayBuilder().add("abc"))
-                .add("k", Json.createObjectBuilder().add("one", 1))
-                .build();
-
-        StringWriter sw = new StringWriter();
-        JsonWriter writer = Json.createWriter(sw);
-        writer.writeObject(expected);
-        writer.close();
-
-        JsonReader reader = Json.createReader(new StringReader(sw.toString()));
-        JsonObject actual = reader.readObject();
-        reader.close();
-
-        assertEquals(expected, actual);
-    }
-
-    public void testObjectBuilderWithMap() {
-        Map<String, Object> map = new HashMap<>();
-        map.put("a", JsonValue.TRUE);
-        map.put("b", JsonValue.FALSE);
-        map.put("c", JsonValue.NULL);
-        map.put("d", Integer.MAX_VALUE);
-        map.put("e", Long.MAX_VALUE);
-        map.put("f", Double.MAX_VALUE);
-        map.put("g", Integer.MIN_VALUE);
-        map.put("h", Long.MIN_VALUE);
-        map.put("i", Double.MIN_VALUE);
-        map.put("j", Json.createArrayBuilder().add("abc"));
-        map.put("k", Json.createObjectBuilder().add("one", 1));
-
-        JsonObject expected = Json.createObjectBuilder(map).build();
-
-        StringWriter sw = new StringWriter();
-        JsonWriter writer = Json.createWriter(sw);
-        writer.writeObject(expected);
-        writer.close();
-
-        JsonReader reader = Json.createReader(new StringReader(sw.toString()));
-        JsonObject actual = reader.readObject();
-        reader.close();
-
-        assertEquals(expected, actual);
-    }
-
-    public void testObjectBuilderNpe() {
-        try {
-            JsonObject obj = Json.createObjectBuilder().add(null, 1).build();
-            fail("JsonObjectBuilder#add(null, 1) should throw NullPointerException");
-        } catch(NullPointerException e) {
-            // Expected
-        }
-    }
-
-    public void testHashCode() {
-        JsonObject object1 = Json.createObjectBuilder().add("a", 1).add("b", 2).add("c", 3).build();
-        assertTrue(object1.hashCode() == object1.hashCode()); //1st call compute hashCode, 2nd call returns cached value
-
-        JsonObject object2 = Json.createObjectBuilder().add("a", 1).add("b", 2).add("c", 3).build();
-        assertTrue(object1.hashCode() == object2.hashCode());
-
-        JsonObject object3 = Json.createObjectBuilder().build(); //org.eclipse.jsonp.JsonArrayBuilderImpl.JsonArrayImpl
-        JsonObject object4 = JsonValue.EMPTY_JSON_OBJECT; //jakarta.json.EmptyObject
-
-        assertTrue(object3.equals(object4));
-        assertTrue(object3.hashCode() == object4.hashCode()); //equal instances have same hashCode
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserFactoryTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserFactoryTest.java
deleted file mode 100644
index f4ee9a4..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserFactoryTest.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.Json;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParserFactory;
-import java.io.StringReader;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Tests JsonParserFactory
- *
- * @author Jitendra Kotamraju
- */
-public class JsonParserFactoryTest extends TestCase {
-
-    public JsonParserFactoryTest(String testName) {
-        super(testName);
-    }
-
-    public void testParserFactory() {
-        JsonParserFactory parserFactory = Json.createParserFactory(null);
-        JsonParser parser1 = parserFactory.createParser(new StringReader("[]"));
-        parser1.close();
-        JsonParser parser2 = parserFactory.createParser(new StringReader("[]"));
-        parser2.close();
-    }
-
-    public void testParserFactoryWithConfig() {
-        Map<String, ?> config = new HashMap<>();
-        JsonParserFactory parserFactory = Json.createParserFactory(config);
-        JsonParser parser1 = parserFactory.createParser(new StringReader("[]"));
-        parser1.close();
-        JsonParser parser2 = parserFactory.createParser(new StringReader("[]"));
-        parser2.close();
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserSkipTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserSkipTest.java
deleted file mode 100644
index 62a1d1f..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserSkipTest.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import java.io.StringReader;
-import jakarta.json.Json;
-import jakarta.json.stream.JsonParser;
-import junit.framework.TestCase;
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertTrue;
-
-/**
- *
- * @author lukas
- */
-public class JsonParserSkipTest extends TestCase {
-
-    public void testSkipArrayReader() {
-        try (JsonParser parser = Json.createParser(new StringReader("[[],[[]]]"))) {
-            testSkipArray(parser);
-        }
-    }
-
-    public void testSkipArrayStructure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createArrayBuilder()
-                        .add(Json.createArrayBuilder())
-                        .add(Json.createArrayBuilder()
-                                .add(Json.createArrayBuilder()))
-                        .build())) {
-            testSkipArray(parser);
-        }
-    }
-
-    private static void testSkipArray(JsonParser parser) {
-        assertEquals(JsonParser.Event.START_ARRAY, parser.next());
-        parser.skipArray();
-        assertEquals(false, parser.hasNext());
-    }
-
-    public void testSkipArrayInObjectReader() {
-        try (JsonParser parser = Json.createParser(new StringReader("{\"array\":[[],[[]]],\"object\":\"value2\"}"))) {
-            testSkipArrayInObject(parser);
-        }
-    }
-
-    public void testSkipArrayInObjectStructure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createObjectBuilder().add("array", Json.createArrayBuilder()
-                        .add(Json.createArrayBuilder())
-                        .add(Json.createArrayBuilder()
-                                .add(Json.createArrayBuilder()))
-                ).add("object", "value2")
-                        .build())) {
-            testSkipArrayInObject(parser);
-        }
-    }
-
-    private static void testSkipArrayInObject(JsonParser parser) {
-        assertEquals(JsonParser.Event.START_OBJECT, parser.next());
-        assertEquals(JsonParser.Event.KEY_NAME, parser.next());
-        assertEquals(JsonParser.Event.START_ARRAY, parser.next());
-        parser.skipArray();
-        assertTrue(parser.hasNext());
-        assertEquals(JsonParser.Event.KEY_NAME, parser.next());
-        assertEquals(JsonParser.Event.VALUE_STRING, parser.next());
-        assertEquals(JsonParser.Event.END_OBJECT, parser.next());
-        assertFalse(parser.hasNext());
-    }
-
-    public void testSkipObjectReader() {
-        try (JsonParser parser = Json.createParser(new StringReader("{\"array\":[],\"objectToSkip\":{\"huge key\":\"huge value\"},\"simple\":2}"))) {
-            testSkipObject(parser);
-        }
-    }
-
-    public void testSkipObjectStructure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createObjectBuilder()
-                        .add("array", Json.createArrayBuilder().build())
-                        .add("objectToSkip", Json.createObjectBuilder().add("huge key", "huge value"))
-                        .add("simple", 2)
-                        .build())) {
-            testSkipObject(parser);
-        }
-    }
-
-    private static void testSkipObject(JsonParser parser) {
-        assertEquals(JsonParser.Event.START_OBJECT, parser.next());
-        assertEquals(JsonParser.Event.KEY_NAME, parser.next());
-        assertEquals(JsonParser.Event.START_ARRAY, parser.next());
-        assertEquals(JsonParser.Event.END_ARRAY, parser.next());
-        assertEquals(JsonParser.Event.KEY_NAME, parser.next());
-        assertEquals(JsonParser.Event.START_OBJECT, parser.next());
-        parser.skipObject();
-        assertEquals(JsonParser.Event.KEY_NAME, parser.next());
-        assertEquals(JsonParser.Event.VALUE_NUMBER, parser.next());
-        assertEquals(JsonParser.Event.END_OBJECT, parser.next());
-        assertEquals(false, parser.hasNext());
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserTest.java
deleted file mode 100644
index 401f8f7..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonParserTest.java
+++ /dev/null
@@ -1,827 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import java.io.ByteArrayInputStream;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import junit.framework.TestCase;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonLocation;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParser.Event;
-import jakarta.json.stream.JsonParserFactory;
-import java.math.BigDecimal;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Random;
-import java.util.Scanner;
-import jakarta.json.stream.JsonParsingException;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-/**
- * JsonParser Tests
- *
- * @author Jitendra Kotamraju
- */
-public class JsonParserTest extends TestCase {
-    static final Charset UTF_32LE = Charset.forName("UTF-32LE");
-    static final Charset UTF_32BE = Charset.forName("UTF-32BE");
-
-    public JsonParserTest(String testName) {
-        super(testName);
-    }
-
-    public void testReader() {
-        JsonParser reader = Json.createParser(
-                new StringReader("{ \"a\" : \"b\", \"c\" : null, \"d\" : [null, \"abc\"] }"));
-        reader.close();
-    }
-
-
-    public void testEmptyArrayReader() {
-        try (JsonParser parser = Json.createParser(new StringReader("[]"))) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStream() {
-        try (JsonParser parser = Json.createParser(
-                new ByteArrayInputStream(new byte[]{'[', ']'}))) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStreamUTF8() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[]".getBytes(StandardCharsets.UTF_8));
-        try (JsonParser parser = Json.createParser(bin)) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStreamUTF16LE() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[]".getBytes(StandardCharsets.UTF_16LE));
-        try (JsonParser parser = Json.createParser(bin)) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStreamUTF16BE() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[]".getBytes(StandardCharsets.UTF_16BE));
-        try (JsonParser parser = Json.createParser(bin)) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStreamUTF32LE() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[]".getBytes(UTF_32LE));
-        try (JsonParser parser = Json.createParser(bin)) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStreamUTF32BE() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[]".getBytes(UTF_32BE));
-        try (JsonParser parser = Json.createParser(bin)) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStreamUTF16() {
-        ByteArrayInputStream bin = new ByteArrayInputStream("[]".getBytes(StandardCharsets.UTF_16));
-        try (JsonParser parser = Json.createParser(bin)) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStreamWithConfig() {
-        Map<String, ?> config = new HashMap<>();
-        try (JsonParser parser = Json.createParserFactory(config).createParser(
-                new ByteArrayInputStream(new byte[]{'[', ']'}))) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStructure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createArrayBuilder().build())) {
-            testEmptyArray(parser);
-        }
-    }
-
-    public void testEmptyArrayStructureWithConfig() {
-        Map<String, ?> config = new HashMap<>();
-        try (JsonParser parser = Json.createParserFactory(config).createParser(
-                Json.createArrayBuilder().build())) {
-            testEmptyArray(parser);
-        }
-    }
-
-    @SuppressWarnings("UnusedDeclaration")
-    static void testEmptyArray(JsonParser parser) {
-        while (parser.hasNext()) {
-            parser.next();
-        }
-    }
-
-
-    public void testEmptyArrayReaderIterator() {
-        try (JsonParser parser = Json.createParser(new StringReader("[]"))) {
-            testEmptyArrayIterator(parser);
-        }
-    }
-
-    public void testEmptyArrayStructureIterator() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createArrayBuilder().build())) {
-            testEmptyArrayIterator(parser);
-        }
-    }
-
-    static void testEmptyArrayIterator(JsonParser parser) {
-        assertEquals(true, parser.hasNext());
-        assertEquals(true, parser.hasNext());
-        assertEquals(Event.START_ARRAY, parser.next());
-
-        assertEquals(true, parser.hasNext());
-        assertEquals(true, parser.hasNext());
-        assertEquals(Event.END_ARRAY, parser.next());
-
-        assertEquals(false, parser.hasNext());
-        assertEquals(false, parser.hasNext());
-        try {
-            parser.next();
-            fail("Should have thrown a NoSuchElementException");
-        } catch (NoSuchElementException ne) {
-        }
-    }
-
-
-    public void testEmptyArrayIterator2Reader() {
-        try (JsonParser parser = Json.createParser(new StringReader("[]"))) {
-            testEmptyArrayIterator2(parser);
-        }
-    }
-
-    public void testEmptyArrayIterator2Structure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createArrayBuilder().build())) {
-            testEmptyArrayIterator2(parser);
-        }
-    }
-
-    static void testEmptyArrayIterator2(JsonParser parser) {
-        assertEquals(Event.START_ARRAY, parser.next());
-        assertEquals(Event.END_ARRAY, parser.next());
-        try {
-            parser.next();
-            fail("Should have thrown a NoSuchElementException");
-        } catch (NoSuchElementException ne) {
-        }
-    }
-
-    public void testEmptyArrayIterator3Reader() {
-        try (JsonParser parser = Json.createParser(new StringReader("[]"))) {
-            testEmptyArrayIterator3(parser);
-        }
-    }
-
-    public void testEmptyArrayIterator3Structure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createArrayBuilder().build())) {
-            testEmptyArrayIterator3(parser);
-        }
-    }
-
-    static void testEmptyArrayIterator3(JsonParser parser) {
-        assertEquals(Event.START_ARRAY, parser.next());
-        assertEquals(Event.END_ARRAY, parser.next());
-        assertEquals(false, parser.hasNext());
-        try {
-            parser.next();
-            fail("Should have thrown a NoSuchElementException");
-        } catch (NoSuchElementException ne) {
-        }
-    }
-
-
-    // Tests empty object
-    public void testEmptyObjectReader() {
-        try (JsonParser parser = Json.createParser(new StringReader("{}"))) {
-            testEmptyObject(parser);
-        }
-    }
-
-    public void testEmptyObjectStream() {
-        try (JsonParser parser = Json.createParser(
-                new ByteArrayInputStream(new byte[]{'{', '}'}))) {
-            testEmptyObject(parser);
-        }
-    }
-
-    public void testEmptyObjectStructure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createObjectBuilder().build())) {
-            testEmptyObject(parser);
-        }
-    }
-
-    public void testEmptyObjectStructureWithConfig() {
-        Map<String, ?> config = new HashMap<>();
-        try (JsonParser parser = Json.createParserFactory(config).createParser(
-                Json.createObjectBuilder().build())) {
-            testEmptyObject(parser);
-        }
-    }
-
-    @SuppressWarnings("UnusedDeclaration")
-    static void testEmptyObject(JsonParser parser) {
-        while (parser.hasNext()) {
-            parser.next();
-        }
-    }
-
-
-    public void testEmptyObjectIteratorReader() {
-        try (JsonParser parser = Json.createParser(new StringReader("{}"))) {
-            testEmptyObjectIterator(parser);
-        }
-    }
-
-    public void testEmptyObjectIteratorStructure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createObjectBuilder().build())) {
-            testEmptyObjectIterator(parser);
-        }
-    }
-
-    static void testEmptyObjectIterator(JsonParser parser) {
-        assertEquals(true, parser.hasNext());
-        assertEquals(true, parser.hasNext());
-        assertEquals(Event.START_OBJECT, parser.next());
-
-        assertEquals(true, parser.hasNext());
-        assertEquals(true, parser.hasNext());
-        assertEquals(Event.END_OBJECT, parser.next());
-
-        assertEquals(false, parser.hasNext());
-        assertEquals(false, parser.hasNext());
-        try {
-            parser.next();
-            fail("Should have thrown a NoSuchElementException");
-        } catch (NoSuchElementException ne) {
-        }
-    }
-
-
-    public void testEmptyObjectIterator2Reader() {
-        try (JsonParser parser = Json.createParser(new StringReader("{}"))) {
-            testEmptyObjectIterator2(parser);
-        }
-    }
-
-    public void testEmptyObjectIterator2Structure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createObjectBuilder().build())) {
-            testEmptyObjectIterator2(parser);
-        }
-    }
-
-    static void testEmptyObjectIterator2(JsonParser parser) {
-        assertEquals(Event.START_OBJECT, parser.next());
-        assertEquals(Event.END_OBJECT, parser.next());
-        try {
-            parser.next();
-            fail("Should have thrown a NoSuchElementException");
-        } catch (NoSuchElementException ne) {
-        }
-    }
-
-
-    public void testEmptyObjectIterator3Reader() {
-        try (JsonParser parser = Json.createParser(new StringReader("{}"))) {
-            testEmptyObjectIterator3(parser);
-        }
-    }
-
-    public void testEmptyObjectIterator3Structure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createObjectBuilder().build())) {
-            testEmptyObjectIterator3(parser);
-        }
-    }
-
-    static void testEmptyObjectIterator3(JsonParser parser) {
-        assertEquals(Event.START_OBJECT, parser.next());
-        assertEquals(Event.END_OBJECT, parser.next());
-        assertEquals(false, parser.hasNext());
-        try {
-            parser.next();
-            fail("Should have thrown a NoSuchElementException");
-        } catch (NoSuchElementException ne) {
-            // expected
-        }
-    }
-
-
-    public void testWikiIteratorReader() throws Exception {
-        try (JsonParser parser = Json.createParser(wikiReader())) {
-            testWikiIterator(parser);
-        }
-    }
-
-    public void testWikiIteratorStructure() throws Exception {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                JsonBuilderTest.buildPerson())) {
-            testWikiIterator(parser);
-        }
-    }
-
-    @SuppressWarnings("UnusedDeclaration")
-    static void testWikiIterator(JsonParser parser) throws Exception {
-        while (parser.hasNext()) {
-            parser.next();
-        }
-    }
-
-    public void testWikiInputStream() throws Exception {
-        try (JsonParser parser = Json.createParser(wikiStream())) {
-            testWiki(parser);
-        }
-    }
-
-    public void testWikiInputStreamUTF16LE() throws Exception {
-        ByteArrayInputStream bin = new ByteArrayInputStream(wikiString()
-                .getBytes(StandardCharsets.UTF_16LE));
-        try (JsonParser parser = Json.createParser(bin)) {
-            testWiki(parser);
-        }
-    }
-
-    public void testWikiReader() throws Exception {
-        try (JsonParser parser = Json.createParser(wikiReader())) {
-            testWiki(parser);
-        }
-    }
-
-    public void testWikiStructure() throws Exception {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                JsonBuilderTest.buildPerson())) {
-            testWiki(parser);
-        }
-    }
-
-    static void testWiki(JsonParser parser) {
-
-        Event event = parser.next();
-        assertEquals(Event.START_OBJECT, event);
-
-        testObjectStringValue(parser, "firstName", "John");
-        testObjectStringValue(parser, "lastName", "Smith");
-
-        event = parser.next();
-        assertEquals(Event.KEY_NAME, event);
-        assertEquals("age", parser.getString());
-
-        event = parser.next();
-        assertEquals(Event.VALUE_NUMBER, event);
-        assertEquals(25, parser.getInt());
-        assertEquals(25, parser.getLong());
-        assertEquals(25, parser.getBigDecimal().intValue());
-        assertTrue( parser.isIntegralNumber());
-
-        event = parser.next();
-        assertEquals(Event.KEY_NAME, event);
-        assertEquals("address", parser.getString());
-
-        event = parser.next();
-        assertEquals(Event.START_OBJECT, event);
-
-
-        testObjectStringValue(parser, "streetAddress", "21 2nd Street");
-        testObjectStringValue(parser, "city", "New York");
-        testObjectStringValue(parser, "state", "NY");
-        testObjectStringValue(parser, "postalCode", "10021");
-
-        event = parser.next();
-        assertEquals(Event.END_OBJECT, event);
-
-        event = parser.next();
-        assertEquals(Event.KEY_NAME, event);
-        assertEquals("phoneNumber", parser.getString());
-
-        event = parser.next();
-        assertEquals(Event.START_ARRAY, event);
-        event = parser.next();
-        assertEquals(Event.START_OBJECT, event);
-        testObjectStringValue(parser, "type", "home");
-        testObjectStringValue(parser, "number", "212 555-1234");
-        event = parser.next();
-        assertEquals(Event.END_OBJECT, event);
-
-        event = parser.next();
-        assertEquals(Event.START_OBJECT, event);
-        testObjectStringValue(parser, "type", "fax");
-        testObjectStringValue(parser, "number", "646 555-4567");
-        event = parser.next();
-        assertEquals(Event.END_OBJECT, event);
-        event = parser.next();
-        assertEquals(Event.END_ARRAY, event);
-
-        event = parser.next();
-        assertEquals(Event.END_OBJECT, event);
-    }
-
-    static void testObjectStringValue(JsonParser parser, String name, String value) {
-        Event event = parser.next();
-        assertEquals(Event.KEY_NAME, event);
-        assertEquals(name, parser.getString());
-
-        event = parser.next();
-        assertEquals(Event.VALUE_STRING, event);
-        assertEquals(value, parser.getString());
-    }
-
-    public void testNestedArrayReader() {
-        try (JsonParser parser = Json.createParser(new StringReader("[[],[[]]]"))) {
-            testNestedArray(parser);
-        }
-    }
-
-    public void testNestedArrayStructure() {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                Json.createArrayBuilder()
-                        .add(Json.createArrayBuilder())
-                        .add(Json.createArrayBuilder()
-                                .add(Json.createArrayBuilder()))
-                        .build())) {
-            testNestedArray(parser);
-        }
-    }
-
-    static void testNestedArray(JsonParser parser) {
-        assertEquals(Event.START_ARRAY, parser.next());
-        assertEquals(Event.START_ARRAY, parser.next());
-        assertEquals(Event.END_ARRAY, parser.next());
-        assertEquals(Event.START_ARRAY, parser.next());
-        assertEquals(Event.START_ARRAY, parser.next());
-        assertEquals(Event.END_ARRAY, parser.next());
-        assertEquals(Event.END_ARRAY, parser.next());
-        assertEquals(Event.END_ARRAY, parser.next());
-        assertEquals(false, parser.hasNext());
-        assertEquals(false, parser.hasNext());
-    }
-
-    public void testExceptionsReader() throws Exception {
-        try (JsonParser parser = Json.createParser(wikiReader())) {
-            testExceptions(parser);
-        }
-    }
-
-    public void testExceptionsStructure() throws Exception {
-        try (JsonParser parser = Json.createParserFactory(null).createParser(
-                JsonBuilderTest.buildPerson())) {
-            testExceptions(parser);
-        }
-    }
-
-    static void testExceptions(JsonParser parser) {
-
-        Event event = parser.next();
-        assertEquals(Event.START_OBJECT, event);
-
-        try {
-            parser.getString();
-            fail("JsonParser#getString() should have thrown exception in START_OBJECT state");
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-
-        try {
-            parser.isIntegralNumber();
-            fail("JsonParser#getNumberType() should have thrown exception in START_OBJECT state");
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-
-        try {
-            parser.getInt();
-            fail("JsonParser#getInt() should have thrown exception in START_OBJECT state");
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-
-        try {
-            parser.getLong();
-            fail("JsonParser#getLong() should have thrown exception in START_OBJECT state");
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-
-        try {
-            parser.getBigDecimal();
-            fail("JsonParser#getBigDecimal() should have thrown exception in START_OBJECT state");
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-    }
-
-    static String wikiString() {
-        String str;
-        try (Scanner scanner = new Scanner(wikiReader())
-                .useDelimiter("\\A")) {
-            str = scanner.hasNext() ? scanner.next() : "";
-        }
-        return str;
-    }
-
-    static InputStream wikiStream() {
-        return JsonParserTest.class.getResourceAsStream("/wiki.json");
-    }
-
-    static Reader wikiReader() {
-        return new InputStreamReader(
-                JsonParserTest.class.getResourceAsStream("/wiki.json"), StandardCharsets.UTF_8);
-    }
-
-    public void testIntNumber() {
-        JsonParserFactory factory = Json.createParserFactory(null);
-
-        Random r = new Random(System.currentTimeMillis());
-
-        for(int i=0; i < 100000; i++) {
-            long num = i%2 == 0 ? r.nextInt() : r.nextLong();
-            try (JsonParser parser = factory.createParser(new StringReader("["+num+"]"))) {
-                parser.next();
-                parser.next();
-                assertEquals("Fails for num="+num, new BigDecimal(num).intValue(), parser.getInt());
-            }
-        }
-
-    }
-
-    public void testBigDecimalGetString() {
-        JsonParserFactory f = Json.createParserFactory(null);
-        JsonObject obj = Json.createObjectBuilder().add("a", BigDecimal.ONE).build();
-        try (JsonParser parser = f.createParser(obj)) {
-            parser.next();
-            parser.next();
-            parser.next();
-            assertEquals("Fails for BigDecimal=1", "1", parser.getString());
-        }
-    }
-
-    public void testIntGetString() {
-        JsonParserFactory f = Json.createParserFactory(null);
-        JsonObject obj = Json.createObjectBuilder().add("a", 5).build();
-        try (JsonParser parser = f.createParser(obj)) {
-            parser.next();
-            parser.next();
-            parser.next();
-            assertEquals("Fails for int=5", "5", parser.getString());
-        }
-    }
-    static class MyBufferPool implements BufferPool {
-        private boolean takeCalled;
-        private boolean recycleCalled;
-        private final char[] buf;
-
-        MyBufferPool(int size) {
-            buf = new char[size];
-        }
-
-        @Override
-        public char[] take() {
-            takeCalled = true;
-            return buf;
-        }
-
-        @Override
-        public void recycle(char[] buf) {
-            recycleCalled = true;
-        }
-
-        boolean isTakeCalled() {
-            return takeCalled;
-        }
-
-        boolean isRecycleCalled() {
-            return recycleCalled;
-        }
-    }
-
-    public void testBufferPoolFeature() {
-        final MyBufferPool bufferPool = new MyBufferPool(1024);
-        Map<String, Object> config = new HashMap<String, Object>() {{
-            put(BufferPool.class.getName(), bufferPool);
-        }};
-
-        JsonParserFactory factory = Json.createParserFactory(config);
-        try (JsonParser parser = factory.createParser(new StringReader("[]"))) {
-            parser.next();
-            parser.next();
-        }
-        assertTrue(bufferPool.isTakeCalled());
-        assertTrue(bufferPool.isRecycleCalled());
-    }
-
-    public void testBufferSizes() {
-        Random r = new Random(System.currentTimeMillis());
-        for(int size=100; size < 1000; size++) {
-            final MyBufferPool bufferPool = new MyBufferPool(size);
-            Map<String, Object> config = new HashMap<String, Object>() {{
-                put(BufferPool.class.getName(), bufferPool);
-            }};
-            JsonParserFactory factory = Json.createParserFactory(config);
-
-            StringBuilder sb = new StringBuilder();
-            for(int i=0; i < 1000; i++) {
-                sb.append('a');
-                String name = sb.toString();
-                long num = i%2 == 0 ? r.nextInt() : r.nextLong();
-                String str = "{\""+name+"\":["+num+"]}";
-                try (JsonParser parser = factory.createParser(new StringReader(str))) {
-                    parser.next();
-                    parser.next();
-                    assertEquals("Fails for " + str, name, parser.getString());
-                    parser.next();
-                    parser.next();
-                    assertEquals("Fails for "+str, new BigDecimal(num).intValue(), parser.getInt());
-                }
-            }
-        }
-    }
-
-    // Tests for string starting on buffer boundary (JSONP-15)
-    // xxxxxxx"xxxxxxxxx"
-    //        ^
-    //        |
-    //       4096
-    public void testStringUsingStandardBuffer() throws Throwable {
-        JsonParserFactory factory = Json.createParserFactory(null);
-        StringBuilder sb = new StringBuilder();
-        for(int i=0; i < 40000; i++) {
-            sb.append('a');
-            String name = sb.toString();
-            String str = "{\""+name+"\":\""+name+"\"}";
-            try (JsonParser parser = factory.createParser(new StringReader(str))) {
-                parser.next();
-                parser.next();
-                assertEquals("Fails for size=" + i, name, parser.getString());
-                parser.next();
-                assertEquals("Fails for size=" + i, name, parser.getString());
-            } catch (Throwable e) {
-                throw new Throwable("Failed for size=" + i, e);
-            }
-        }
-    }
-
-    // Tests for int starting on buffer boundary
-    // xxxxxxx"xxxxxxxxx"
-    //        ^
-    //        |
-    //       4096
-    public void testIntegerUsingStandardBuffer() throws Throwable {
-        Random r = new Random(System.currentTimeMillis());
-        JsonParserFactory factory = Json.createParserFactory(null);
-        StringBuilder sb = new StringBuilder();
-        for(int i=0; i < 40000; i++) {
-            sb.append('a');
-            String name = sb.toString();
-            int num = r.nextInt();
-            String str = "{\"" + name + "\":" + num + "}";
-            try (JsonParser parser = factory.createParser(new StringReader(str))) {
-                parser.next();
-                parser.next();
-                assertEquals("Fails for size=" + i, name, parser.getString());
-                parser.next();
-                assertEquals("Fails for size=" + i, num, parser.getInt());
-            } catch (Throwable e) {
-                throw new Throwable("Failed for size=" + i, e);
-            }
-        }
-    }
-
-    public void testStringUsingBuffers() throws Throwable {
-        for(int size=20; size < 500; size++) {
-            final MyBufferPool bufferPool = new MyBufferPool(size);
-            Map<String, Object> config = new HashMap<String, Object>() {{
-                put(BufferPool.class.getName(), bufferPool);
-            }};
-            JsonParserFactory factory = Json.createParserFactory(config);
-
-            StringBuilder sb = new StringBuilder();
-            for(int i=0; i < 1000; i++) {
-                sb.append('a');
-                String name = sb.toString();
-                String str = "{\""+name+"\":\""+name+"\"}";
-                JsonLocation location;
-                try (JsonParser parser = factory.createParser(new StringReader(str))) {
-                    parser.next();
-                    parser.next();
-                    assertEquals("name fails for buffer size=" + size + " name length=" + i, name, parser.getString());
-                    location = parser.getLocation();
-                    assertEquals("Stream offset fails for buffer size=" + size + " name length=" + i,
-                            name.length() + 3, location.getStreamOffset());
-                    assertEquals("Column value fails for buffer size=" + size + " name length=" + i,
-                            name.length() + 4, location.getColumnNumber());
-                    assertEquals("Line value fails for buffer size=" + size + " name length=" + i,
-                            1, location.getLineNumber());
-
-                    parser.next();
-                    assertEquals("value fails for buffer size=" + size + " name length=" + i, name, parser.getString());
-                    location = parser.getLocation();
-                    assertEquals("Stream offset fails for buffer size=" + size + " name length=" + i, 2 * name.length() + 6, location.getStreamOffset());
-                    assertEquals("Column value fails for buffer size=" + size + " name length=" + i,
-                            2 * name.length() + 7, location.getColumnNumber());
-                    assertEquals("Line value fails for buffer size=" + size + " name length=" + i,
-                            1, location.getLineNumber());
-                } catch (Throwable e) {
-                    throw new Throwable("Failed for buffer size=" + size + " name length=" + i, e);
-                }
-            }
-        }
-    }
-
-    public void testExceptionsFromHasNext() {
-        checkExceptionFromHasNext("{");
-        checkExceptionFromHasNext("{\"key\"");
-        checkExceptionFromHasNext("{\"name\" : \"prop\"");
-        checkExceptionFromHasNext("{\"name\" : 3");
-        checkExceptionFromHasNext("{\"name\" : true");
-        checkExceptionFromHasNext("{\"name\" : null");
-        checkExceptionFromHasNext("{\"name\" : {\"$eq\":\"cdc\"}");
-        checkExceptionFromHasNext("{\"name\" : [{\"$eq\":\"cdc\"}]");
-        checkExceptionFromHasNext("[");
-        checkExceptionFromHasNext("{\"name\" : [{\"key\" : [[{\"a\" : 1}]");
-        checkExceptionFromHasNext("{\"unique\":true,\"name\":\"jUnitTestIndexNeg005\", \"fields\":[{\"order\":-1,\"path\":\"city.zip\"}");
-    }
-
-    public void testEOFFromHasNext() {
-        checkExceptionFromHasNext("{ \"d\" : 1 } 2 3 4");
-        checkExceptionFromHasNext("[ {\"d\" : 1 }] 2 3 4");
-        checkExceptionFromHasNext("1 2 3 4");
-        checkExceptionFromHasNext("null 2 3 4");
-    }
-
-    public void testExceptionsFromNext() {
-        checkExceptionFromNext("{\"name\" : fal");
-        checkExceptionFromNext("{\"name\" : nu");
-        checkExceptionFromNext("{\"name\" : \"pro");
-        checkExceptionFromNext("{\"key\":");
-        checkExceptionFromNext("fal");
-    }
-
-    private void checkExceptionFromHasNext(String input) {
-        try (JsonParser parser = Json.createParser(new StringReader(input))) {
-            try {
-                while (parser.hasNext()) {
-                    try {
-                        parser.next();
-                    } catch (Throwable t1) {
-                        fail("Exception should occur from hasNext() for '" + input + "'");
-                    }
-                }
-            } catch (JsonParsingException t) {
-                //this is OK
-                return;
-            }
-        }
-        fail();
-    }
-
-    private void checkExceptionFromNext(String input) {
-        try (JsonParser parser = Json.createParser(new StringReader(input))) {
-            while (parser.hasNext()) {
-                try {
-                    parser.next();
-                } catch (JsonParsingException t) {
-                    //this is OK
-                    return;
-                }
-            }
-        }
-        fail();
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonParsingExceptionTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonParsingExceptionTest.java
deleted file mode 100644
index 68dba65..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonParsingExceptionTest.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.Json;
-import jakarta.json.stream.JsonLocation;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParsingException;
-import java.io.StringReader;
-
-/**
- * JsonParsingException Tests
- *
- * @author Jitendra Kotamraju
- */
-public class JsonParsingExceptionTest extends TestCase {
-
-    public void testWrongJson() {
-        // testMalformedJson("", null); Allowed in 1.1
-    }
-
-    public void testWrongJson1() {
-        // testMalformedJson("{}{}", null);  Allowed in 1.1
-    }
-
-    public void testWrongJson2() {
-        // testMalformedJson("{", null);  Allowed in 1.1
-    }
-
-    public void testWrongJson3() {
-        testMalformedJson("{[]", null);
-    }
-
-    public void testWrongJson4() {
-        testMalformedJson("{]", null);
-    }
-
-    public void testWrongJson5() {
-        testMalformedJson("{\"a\":[]]", null);
-    }
-
-    public void testWrongJson6() {
-        testMalformedJson("[ {}, [] }", null);
-    }
-
-    public void testWrongJson61() {
-        testMalformedJson("[ {}, {} }", null);
-    }
-
-    public void testWrongJson7() {
-        testMalformedJson("{ \"a\" : {}, \"b\": {} ]", null);
-    }
-
-    public void testWrongJson8() {
-        testMalformedJson("{ \"a\" : {}, \"b\": [] ]", null);
-    }
-
-    public void testWrongUnicode() {
-        testMalformedJson("[ \"\\uX00F\" ]", null);
-        testMalformedJson("[ \"\\u000Z\" ]", null);
-        testMalformedJson("[ \"\\u000\" ]", null);
-        testMalformedJson("[ \"\\u00\" ]", null);
-        testMalformedJson("[ \"\\u0\" ]", null);
-        testMalformedJson("[ \"\\u\" ]", null);
-        testMalformedJson("[ \"\\u\"", null);
-        testMalformedJson("[ \"\\", null);
-    }
-
-    public void testControlChar() {
-        testMalformedJson("[ \"\u0000\" ]", null);
-        testMalformedJson("[ \"\u000c\" ]", null);
-        testMalformedJson("[ \"\u000f\" ]", null);
-        testMalformedJson("[ \"\u001F\" ]", null);
-        testMalformedJson("[ \"\u001f\" ]", null);
-    }
-
-    public void testLocation1() {
-        testMalformedJson("x", new MyLocation(1, 1, 0));
-        testMalformedJson("{]", new MyLocation(1, 2, 1));
-        testMalformedJson("[}", new MyLocation(1, 2, 1));
-        testMalformedJson("[a", new MyLocation(1, 2, 1));
-        testMalformedJson("[nuLl]", new MyLocation(1, 4, 3));
-        testMalformedJson("[falsE]", new MyLocation(1, 6, 5));
-        // testMalformedJson("[][]", new MyLocation(1, 3, 2));   allowed in 1.1
-        testMalformedJson("[1234L]", new MyLocation(1, 6, 5));
-    }
-
-    public void testLocation2() {
-        testMalformedJson("[null\n}", new MyLocation(2, 1, 6));
-        testMalformedJson("[null\r\n}", new MyLocation(2, 1, 7));
-        testMalformedJson("[null\n, null\n}", new MyLocation(3, 1, 13));
-        testMalformedJson("[null\r\n, null\r\n}", new MyLocation(3, 1, 15));
-    }
-
-    private void testMalformedJson(String json, JsonLocation expected) {
-        try (JsonParser parser = Json.createParser(new StringReader(json))) {
-            while (parser.hasNext()) {
-                parser.next();
-            }
-            fail("Expected to throw JsonParsingException for " + json);
-        } catch (JsonParsingException je) {
-            // Expected
-            if (expected != null) {
-                JsonLocation got = je.getLocation();
-                assertEquals(expected.getLineNumber(), got.getLineNumber());
-                assertEquals(expected.getColumnNumber(), got.getColumnNumber());
-                assertEquals(expected.getStreamOffset(), got.getStreamOffset());
-            }
-        }
-    }
-
-    private static class MyLocation implements JsonLocation {
-        private final long columnNo;
-        private final long lineNo;
-        private final long streamOffset;
-
-        MyLocation(long lineNo, long columnNo, long streamOffset) {
-            this.lineNo = lineNo;
-            this.columnNo = columnNo;
-            this.streamOffset = streamOffset;
-        }
-
-        @Override
-        public long getLineNumber() {
-            return lineNo;
-        }
-
-        @Override
-        public long getColumnNumber() {
-            return columnNo;
-        }
-
-        @Override
-        public long getStreamOffset() {
-            return streamOffset;
-        }
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchBugsTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchBugsTest.java
deleted file mode 100644
index 6119783..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchBugsTest.java
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonException;
-import jakarta.json.JsonPatch;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonStructure;
-
-import java.io.StringReader;
-
-import org.junit.Test;
-
-/**
- *
- * @author lukas
- */
-public class JsonPatchBugsTest {
-
-    // https://github.com/javaee/jsonp/issues/58
-    @Test(expected = JsonException.class)
-    public void applyThrowsJsonException() {
-        JsonArray array = Json.createArrayBuilder()
-                .add(Json.createObjectBuilder()
-                        .add("name", "Bob")
-                        .build())
-                .build();
-        JsonPatch patch = Json.createPatchBuilder()
-                .replace("/0/name", "Bobek")
-                .replace("/1/name", "Vila Amalka")
-                .build();
-        JsonArray result = patch.apply(array);
-    }
-
-    // https://github.com/eclipse-ee4j/jsonp/issues/181
-    @Test(expected = JsonException.class)
-    public void applyThrowsJsonException2() {
-        // JSON document to be patched
-        String targetDocument
-                = "{\n"
-                + "  \"firstName\": \"John\",\n"
-                + "  \"lastName\": \"Doe\"\n"
-                + "}";
-
-        // JSON Patch document
-        // Instead of "op", we have "op_", which is invalid
-        String patchDocument
-                = "[\n"
-                + "  { \"op_\": \"replace\", \"path\": \"/firstName\", \"value\": \"Jane\" }\n"
-                + "]";
-
-        try (JsonReader objectReader = Json.createReader(new StringReader(targetDocument));
-                JsonReader arrayReader = Json.createReader(new StringReader(patchDocument))) {
-
-            JsonStructure target = objectReader.read();
-            JsonPatch patch = Json.createPatch(arrayReader.readArray());
-
-            // Applies the patch
-            // It will throw a NullPointerException with no message
-            JsonStructure patched = patch.apply(target);
-        }
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchBuilderTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchBuilderTest.java
deleted file mode 100644
index 4a8e379..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchBuilderTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import jakarta.json.Json;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPatchBuilder;
-
-import org.junit.Test;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-public class JsonPatchBuilderTest {
-
-    @Test
-    public void shouldBuildJsonPatchExpressionUsingJsonPatchBuilder() {
-        JsonPatchBuilder patchBuilder = Json.createPatchBuilder();
-        JsonObject result = patchBuilder.add("/email", "john@example.com")
-                    .replace("/age", 30)
-                    .remove("/phoneNumber")
-                    .test("/firstName", "John")
-                    .copy("/address/lastName", "/lastName")
-                    .build()
-                    .apply(buildPerson());
-        assertThat(result, is(expectedBuildPerson()));
-        
-    }
-
-    static JsonObject expectedBuildPerson() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("email", "john@example.com")
-                .add("age", 30)
-                .add("address", Json.createObjectBuilder()
-                        .add("lastName", "Smith")
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .build();
-    }
-
-    static JsonObject buildPerson() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchDiffTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchDiffTest.java
deleted file mode 100644
index 90df95e..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchDiffTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPatch;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonString;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-@RunWith(Parameterized.class)
-public class JsonPatchDiffTest {
-
-    @Parameters(name = "{index}: ({0})={1}")
-    public static Iterable<Object[]> data() throws Exception {
-        List<Object[]> examples = new ArrayList<>();
-        JsonArray data = JsonPatchDiffTest.loadData();
-        for (JsonValue jsonValue : data) {
-            JsonObject test = (JsonObject) jsonValue;
-            Object[] testData = new Object[4];
-            testData[0] = test.get("original");
-            testData[1] = test.get("target");
-            testData[2] = test.get("expected");
-            testData[3] = createExceptionClass((JsonString)test.get("exception"));
-
-            examples.add(testData);
-        }
-
-        return examples;
-    }
-
-    private static Class<? extends Exception> createExceptionClass(
-            JsonString exceptionClassName) throws ClassNotFoundException {
-        if (exceptionClassName != null) {
-            return (Class<? extends Exception>) Class
-                    .forName(exceptionClassName.getString());
-        }
-        return null;
-    }
-
-    private static JsonArray loadData() {
-        InputStream testData = JsonPatchTest.class
-                .getResourceAsStream("/jsonpatchdiff.json");
-
-        JsonArray data;
-        try(JsonReader reader = Json.createReader(testData)){
-            data = (JsonArray) reader.read();
-        }
-
-        return data;
-    }
-
-    private JsonStructure original;
-    private JsonStructure target;
-    private JsonValue expected;
-    private Class<? extends Exception> expectedException;
-
-    public JsonPatchDiffTest(JsonStructure original, JsonStructure target,
-            JsonValue expected, Class<? extends Exception> expectedException) {
-        super();
-        this.original = original;
-        this.target = target;
-        this.expected = expected;
-        this.expectedException = expectedException;
-    }
-
-    @Test
-    public void shouldExecuteJsonPatchDiffOperationsToJsonDocument() {
-        try {
-            JsonPatch diff = Json.createDiff(this.original, this.target);
-            assertThat(diff, is(Json.createPatchBuilder((JsonArray) expected).build()));
-            assertThat(expectedException, nullValue());
-        } catch (Exception e) {
-            if (expectedException == null) {
-                fail(e.getMessage());
-            } else {
-                assertThat(e, instanceOf(expectedException));
-            }
-        }
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchOperationTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchOperationTest.java
deleted file mode 100644
index 1d03df4..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchOperationTest.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import jakarta.json.JsonException;
-import jakarta.json.JsonPatch.Operation;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- *
- * @author lukas
- */
-public class JsonPatchOperationTest {
-
-    private static final String[] opNames = {"add", "remove", "replace", "move", "copy", "test"};
-
-    @Test
-    public void fromOperationName() {
-        for (String op: opNames) {
-            Assert.assertEquals(Operation.valueOf(op.toUpperCase()), Operation.fromOperationName(op));
-        }
-        for (String op: opNames) {
-            Assert.assertEquals(Operation.valueOf(op.toUpperCase()), Operation.fromOperationName(op.toUpperCase()));
-        }
-    }
-
-    @Test(expected = JsonException.class)
-    public void fromInvalidOperationName() {
-        Operation.fromOperationName("undef");
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchTest.java
deleted file mode 100644
index 065ce12..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPatchTest.java
+++ /dev/null
@@ -1,118 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPatch;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonString;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-@RunWith(Parameterized.class)
-public class JsonPatchTest {
-
-    @Parameters(name = "{index}: ({0})={1}")
-    public static Iterable<Object[]> data() throws Exception {
-        List<Object[]> examples = new ArrayList<>();
-        JsonArray data = loadData();
-        for (JsonValue jsonValue : data) {
-            JsonObject test = (JsonObject) jsonValue;
-            Object[] testData = new Object[4];
-            testData[0] = createPatchArray(test.get("op"));
-            testData[1] = test.get("target");
-            testData[2] = test.get("expected");
-            testData[3] = createExceptionClass((JsonString)test.get("exception"));
-
-            examples.add(testData);
-        }
-
-        return examples;
-    }
-
-    private static Class<? extends Exception> createExceptionClass(
-            JsonString exceptionClassName) throws ClassNotFoundException {
-        if (exceptionClassName != null) {
-            return (Class<? extends Exception>) Class
-                    .forName(exceptionClassName.getString());
-        }
-        return null;
-    }
-
-    private static JsonArray createPatchArray(JsonValue object) {
-        return Json.createArrayBuilder().add(object).build();
-    }
-
-    private static JsonArray loadData() {
-        InputStream testData = JsonPatchTest.class
-                .getResourceAsStream("/jsonpatch.json");
-        JsonReader reader = Json.createReader(testData);
-        return (JsonArray) reader.read();
-    }
-
-    private JsonArray patch;
-    private JsonStructure target;
-    private JsonValue expected;
-    private Class<? extends Exception> expectedException;
-
-    public JsonPatchTest(JsonArray patch, JsonStructure target,
-            JsonValue expected, Class<? extends Exception> expectedException) {
-        super();
-        this.patch = patch;
-        this.target = target;
-        this.expected = expected;
-        this.expectedException = expectedException;
-    }
-
-    @Test
-    public void shouldExecuteJsonPatchOperationsToJsonDocument() {
-        try {
-            JsonPatch patch = Json.createPatchBuilder(this.patch).build();
-            JsonStructure output = patch.apply(target);
-            assertThat(output, is(expected));
-            assertThat(expectedException, nullValue());
-        } catch (Exception e) {
-            if (expectedException == null) {
-                fail(e.getMessage());
-            } else {
-                assertThat(e, instanceOf(expectedException));
-            }
-        }
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerAddOperationTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerAddOperationTest.java
deleted file mode 100644
index 81da0ae..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerAddOperationTest.java
+++ /dev/null
@@ -1,203 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.util.Arrays;
-
-import jakarta.json.Json;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPointer;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-@RunWith(Parameterized.class)
-public class JsonPointerAddOperationTest {
-
-    @Parameters(name = "{index}: ({0})={1}")
-    public static Iterable<Object[]> data() throws Exception {
-        return Arrays.asList(new Object[][] { 
-                 {buildSimpleAddPatch(), buildAddress(), buildExpectedAddress() },
-                 {buildComplexAddPatch(), buildPerson(), buildExpectedPerson()},
-                 {buildArrayAddPatchInPosition(), buildPerson(), buildExpectedPersonConcreteArrayPosition()},
-                 {buildArrayAddPatchInLastPosition(), buildPerson(), buildExpectedPersonArrayLastPosition()}
-           });
-    }
-
-    private JsonObject pathOperation;
-    private JsonStructure target;
-    private JsonValue expectedResult;
-
-    public JsonPointerAddOperationTest(JsonObject pathOperation,
-                                       JsonStructure target, JsonValue expectedResult) {
-        super();
-        this.pathOperation = pathOperation;
-        this.target = target;
-        this.expectedResult = expectedResult;
-    }
-
-    @Test
-    public void shouldAddElementsToExistingJsonDocument() {
-        JsonPointer pointer = Json.createPointer(pathOperation.getString("path"));
-        JsonObject modified = (JsonObject) pointer.add(target, pathOperation.get("value"));
-        assertThat(modified, is(expectedResult));
-    }
-
-    static JsonObject buildAddress() {
-        return Json.createObjectBuilder()
-                .add("streetAddress", "21 2nd Street")
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021")
-                .build();
-    }
-    static JsonObject buildComplexAddPatch() {
-        return Json.createObjectBuilder()
-                .add("op", "add")
-                .add("path", "/address/streetAddress")
-                .add("value", "myaddress")
-                .build();
-    }
-    static JsonObject buildSimpleAddPatch() {
-        return Json.createObjectBuilder()
-                .add("op", "add")
-                .add("path", "/streetAddress")
-                .add("value", "myaddress")
-                .build();
-    }
-    static JsonObject buildArrayAddPatchInPosition() {
-        return Json.createObjectBuilder()
-                .add("op", "add")
-                .add("path", "/phoneNumber/0")
-                .add("value", Json.createObjectBuilder()
-                        .add("type", "home")
-                        .add("number", "200 555-1234"))
-                .build();
-    }
-    static JsonObject buildArrayAddPatchInLastPosition() {
-        return Json.createObjectBuilder()
-                .add("op", "add")
-                .add("path", "/phoneNumber/-")
-                .add("value", Json.createObjectBuilder()
-                        .add("type", "home")
-                        .add("number", "200 555-1234"))
-                .build();
-    }
-    static JsonObject buildExpectedAddress() {
-        return Json.createObjectBuilder()
-                .add("streetAddress", "myaddress")
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021")
-                .build();
-    }
-    static JsonObject buildPerson() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-    static JsonObject buildExpectedPersonConcreteArrayPosition() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add((Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "200 555-1234")))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-    static JsonObject buildExpectedPersonArrayLastPosition() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567"))
-                         .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "200 555-1234")))
-                .build();
-    }
-    static JsonObject buildExpectedPerson() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "myaddress")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerEscapeTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerEscapeTest.java
deleted file mode 100644
index 0ef8c4e..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerEscapeTest.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (c) 2017, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import org.junit.Test;
-
-import jakarta.json.Json;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * JSON pointer escape/unescape tests.
- *
- * @author Dmitry Kornilov
- */
-public class JsonPointerEscapeTest {
-
-    @Test
-    public void escapeTest() {
-        assertEquals("a~1b", Json.encodePointer("a/b"));
-        assertEquals("a~0b~1c", Json.encodePointer("a~b/c"));
-    }
-
-    @Test
-    public void unescapeTest() {
-        assertEquals("/a/b", Json.decodePointer("/a~1b"));
-        assertEquals("/~1", Json.decodePointer("/~01"));
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerRemoveOperationTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerRemoveOperationTest.java
deleted file mode 100644
index d696606..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerRemoveOperationTest.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertThat;
-
-import java.util.Arrays;
-
-import jakarta.json.Json;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPointer;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-@RunWith(Parameterized.class)
-public class JsonPointerRemoveOperationTest {
-
-    @Parameters(name = "{index}: ({0})={1}")
-    public static Iterable<Object[]> data() throws Exception {
-        return Arrays.asList(new Object[][] { 
-                 {buildSimpleRemovePatch(), buildAddress(), buildExpectedRemovedAddress() },
-                 {buildComplexRemovePatch(), buildPerson(), buildExpectedPersonWithoutStreetAddress()},
-                 {buildArrayRemovePatchInPosition(), buildPerson(), buildPersonWithoutFirstPhone()}
-           });
-    }
-
-    private JsonObject pathOperation;
-    private JsonStructure target;
-    private JsonValue expectedResult;
-
-    public JsonPointerRemoveOperationTest(JsonObject pathOperation,
-                                          JsonObject target, JsonValue expectedResult) {
-        super();
-        this.pathOperation = pathOperation;
-        this.target = target;
-        this.expectedResult = expectedResult;
-    }
-
-    @Test
-    public void shouldRemoveElementsToExistingJsonDocument() {
-        JsonPointer pointer = Json.createPointer(pathOperation.getString("path"));
-        JsonObject modified = (JsonObject) pointer.remove(target);
-        assertThat(modified, is(expectedResult));
-    }
-
-    static JsonObject buildPerson() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-    static JsonObject buildAddress() {
-        return Json.createObjectBuilder()
-                .add("streetAddress", "21 2nd Street")
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021")
-                .build();
-    }
-    static JsonObject buildComplexRemovePatch() {
-        return Json.createObjectBuilder()
-                .add("op", "remove")
-                .add("path", "/address/streetAddress")
-                .build();
-    }
-    static JsonObject buildSimpleRemovePatch() {
-        return Json.createObjectBuilder()
-                .add("op", "remove")
-                .add("path", "/streetAddress")
-                .build();
-    }
-    static JsonObject buildArrayRemovePatchInPosition() {
-        return Json.createObjectBuilder()
-                .add("op", "remove")
-                .add("path", "/phoneNumber/0")
-                .build();
-    }
-    static JsonObject buildExpectedRemovedAddress() {
-        return Json.createObjectBuilder()
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021")
-                .build();
-    }
-    static JsonObject buildPersonWithoutFirstPhone() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-    static JsonObject buildExpectedPersonWithoutStreetAddress() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerReplaceOperationTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerReplaceOperationTest.java
deleted file mode 100644
index e4ae08b..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerReplaceOperationTest.java
+++ /dev/null
@@ -1,201 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.hamcrest.CoreMatchers.instanceOf;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-
-import java.util.Arrays;
-
-import jakarta.json.Json;
-import jakarta.json.JsonException;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPointer;
-import jakarta.json.JsonStructure;
-import jakarta.json.JsonValue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-@RunWith(Parameterized.class)
-public class JsonPointerReplaceOperationTest {
-
-    @Parameters(name = "{index}: ({0})={1}")
-    public static Iterable<Object[]> data() throws Exception {
-        return Arrays.asList(new Object[][] { 
-                 {buildSimpleReplacePatch(), buildAddress(), buildExpectedAddress(), null},
-                 {buildComplexReplacePatch(), buildPerson(), buildExpectedPerson(), null},
-                 {buildArrayReplacePatchInPosition(), buildPerson(), buildExpectedPersonConcreteArrayPosition(), null},
-                 {buildArrayAddPatchInLastPosition(), buildPerson(), null, JsonException.class},
-                 {buildNoneExistingReplacePatch(), buildAddress(), null, JsonException.class}
-           });
-    }
-
-    private JsonObject pathOperation;
-    private JsonStructure target;
-    private JsonValue expectedResult;
-    private Class<? extends Exception> expectedException;
-
-    public JsonPointerReplaceOperationTest(JsonObject pathOperation,
-            JsonStructure target, JsonValue expectedResult, Class<? extends Exception> expectedException) {
-        super();
-        this.pathOperation = pathOperation;
-        this.target = target;
-        this.expectedResult = expectedResult;
-        this.expectedException = expectedException;
-    }
-
-    @Test
-    public void shouldReplaceElementsToExistingJsonDocument() {
-        try {
-        JsonPointer pointer = Json.createPointer(pathOperation.getString("path"));
-        JsonObject modified = (JsonObject) pointer.replace(target, pathOperation.get("value"));
-        assertThat(modified, is(expectedResult));
-        assertThat(expectedException, nullValue());
-        } catch(Exception e) {
-            if(expectedException == null) {
-                fail(e.getMessage());
-            } else {
-                assertThat(e, instanceOf(expectedException));
-            }
-        }
-    }
-
-    static JsonObject buildAddress() {
-        return Json.createObjectBuilder()
-                .add("streetAddress", "21 2nd Street")
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021")
-                .build();
-    }
-    static JsonObject buildComplexReplacePatch() {
-        return Json.createObjectBuilder()
-                .add("op", "add")
-                .add("path", "/address/streetAddress")
-                .add("value", "myaddress")
-                .build();
-    }
-    static JsonObject buildSimpleReplacePatch() {
-        return Json.createObjectBuilder()
-                .add("op", "replace")
-                .add("path", "/streetAddress")
-                .add("value", "myaddress")
-                .build();
-    }
-    static JsonObject buildNoneExistingReplacePatch() {
-        return Json.createObjectBuilder()
-                .add("op", "replace")
-                .add("path", "/notexists")
-                .add("value", "myaddress")
-                .build();
-    }
-    static JsonObject buildArrayReplacePatchInPosition() {
-        return Json.createObjectBuilder()
-                .add("op", "replace")
-                .add("path", "/phoneNumber/0")
-                .add("value", Json.createObjectBuilder()
-                        .add("type", "home")
-                        .add("number", "200 555-1234"))
-                .build();
-    }
-    static JsonObject buildArrayAddPatchInLastPosition() {
-        return Json.createObjectBuilder()
-                .add("op", "add")
-                .add("path", "/phoneNumber/-")
-                .add("value", Json.createObjectBuilder()
-                        .add("type", "home")
-                        .add("number", "200 555-1234"))
-                .build();
-    }
-    static JsonObject buildExpectedAddress() {
-        return Json.createObjectBuilder()
-                .add("streetAddress", "myaddress")
-                .add("city", "New York")
-                .add("state", "NY")
-                .add("postalCode", "10021")
-                .build();
-    }
-    static JsonObject buildPerson() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-    static JsonObject buildExpectedPersonConcreteArrayPosition() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "21 2nd Street")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add((Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "200 555-1234")))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-    static JsonObject buildExpectedPerson() {
-        return Json.createObjectBuilder()
-                .add("firstName", "John")
-                .add("lastName", "Smith")
-                .add("age", 25)
-                .add("address", Json.createObjectBuilder()
-                        .add("streetAddress", "myaddress")
-                        .add("city", "New York")
-                        .add("state", "NY")
-                        .add("postalCode", "10021"))
-                .add("phoneNumber", Json.createArrayBuilder()
-                        .add(Json.createObjectBuilder()
-                                .add("type", "home")
-                                .add("number", "212 555-1234"))
-                        .add(Json.createObjectBuilder()
-                                .add("type", "fax")
-                                .add("number", "646 555-4567")))
-                .build();
-    }
-    
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerTest.java
deleted file mode 100644
index 7650f70..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-import static org.hamcrest.CoreMatchers.is;
-import static org.hamcrest.CoreMatchers.nullValue;
-import static org.hamcrest.CoreMatchers.instanceOf;
-
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.util.Arrays;
-
-import jakarta.json.Json;
-import jakarta.json.JsonException;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonPointer;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonValue;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * 
- * @author Alex Soto
- *
- */
-@RunWith(Parameterized.class)
-public class JsonPointerTest {
-
-    private static JsonObject rfc6901Example;
-
-    @Parameters(name = "{index}: ({0})={1}")
-    public static Iterable<Object[]> data() throws Exception {
-        rfc6901Example = JsonPointerTest.readRfc6901Example();
-        return Arrays.asList(new Object[][] { 
-                 {Json.createPointer(""), rfc6901Example, null },
-                 {Json.createPointer("/foo"), rfc6901Example.getJsonArray("foo"), null},
-                 {Json.createPointer("/foo/0"), rfc6901Example.getJsonArray("foo").get(0), null},
-                 {Json.createPointer("/foo/5"), null, JsonException.class},
-                 {Json.createPointer("/p/1"), null, JsonException.class},
-                 {Json.createPointer("/"), rfc6901Example.getJsonNumber(""), null},
-                 {Json.createPointer("/a~1b"), rfc6901Example.getJsonNumber("a/b"), null},
-                 {Json.createPointer("/m~0n"), rfc6901Example.getJsonNumber("m~n"), null},
-                 {Json.createPointer("/c%d"), rfc6901Example.getJsonNumber("c%d"), null},
-                 {Json.createPointer("/e^f"), rfc6901Example.getJsonNumber("e^f"), null},
-                 {Json.createPointer("/g|h"), rfc6901Example.getJsonNumber("g|h"), null},
-                 {Json.createPointer("/i\\j"), rfc6901Example.getJsonNumber("i\\j"), null},
-                 {Json.createPointer("/k\"l"), rfc6901Example.getJsonNumber("k\"l"), null},
-                 {Json.createPointer("/ "), rfc6901Example.getJsonNumber(" "), null},
-                 {Json.createPointer("/notexists"), null, JsonException.class},
-                 {Json.createPointer("/s/t"), null, JsonException.class},
-                 {Json.createPointer("/o"), JsonObject.NULL, null}
-           });
-    }
-
-    private JsonPointer pointer;
-    private JsonValue expected;
-    private Class<? extends Exception> expectedException;
-
-    public JsonPointerTest(JsonPointer pointer, JsonValue expected, Class<? extends Exception> expectedException) {
-        super();
-        this.pointer = pointer;
-        this.expected = expected;
-        this.expectedException = expectedException;
-    }
-
-    @Test
-    public void shouldEvaluateJsonPointerExpressions() {
-        try {
-            JsonValue result = pointer.getValue(rfc6901Example);
-            assertThat(result, is(expected));
-            assertThat(expectedException, nullValue());
-        } catch(Exception e) {
-            if(expectedException == null) {
-                fail(e.getMessage());
-            } else {
-                assertThat(e, instanceOf(expectedException));
-            }
-        }
-    }
-
-    static JsonObject readRfc6901Example() throws Exception {
-        Reader rfc6901Reader = new InputStreamReader(JsonReaderTest.class.getResourceAsStream("/rfc6901.json"));
-        JsonReader reader = Json.createReader(rfc6901Reader);
-        JsonValue value = reader.readObject();
-        reader.close();
-        return (JsonObject) value;
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerToStringTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerToStringTest.java
deleted file mode 100644
index 66c5d1e..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonPointerToStringTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import static org.junit.Assert.assertThat;
-import static org.hamcrest.CoreMatchers.equalTo;
-import static org.hamcrest.CoreMatchers.is;
-
-import java.util.Arrays;
-
-import jakarta.json.Json;
-import jakarta.json.JsonPointer;
-
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * JSON pointer toString tests.
- *
- * @author leadpony
- */
-@RunWith(Parameterized.class)
-public class JsonPointerToStringTest {
-
-    @Parameters(name = "{index}: {0}")
-    public static Iterable<Object> data() {
-        return Arrays.asList("", "/", "/one/two/3", "/a~1b", "/m~0n");
-    }
-
-    private final String expected;
-
-    public JsonPointerToStringTest(String expected) {
-        this.expected = expected;
-    }
-
-    @Test
-    public void shouldReturnOriginalEscapedString() {
-        JsonPointer pointer = Json.createPointer(expected);
-        assertThat(pointer.toString(), is(equalTo(expected)));
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonReaderTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonReaderTest.java
deleted file mode 100644
index 955fc63..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonReaderTest.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.io.StringReader;
-import java.math.BigInteger;
-import java.util.HashMap;
-import java.util.Map;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonNumber;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonReaderFactory;
-import jakarta.json.JsonValue;
-
-import org.eclipse.jsonp.api.BufferPool;
-
-import junit.framework.TestCase;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class JsonReaderTest extends TestCase {
-    public JsonReaderTest(String testName) {
-        super(testName);
-    }
-
-    public void testObject() throws Exception {
-        JsonObject person = readPerson();
-        JsonObjectTest.testPerson(person);
-    }
-
-    public void testEscapedString() throws Exception {
-        // u00ff is escaped once, not escaped once
-        JsonReader reader = Json.createReader(new StringReader("[\"\\u0000\\u00ff\u00ff\"]"));
-        JsonArray array = reader.readArray();
-        reader.close();
-        String str = array.getString(0);
-        assertEquals("\u0000\u00ff\u00ff", str);
-    }
-
-    public void testPrimitiveIntNumbers() {
-        String[] borderlineCases = new String[]{
-                "214748364",
-                Integer.toString(Integer.MAX_VALUE),
-                Long.toString(Integer.MAX_VALUE + 1L),
-                "-214748364",
-                Integer.toString(Integer.MIN_VALUE),
-                Long.toString(Integer.MIN_VALUE - 1L)
-        };
-        for (String num : borderlineCases) {
-            JsonReader reader = Json.createReader(new StringReader("["+num+"]"));
-            try {
-                JsonArray array = reader.readArray();
-                JsonNumber value = (JsonNumber) array.get(0);
-                assertEquals("Fails for num="+num, new BigInteger(num).longValue(), value.longValue());
-            } finally {
-                reader.close();
-            }
-        }
-    }
-    
-    public void testPrimitiveLongNumbers() {
-        String[] borderlineCases = new String[]{
-                "922337203685477580",
-                Long.toString(Long.MAX_VALUE),
-                new BigInteger(Long.toString(Long.MAX_VALUE)).add(BigInteger.ONE).toString(),
-                "-922337203685477580",
-                Long.toString(Long.MIN_VALUE),
-                new BigInteger(Long.toString(Long.MIN_VALUE)).subtract(BigInteger.ONE).toString()
-        };
-        for (String num : borderlineCases) {
-            JsonReader reader = Json.createReader(new StringReader("["+num+"]"));
-            try {
-                JsonArray array = reader.readArray();
-                JsonNumber value = (JsonNumber) array.get(0);
-                assertEquals("Fails for num="+num, new BigInteger(num), value.bigIntegerValueExact());
-            } finally {
-                reader.close();
-            }
-        }
-    }
-
-    public void testUnknownFeature() throws Exception {
-        Map<String, Object> config = new HashMap<>();
-        config.put("foo", true);
-        JsonReaderFactory factory = Json.createReaderFactory(config);
-        factory.createReader(new StringReader("{}"));
-        Map<String, ?> config1 = factory.getConfigInUse();
-        if (config1.size() > 0) {
-            fail("Shouldn't have any config in use");
-        }
-    }
-
-    public void testIllegalStateExcepton() throws Exception {
-        JsonReader reader = Json.createReader(new StringReader("{}"));
-        reader.readObject();
-        try {
-            reader.readObject();
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-        reader.close();
-
-        reader = Json.createReader(new StringReader("[]"));
-        reader.readArray();
-        try {
-            reader.readArray();
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-        reader.close();
-
-        reader = Json.createReader(new StringReader("{}"));
-        reader.read();
-        try {
-            reader.read();
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-        reader.close();
-    }
-
-    static JsonObject readPerson() throws Exception {
-        Reader wikiReader = new InputStreamReader(JsonReaderTest.class.getResourceAsStream("/wiki.json"));
-        JsonReader reader = Json.createReader(wikiReader);
-        JsonValue value = reader.readObject();
-        reader.close();
-        return (JsonObject) value;
-    }
-
-    // JSONP-23 cached empty string is not reset
-    public void testEmptyStringUsingStandardBuffer() throws Throwable {
-        JsonReaderFactory factory = Json.createReaderFactory(null);
-        StringBuilder sb = new StringBuilder();
-        for(int i=0; i < 40000; i++) {
-            sb.append('a');
-            String name = sb.toString();
-            String str = "[1, \"\", \""+name+"\", \"\", \""+name+"\", \"\", 100]";
-            try {
-                JsonReader reader = factory.createReader(new StringReader(str));
-                JsonArray array = reader.readArray();
-                assertEquals(1, array.getInt(0));
-                assertEquals("", array.getString(1));
-                assertEquals(name, array.getString(2));
-                assertEquals("", array.getString(3));
-                assertEquals(name, array.getString(4));
-                assertEquals("", array.getString(5));
-                assertEquals(100, array.getInt(6));
-                reader.close();
-            } catch (Throwable t) {
-                throw new Throwable("Failed for name length="+i, t);
-            }
-        }
-    }
-
-    // JSONP-23 cached empty string is not reset
-    public void testEmptyStringUsingBuffers() throws Throwable {
-        for(int size=20; size < 500; size++) {
-            final JsonParserTest.MyBufferPool bufferPool = new JsonParserTest.MyBufferPool(size);
-            Map<String, Object> config = new HashMap<String, Object>() {{
-                put(BufferPool.class.getName(), bufferPool);
-            }};
-            JsonReaderFactory factory = Json.createReaderFactory(config);
-
-            StringBuilder sb = new StringBuilder();
-            for(int i=0; i < 1000; i++) {
-                sb.append('a');
-                String name = sb.toString();
-                String str = "[1, \"\", \""+name+"\", \"\", \""+name+"\", \"\", 100]";
-                try {
-                    JsonReader reader = factory.createReader(new StringReader(str));
-                    JsonArray array = reader.readArray();
-                    assertEquals(1, array.getInt(0));
-                    assertEquals("", array.getString(1));
-                    assertEquals(name, array.getString(2));
-                    assertEquals("", array.getString(3));
-                    assertEquals(name, array.getString(4));
-                    assertEquals("", array.getString(5));
-                    assertEquals(100, array.getInt(6));
-                    reader.close();
-                } catch (Throwable t) {
-                    throw new Throwable("Failed for buffer size="+size+" name length="+i, t);
-                }
-            }
-        }
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonSamplesParsingTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonSamplesParsingTest.java
deleted file mode 100644
index 8bbe5f8..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonSamplesParsingTest.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.Json;
-import jakarta.json.JsonException;
-import jakarta.json.stream.JsonParser;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-
-/**
- * JsonParser tests for sample files
- *
- * @author Jitendra Kotamraju
- */
-public class JsonSamplesParsingTest extends TestCase {
-
-    public void testSampleFiles() {
-        String[] fileNames = {
-                "facebook.json", "facebook1.json", "facebook2.json",
-                "twitter.json"
-        };
-        for(String fileName: fileNames) {
-            try {
-                testSampleFile(fileName);
-            } catch(Exception e) {
-                throw new JsonException("Exception while parsing "+fileName, e);
-            }
-        }
-    }
-
-    private void testSampleFile(String fileName) {
-        Reader reader = new InputStreamReader(
-                JsonSamplesParsingTest.class.getResourceAsStream("/"+fileName), StandardCharsets.UTF_8);
-        JsonParser parser = null;
-        try {
-            parser = Json.createParser(reader);
-            while(parser.hasNext()) {
-                parser.next();
-            }
-        } finally {
-            if (parser != null) {
-                parser.close();
-            }
-        }
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonStringTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonStringTest.java
deleted file mode 100644
index 4279ef4..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonStringTest.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.*;
-import java.io.StringReader;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class JsonStringTest extends TestCase {
-    public JsonStringTest(String testName) {
-        super(testName);
-    }
-
-    // tests JsonString#toString()
-    public void testToString() throws Exception {
-        escapedString("");
-        escapedString("abc");
-        escapedString("abc\f");
-        escapedString("abc\na");
-        escapedString("abc\tabc");
-        escapedString("abc\n\tabc");
-        escapedString("abc\n\tabc\r");
-        escapedString("\n\tabc\r");
-        escapedString("\bab\tb\rc\\\"\ftesting1234");
-        escapedString("\f\babcdef\tb\rc\\\"\ftesting1234");
-        escapedString("\u0000\u00ff");
-        escapedString("abc\"\\/abc");
-    }
-
-    public void testHashCode() {
-        String string1 = new String("a");
-        JsonString jsonString1 = Json.createValue(string1);
-        assertTrue(jsonString1.hashCode() == jsonString1.getString().hashCode());
-
-        String string2 = new String("a");
-        JsonString jsonString2 = Json.createValue(string2);
-
-        assertTrue(jsonString1.equals(jsonString2));
-        assertTrue(jsonString1.hashCode() == jsonString2.hashCode());
-    }
-
-    void escapedString(String str) throws Exception {
-        JsonArray exp = Json.createArrayBuilder().add(str).build();
-        String parseStr = "["+exp.get(0).toString()+"]";
-        JsonReader jr = Json.createReader(new StringReader(parseStr));
-        JsonArray got = jr.readArray();
-        assertEquals(exp, got);
-        jr.close();
-    }
-
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonValueTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonValueTest.java
deleted file mode 100644
index 1f7b709..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonValueTest.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutputStream;
-import java.util.Collections;
-import jakarta.json.JsonObject;
-import jakarta.json.JsonString;
-import jakarta.json.JsonValue;
-import org.junit.Assert;
-import org.junit.Test;
-
-/**
- *
- * @author Lukas Jungmann
- */
-public class JsonValueTest {
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void arrayGetJsonObjectIdx() {
-        JsonValue.EMPTY_JSON_ARRAY.getJsonObject(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void arrayGetJsonArrayIdx() {
-        JsonValue.EMPTY_JSON_ARRAY.getJsonArray(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void arrayGetJsonNumberIdx() {
-        JsonValue.EMPTY_JSON_ARRAY.getJsonNumber(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void arrayGetJsonStringIdx() {
-        JsonValue.EMPTY_JSON_ARRAY.getJsonString(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void arrayGetStringIdx() {
-        JsonValue.EMPTY_JSON_ARRAY.getString(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void arrayGetIntIdx() {
-        JsonValue.EMPTY_JSON_ARRAY.getInt(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void arrayGetBooleanIdx() {
-        JsonValue.EMPTY_JSON_ARRAY.getBoolean(0);
-    }
-
-    @Test(expected = IndexOutOfBoundsException.class)
-    public void arrayIsNull() {
-        JsonValue.EMPTY_JSON_ARRAY.isNull(0);
-    }
-
-    @Test
-    public void arrayMethods() {
-        Assert.assertEquals(JsonValue.ValueType.ARRAY, JsonValue.EMPTY_JSON_ARRAY.getValueType());
-        Assert.assertEquals(Collections.<JsonObject>emptyList(), JsonValue.EMPTY_JSON_ARRAY.getValuesAs(JsonObject.class));
-        Assert.assertEquals(Collections.<String>emptyList(), JsonValue.EMPTY_JSON_ARRAY.getValuesAs(JsonString::getString));
-        Assert.assertEquals(true, JsonValue.EMPTY_JSON_ARRAY.getBoolean(0, true));
-        Assert.assertEquals(42, JsonValue.EMPTY_JSON_ARRAY.getInt(0, 42));
-        Assert.assertEquals("Sasek", JsonValue.EMPTY_JSON_ARRAY.getString(0, "Sasek"));
-    }
-
-    @Test(expected = UnsupportedOperationException.class)
-    public void arrayIsImmutable() {
-        JsonValue.EMPTY_JSON_ARRAY.add(JsonValue.EMPTY_JSON_OBJECT);
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void objectGetString() {
-        JsonValue.EMPTY_JSON_OBJECT.getString("normalni string");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void objectGetInt() {
-        JsonValue.EMPTY_JSON_OBJECT.getInt("hledej cislo");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void objectGetBoolean() {
-        JsonValue.EMPTY_JSON_OBJECT.getBoolean("booo");
-    }
-
-    @Test(expected = NullPointerException.class)
-    public void objectIsNull() {
-        JsonValue.EMPTY_JSON_OBJECT.isNull("???");
-    }
-
-    @Test
-    public void objectMethods() {
-        Assert.assertNull(JsonValue.EMPTY_JSON_OBJECT.getJsonArray("pole"));
-        Assert.assertNull(JsonValue.EMPTY_JSON_OBJECT.getJsonObject("objekt"));
-        Assert.assertNull(JsonValue.EMPTY_JSON_OBJECT.getJsonNumber("cislo"));
-        Assert.assertNull(JsonValue.EMPTY_JSON_OBJECT.getJsonString("divnej string"));
-        
-        Assert.assertEquals("ja jo", JsonValue.EMPTY_JSON_OBJECT.getString("nejsem tu", "ja jo"));
-        Assert.assertEquals(false, JsonValue.EMPTY_JSON_OBJECT.getBoolean("najdes mne", false));
-        Assert.assertEquals(98, JsonValue.EMPTY_JSON_OBJECT.getInt("spatnej dotaz", 98));
-    }
-    
-    
-    @Test(expected = UnsupportedOperationException.class)
-    public void objectImmutable() {
-        JsonValue.EMPTY_JSON_OBJECT.put("klauni", JsonValue.EMPTY_JSON_ARRAY);
-    }
-
-    @Test
-    public void serialization() {
-        byte[] data = serialize(JsonValue.TRUE);
-        JsonValue value = deserialize(JsonValue.class, data);
-        Assert.assertEquals(JsonValue.TRUE, value);
-
-        data = serialize(JsonValue.FALSE);
-        value = deserialize(JsonValue.class, data);
-        Assert.assertEquals(JsonValue.FALSE, value);
-
-        data = serialize(JsonValue.NULL);
-        value = deserialize(JsonValue.class, data);
-        Assert.assertEquals(JsonValue.NULL, value);
-
-        data = serialize(JsonValue.EMPTY_JSON_ARRAY);
-        value = deserialize(JsonValue.class, data);
-        Assert.assertEquals(JsonValue.EMPTY_JSON_ARRAY, value);
-
-        data = serialize(JsonValue.EMPTY_JSON_OBJECT);
-        value = deserialize(JsonValue.class, data);
-        Assert.assertEquals(JsonValue.EMPTY_JSON_OBJECT, value);
-    }
-
-    private byte[] serialize(Object o) {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
-            oos.writeObject(o);
-        } catch (IOException ioe) {
-            throw new RuntimeException(ioe);
-        }
-        return baos.toByteArray();
-    }
-
-    private <T> T deserialize(Class<T> type, byte[] data) {
-        ByteArrayInputStream bais = new ByteArrayInputStream(data);
-        try (ObjectInputStream ois = new ObjectInputStream(bais)) {
-            return (T) ois.readObject();
-        } catch (IOException | ClassNotFoundException e) {
-            throw new RuntimeException(e);
-        }
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/JsonWriterTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/JsonWriterTest.java
deleted file mode 100644
index 6e2aa86..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/JsonWriterTest.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import jakarta.json.*;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.StringWriter;
-
-import junit.framework.TestCase;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class JsonWriterTest extends TestCase {
-    public JsonWriterTest(String testName) {
-        super(testName);
-    }
-
-    public void testObject() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.writeObject(Json.createObjectBuilder().build());
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("{}", writer.toString());
-    }
-
-    public void testEmptyObject() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.write(JsonValue.EMPTY_JSON_OBJECT);
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("{}", writer.toString());
-    }
-
-    public void testArray() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.writeArray(Json.createArrayBuilder().build());
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("[]", writer.toString());
-    }
-
-    public void testEmptyArray() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.write(JsonValue.EMPTY_JSON_ARRAY);
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("[]", writer.toString());
-    }
-
-    public void testNumber() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.writeArray(Json.createArrayBuilder().add(10).build());
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("[10]", writer.toString());
-    }
-
-    public void testDoubleNumber() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.writeArray(Json.createArrayBuilder().add(10.5).build());
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("[10.5]", writer.toString());
-    }
-
-    public void testArrayString() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.writeArray(Json.createArrayBuilder().add("string").build());
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("[\"string\"]", writer.toString());
-    }
-
-    public void testObjectAsValue() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.write((JsonValue) (Json.createObjectBuilder().build()));
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("{}", writer.toString());
-    }
-
-    public void testNullValue() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.write(JsonValue.NULL);
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("null", writer.toString());
-    }
-
-    public void testTrueValue() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.write(JsonValue.TRUE);
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("true", writer.toString());
-    }
-
-    public void testFalseValue() throws Exception {
-        StringWriter writer = new StringWriter();
-        JsonWriter jsonWriter = Json.createWriter(writer);
-        jsonWriter.write(JsonValue.FALSE);
-        jsonWriter.close();
-        writer.close();
-
-        assertEquals("false", writer.toString());
-    }
-
-    public void testIllegalStateExcepton() throws Exception {
-        JsonObject obj = Json.createObjectBuilder().build();
-        JsonArray array = Json.createArrayBuilder().build();
-
-        JsonWriter writer = Json.createWriter(new StringWriter());
-        writer.writeObject(obj);
-        try {
-            writer.writeObject(obj);
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-        writer.close();
-
-        writer = Json.createWriter(new StringWriter());
-        writer.writeArray(array);
-        try {
-            writer.writeArray(array);
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-        writer.close();
-
-        writer = Json.createWriter(new StringWriter());
-        writer.write(array);
-        try {
-            writer.writeArray(array);
-        } catch (IllegalStateException expected) {
-            // no-op
-        }
-        writer.close();
-    }
-
-    public void testNoCloseWriteObjectToStream() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        JsonWriter writer = Json.createWriter(baos);
-        writer.write(Json.createObjectBuilder().build());
-        // not calling writer.close() intentionally
-        assertEquals("{}", baos.toString("UTF-8"));
-    }
-
-    public void testNoCloseWriteObjectToWriter() throws Exception {
-        StringWriter sw = new StringWriter();
-        JsonWriter writer = Json.createWriter(sw);
-        writer.write(Json.createObjectBuilder().build());
-        // not calling writer.close() intentionally
-        assertEquals("{}", sw.toString());
-    }
-
-    public void testNoCloseWriteArrayToStream() throws Exception {
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        JsonWriter writer = Json.createWriter(baos);
-        writer.write(Json.createArrayBuilder().build());
-        // not calling writer.close() intentionally
-        assertEquals("[]", baos.toString("UTF-8"));
-    }
-
-    public void testNoCloseWriteArrayToWriter() throws Exception {
-        StringWriter sw = new StringWriter();
-        JsonWriter writer = Json.createWriter(sw);
-        writer.write(Json.createArrayBuilder().build());
-        // not calling writer.close() intentionally
-        assertEquals("[]", sw.toString());
-    }
-
-    public void testClose() throws Exception {
-        MyByteStream baos = new MyByteStream();
-        JsonWriter writer = Json.createWriter(baos);
-        writer.write(Json.createObjectBuilder().build());
-        writer.close();
-        assertEquals("{}", baos.toString("UTF-8"));
-        assertTrue(baos.isClosed());
-    }
-
-    private static final class MyByteStream extends ByteArrayOutputStream {
-        boolean closed;
-
-        boolean isClosed() {
-            return closed;
-        }
-
-        public void close() throws IOException {
-            super.close();
-            closed = true;
-        }
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/RFC7159Test.java b/impl/src/test/java/org/eclipse/jsonp/tests/RFC7159Test.java
deleted file mode 100644
index a5ee697..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/RFC7159Test.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import org.junit.Test;
-import org.junit.BeforeClass;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonGenerator;
-import java.io.StringWriter;
-import java.io.StringReader;
-
-/**
- * @author Kin-man Chung
- */
-public class RFC7159Test {
-
-    @Test
-    public void testCreatValues() {
-        JsonArrayBuilder builder = Json.createArrayBuilder();
-        JsonArray array = builder.add(Json.createValue("someString"))
-                                 .add(Json.createValue(100))
-                                 .add(Json.createValue(12345.6789))
-                                 .build();
-        builder = Json.createArrayBuilder();
-        JsonArray expected = builder.add("someString")
-                                    .add(100)
-                                    .add(12345.6789)
-                                    .build();
-        assertEquals(expected, array);
-    }
-
-    @Test
-    public void testReadValues() {
-        JsonReader reader = Json.createReader(new StringReader("\"someString\""));
-        JsonArrayBuilder builder = Json.createArrayBuilder();
-        builder.add(reader.readValue());
-        reader = Json.createReader(new StringReader("100"));
-        builder.add(reader.readValue());
-        reader = Json.createReader(new StringReader("12345.6789"));
-        builder.add(reader.readValue());
-        JsonArray array = builder.build();
-        builder = Json.createArrayBuilder();
-        JsonArray expected = builder.add("someString")
-                                    .add(100)
-                                    .add(12345.6789)
-                                    .build();
-        assertEquals(expected, array);
-    }
-
-    @Test
-    public void testWriteValues() {
-        StringWriter stringWriter = new StringWriter();
-        JsonWriter writer = Json.createWriter(stringWriter);
-        writer.write(Json.createValue("someString"));
-        assertEquals("\"someString\"", stringWriter.toString());
-
-        stringWriter = new StringWriter();
-        writer = Json.createWriter(stringWriter);
-        writer.write(Json.createValue(100));
-        assertEquals("100", stringWriter.toString());
-
-        stringWriter = new StringWriter();
-        writer = Json.createWriter(stringWriter);
-        writer.write(Json.createValue(12345.6789));
-        assertEquals("12345.6789", stringWriter.toString());
-    }
-
-    @Test
-    public void testGeneratorValues() {
-        StringWriter stringWriter = new StringWriter();
-        JsonGenerator generator = Json.createGenerator(stringWriter);
-        generator.write("someString").close();
-        assertEquals("\"someString\"", stringWriter.toString());
-
-        stringWriter = new StringWriter();
-        generator = Json.createGenerator(stringWriter);
-        generator.write(100).close();
-        assertEquals("100", stringWriter.toString());
-
-        stringWriter = new StringWriter();
-        generator = Json.createGenerator(stringWriter);
-        generator.write(12345.6789).close();
-        assertEquals("12345.6789", stringWriter.toString());
-    }
-}
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/ToJsonTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/ToJsonTest.java
deleted file mode 100644
index 38bda77..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/ToJsonTest.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import org.eclipse.jsonp.JsonUtil;
-import org.junit.Assert;
-import org.junit.Test;
-
-import jakarta.json.Json;
-import jakarta.json.JsonArray;
-import jakarta.json.JsonArrayBuilder;
-import jakarta.json.JsonValue;
-
-import static org.junit.Assert.assertEquals;
-/**
- * @author Kin-man Chung
- */
-public class ToJsonTest {
-
-    @Test
-    public void testToJson() {
-        assertEquals(Json.createValue("someString"), JsonUtil.toJson("'someString'"));
-        assertEquals(Json.createValue("some'thing"), JsonUtil.toJson("'some\\'thing'"));
-        assertEquals(Json.createValue("some\"thing"), JsonUtil.toJson("'some\\\"thing'"));
-        JsonArrayBuilder builder = Json.createArrayBuilder();
-        JsonArray array = builder
-            .add(Json.createObjectBuilder()
-                .add("name", "John")
-                .add("age", 35)
-                .add("educations", Json.createArrayBuilder()
-                    .add("Gunn High")
-                    .add("UC Berkeley")))
-            .add(Json.createObjectBuilder()
-                .add("name", "Jane")
-                .add("educations", Json.createArrayBuilder()
-                    .add("Oxford")))
-            .build();
-         JsonValue expected = JsonUtil.toJson(
-             "[ { 'name': 'John', " +
-                 "'age': 35, " +
-                 "'educations': ['Gunn High', 'UC Berkeley'] }, " +
-              " { 'name': 'Jane', " +
-                 "'educations': ['Oxford']}]");
-          assertEquals(expected, array);
-    }
-}
-
diff --git a/impl/src/test/java/org/eclipse/jsonp/tests/TwitterSearchTest.java b/impl/src/test/java/org/eclipse/jsonp/tests/TwitterSearchTest.java
deleted file mode 100644
index 84d9008..0000000
--- a/impl/src/test/java/org/eclipse/jsonp/tests/TwitterSearchTest.java
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.tests;
-
-import junit.framework.TestCase;
-
-import jakarta.json.*;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParser.Event;
-import java.io.*;
-import java.net.URL;
-
-/**
- * JsonParser Tests using twitter search API
- *
- * @author Jitendra Kotamraju
- */
-public class TwitterSearchTest extends TestCase {
-
-    public void test() {
-        // dummy test so that junit doesn't complain
-    }
-
-    public void xtestStreamTwitter() throws Exception {
-        URL url = new URL("http://search.twitter.com/search.json?q=%23java&rpp=100");
-        InputStream is = url.openStream();
-        JsonParser parser = Json.createParser(is);
-
-        while(parser.hasNext()) {
-            Event e = parser.next();
-            if (e == Event.KEY_NAME) {
-                if (parser.getString().equals("from_user")) {
-                    parser.next();
-                    System.out.print(parser.getString());
-                    System.out.print(": ");
-                } else if (parser.getString().equals("text")) {
-                    parser.next();
-                    System.out.println(parser.getString());
-                    System.out.println("---------");
-                }
-            }
-        }
-        parser.close();
-	}
-
-    public void xtestObjectTwitter() throws Exception {
-        URL url = new URL("http://search.twitter.com/search.json?q=%23java&rpp=100");
-        InputStream is = url.openStream();
-        JsonReader rdr = Json.createReader(is);
-        JsonObject obj = rdr.readObject();
-        JsonArray results = obj.getJsonArray("results");
-        for(JsonObject result : results.getValuesAs(JsonObject.class)) {
-            System.out.print(result.get("from_user"));
-            System.out.print(": ");
-            System.out.println(result.get("text"));
-            System.out.println("-----------");
-        }
-        rdr.close();
-    }
-
-}
diff --git a/impl/src/test/resources/facebook.json b/impl/src/test/resources/facebook.json
deleted file mode 100644
index 1a82909..0000000
--- a/impl/src/test/resources/facebook.json
+++ /dev/null
@@ -1,668 +0,0 @@
-{
-   "data": [
-      {
-         "id": "123_1",
-         "from": {
-            "name": "Name 1",
-            "id": "1"
-         },
-         "message": "Dummy message Name 1",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for iPhone",
-            "namespace": "fbiphone",
-            "id": "12345"
-         },
-         "created_time": "2013-07-26T22:33:09+0000",
-         "updated_time": "2013-07-26T22:33:09+0000"
-      },
-      {
-         "id": "123_2",
-         "from": {
-            "category": "Author",
-            "name": "Name 2",
-            "id": "2"
-         },
-         "message": "Dummy message Name 2",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/9879asd/987645"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:33:03+0000",
-         "updated_time": "2013-07-26T22:33:03+0000"
-      },
-      {
-         "id": "123_3",
-         "from": {
-            "category": "Community",
-            "name": "Group 1",
-            "id": "3"
-         },
-         "message": "Dummy message Group 1",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/68548"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:33:00+0000",
-         "updated_time": "2013-07-26T22:33:00+0000"
-      },
-      {
-         "id": "123_4",
-         "from": {
-            "category": "Bank/financial institution",
-            "name": "Group 2",
-            "id": "4"
-         },
-         "message": "Dummy message Group 2",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/1234"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Seesmic",
-            "id": "34567"
-         },
-         "created_time": "2013-07-26T22:32:58+0000",
-         "updated_time": "2013-07-26T22:32:58+0000"
-      },
-      {
-         "id": "123_5",
-         "from": {
-            "name": "Person 5",
-            "id": "5"
-         },
-         "message": "Dummy message Person 5",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:32:55+0000",
-         "updated_time": "2013-07-26T22:32:55+0000"
-      },
-      {
-         "id": "123_6",
-         "from": {
-            "name": "Person 6",
-            "id": "6"
-         },
-         "message": "Dummy message Person 6",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:32:46+0000",
-         "updated_time": "2013-07-26T22:32:46+0000"
-      },
-      {
-         "id": "123_7",
-         "from": {
-            "category": "Community",
-            "name": "\u0e2a\u0e19Group 7",
-            "id": "7"
-         },
-         "message": "Dummy message Group 7",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/7"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "DoubleQ",
-            "namespace": "doubleqapp",
-            "id": "98765"
-         },
-         "created_time": "2013-07-26T22:32:41+0000",
-         "updated_time": "2013-07-26T22:32:41+0000"
-      },
-      {
-         "id": "123_8",
-         "from": {
-            "name": "Person 8",
-            "id": "8"
-         },
-         "message": "Dummy message Person 8",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:32:36+0000",
-         "updated_time": "2013-07-26T22:32:36+0000"
-      },
-      {
-         "id": "123_9",
-         "from": {
-            "category": "Bank/financial institution",
-            "name": "Group 9",
-            "id": "9"
-         },
-         "message": "Dummy message Group 9",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/9"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Status Shuffle",
-            "namespace": "status-shuffle",
-            "id": "87654"
-         },
-         "created_time": "2013-07-26T22:32:30+0000",
-         "updated_time": "2013-07-26T22:32:30+0000"
-      },
-      {
-         "id": "123_10",
-         "from": {
-            "name": "Person 10",
-            "id": "10"
-         },
-         "message": "Dummy message Person 10",
-         "picture": "https://picture.url/123/10.jpg",
-         "link": "https://custom.url/123/10",
-         "name": "Dummy page name - Person 10",
-         "caption": "www.page.com",
-         "description": "Some random description",
-         "icon": "https://icon.url/123/10.ico",
-         "privacy": {
-            "value": ""
-         },
-         "type": "link",
-         "created_time": "2013-07-26T22:32:14+0000",
-         "updated_time": "2013-07-26T22:32:14+0000"
-      },
-      {
-         "id": "123_11",
-         "from": {
-            "category": "Community",
-            "name": "Group 11",
-            "id": "11"
-         },
-         "message": "Dummy message Group 11",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/11"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "twitterfeed",
-            "id": "654987"
-         },
-         "created_time": "2013-07-26T22:32:13+0000",
-         "updated_time": "2013-07-26T22:32:13+0000"
-      },
-      {
-         "id": "123_12",
-         "from": {
-            "category": "Entertainer",
-            "name": "Person 12",
-            "id": "12"
-         },
-         "message": "Dummy message Person 12",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/12"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:32:10+0000",
-         "updated_time": "2013-07-26T22:32:10+0000"
-      },
-      {
-         "id": "123_13",
-         "from": {
-            "category": "Health/beauty",
-            "name": "Group 13",
-            "id": "13"
-         },
-         "message": "Dummy message Group 13",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/13"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "twitterfeed",
-            "id": "654987"
-         },
-         "created_time": "2013-07-26T22:32:07+0000",
-         "updated_time": "2013-07-26T22:32:07+0000"
-      },
-      {
-         "id": "123_14",
-         "from": {
-            "name": "Person 14",
-            "id": "14"
-         },
-         "message": "Dummy message Person 14",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:31:53+0000",
-         "updated_time": "2013-07-26T22:31:53+0000"
-      },
-      {
-         "id": "123_15",
-         "from": {
-            "category": "Community",
-            "name": "Group 15",
-            "id": "15"
-         },
-         "message": "Dummy message Group 15",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/15"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:31:40+0000",
-         "updated_time": "2013-07-26T22:31:40+0000"
-      },
-      {
-         "id": "123_16",
-         "from": {
-            "name": "Person 16",
-            "id": "16"
-         },
-         "message": "Dummy message Person 16",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Nokia",
-            "id": "34567"
-         },
-         "created_time": "2013-07-26T22:31:39+0000",
-         "updated_time": "2013-07-26T22:31:39+0000"
-      },
-      {
-         "id": "123_17",
-         "from": {
-            "name": "Person 17",
-            "id": "17"
-         },
-         "to": {
-            "data": [
-               {
-                  "name": "Person 16",
-                  "id": "16"
-               }
-            ]
-         },
-         "with_tags": {
-            "data": [
-               {
-                  "name": "Person 16",
-                  "id": "16"
-               }
-            ]
-         },
-         "message": "Dummy message Person 16",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for iPhone",
-            "namespace": "fbiphone",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:31:38+0000",
-         "updated_time": "2013-07-26T22:31:38+0000"
-      },
-      {
-         "id": "123_18",
-         "from": {
-            "category": "Bank/financial institution",
-            "name": "Group 18",
-            "id": "18"
-         },
-         "message": "Dummy message Group 18",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/18"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Status Shuffle",
-            "namespace": "status-shuffle",
-            "id": "876543"
-         },
-         "created_time": "2013-07-26T22:31:37+0000",
-         "updated_time": "2013-07-26T22:31:37+0000"
-      },
-      {
-         "id": "123_19",
-         "from": {
-            "category": "Community",
-            "name": "Group 19",
-            "id": "19"
-         },
-         "message": "Dummy message Group 19",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/19"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:31:36+0000",
-         "updated_time": "2013-07-26T22:31:36+0000"
-      },
-      {
-         "id": "123_20",
-         "from": {
-            "name": "Person 20",
-            "id": "20"
-         },
-         "message": "Dummy message Person 20",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:31:36+0000",
-         "updated_time": "2013-07-26T22:31:36+0000"
-      },
-      {
-         "id": "123_21",
-         "from": {
-            "category": "Website",
-            "name": "Page 21",
-            "id": "21"
-         },
-         "message": "Dummy message Page 21",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/21"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "dlvr.it",
-            "namespace": "dlvr_it",
-            "id": "456321"
-         },
-         "created_time": "2013-07-26T22:31:34+0000",
-         "updated_time": "2013-07-26T22:31:34+0000"
-      },
-      {
-         "id": "123_22",
-         "from": {
-            "name": "Person 22",
-            "id": "22"
-         },
-         "to": {
-            "data": [
-               {
-                  "name": "Person 99",
-                  "id": "99"
-               },
-               {
-                  "name": "Person 98",
-                  "id": "98"
-               },
-               {
-                  "name": "Person 97",
-                  "id": "97"
-               },
-               {
-                  "name": "Person 96",
-                  "id": "96"
-               },
-               {
-                  "name": "Person 95",
-                  "id": "95"
-               },
-               {
-                  "name": "Person 94",
-                  "id": "94"
-               },
-               {
-                  "name": "Person 93",
-                  "id": "93"
-               },
-               {
-                  "name": "Person 92",
-                  "id": "92"
-               }
-            ]
-         },
-         "message": "Dummy message Person 22",
-         "message_tags": {
-            "50": [
-               {
-                  "id": "99",
-                  "name": "Person 99",
-                  "type": "user",
-                  "offset": 50,
-                  "length": 13
-               }
-            ],
-            "64": [
-               {
-                  "id": "98",
-                  "name": "Person 98",
-                  "type": "user",
-                  "offset": 64,
-                  "length": 25
-               }
-            ],
-            "90": [
-               {
-                  "id": "97",
-                  "name": "Person 97",
-                  "type": "user",
-                  "offset": 90,
-                  "length": 11
-               }
-            ],
-            "102": [
-               {
-                  "id": "96",
-                  "name": "Person 96",
-                  "type": "user",
-                  "offset": 102,
-                  "length": 14
-               }
-            ],
-            "117": [
-               {
-                  "id": "95",
-                  "name": "Person 95",
-                  "type": "user",
-                  "offset": 117,
-                  "length": 17
-               }
-            ],
-            "135": [
-               {
-                  "id": "94",
-                  "name": "Person 94",
-                  "type": "user",
-                  "offset": 135,
-                  "length": 13
-               }
-            ],
-            "149": [
-               {
-                  "id": "93",
-                  "name": "Person 93",
-                  "type": "user",
-                  "offset": 149,
-                  "length": 21
-               }
-            ],
-            "171": [
-               {
-                  "id": "92",
-                  "name": "Person 92",
-                  "type": "user",
-                  "offset": 171,
-                  "length": 11
-               }
-            ]
-         },
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:31:33+0000",
-         "updated_time": "2013-07-26T22:31:33+0000"
-      },
-      {
-         "id": "123_23",
-         "from": {
-            "name": "Person 23",
-            "id": "23"
-         },
-         "message": "Dummy message Person 23",
-         "picture": "https://custom.url/123/23.jpg",
-         "link": "https://custom.url/123/23",
-         "name": "Person 23 Name",
-         "caption": " ",
-         "description": " ",
-         "icon": "https://custom.url/123/23.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "link",
-         "application": {
-            "name": "RSS Graffiti",
-            "namespace": "rssgraffiti",
-            "id": "357951"
-         },
-         "created_time": "2013-07-26T22:31:29+0000",
-         "updated_time": "2013-07-26T22:31:29+0000"
-      },
-      {
-         "id": "123_24",
-         "from": {
-            "name": "Person 24",
-            "id": "24"
-         },
-         "message": "Dummy message person 24",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for Android",
-            "namespace": "fbandroid",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:31:29+0000",
-         "updated_time": "2013-07-26T22:31:29+0000"
-      },
-      {
-         "id": "123_25",
-         "from": {
-            "name": "Person 25",
-            "id": "25"
-         },
-         "message": "Dummy message Person 25",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:31:22+0000",
-         "updated_time": "2013-07-26T22:31:22+0000"
-      }
-   ],
-   "paging": {
-      "previous": "https://custom.url/previous",
-      "next": "https://custom.url/next"
-   }
-}
\ No newline at end of file
diff --git a/impl/src/test/resources/facebook1.json b/impl/src/test/resources/facebook1.json
deleted file mode 100644
index 5016652..0000000
--- a/impl/src/test/resources/facebook1.json
+++ /dev/null
@@ -1,911 +0,0 @@
-{
-   "data": [
-      {
-         "id": "123_1",
-         "from": {
-            "category": "Bank/financial institution",
-            "name": "Group 1",
-            "id": "1"
-         },
-         "message": "Dummy message Group 1",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/1"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Seesmic",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:45:54+0000",
-         "updated_time": "2013-07-26T22:45:54+0000"
-      },
-      {
-         "id": "123_2",
-         "from": {
-            "name": "Person 2",
-            "id": "2"
-         },
-         "message": "Dummy message Person 2",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:45:52+0000",
-         "updated_time": "2013-07-26T22:45:52+0000"
-      },
-      {
-         "id": "123_3",
-         "from": {
-            "category": "Outdoor gear/sporting goods",
-            "category_list": [
-               {
-                  "id": "2231",
-                  "name": "Outdoor Gear/Sporting Goods"
-               }
-            ],
-            "name": "Store 3",
-            "id": "3"
-         },
-         "message": "https://shop.url/123/3",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/3"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:45:51+0000",
-         "updated_time": "2013-07-26T22:45:51+0000"
-      },
-      {
-         "id": "123_4",
-         "from": {
-            "name": "Person 4",
-            "id": "4"
-         },
-         "message": "Dummy message Person 4",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:45:50+0000",
-         "updated_time": "2013-07-26T22:45:50+0000"
-      },
-      {
-         "id": "123_5",
-         "from": {
-            "name": "Person 5",
-            "id": "5"
-         },
-         "to": {
-            "data": [
-               {
-                  "name": "Person 2",
-                  "id": "2"
-               },
-               {
-                  "name": "Person 99",
-                  "id": "99"
-               },
-               {
-                  "name": "Person 98",
-                  "id": "98"
-               }
-            ]
-         },
-         "message": "Dummy message Person 5",
-         "message_tags": {
-            "38": [
-               {
-                  "id": "2",
-                  "name": "Person 2",
-                  "type": "user",
-                  "offset": 38,
-                  "length": 13
-               }
-            ],
-            "53": [
-               {
-                  "id": "99",
-                  "name": "Person 99",
-                  "type": "user",
-                  "offset": 53,
-                  "length": 17
-               }
-            ],
-            "73": [
-               {
-                  "id": "98",
-                  "name": "Person 98",
-                  "type": "user",
-                  "offset": 73,
-                  "length": 18
-               }
-            ]
-         },
-         "story": "Dummy story Person 5",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "97",
-                  "name": "Person 97",
-                  "offset": 0,
-                  "length": 15,
-                  "type": "user"
-               }
-            ],
-            "23": [
-               {
-                  "id": "96",
-                  "name": "Person 96",
-                  "offset": 23,
-                  "length": 18,
-                  "type": "user"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/5.jpg",
-         "link": "https://profile.url/123/5",
-         "name": "Person 5 Photos",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Person 5",
-               "href": "https://profile.url/123/5"
-            }
-         ],
-         "icon": "https://custom.url/123/5.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "123",
-         "application": {
-            "name": "Photos",
-            "id": "1234"
-         },
-         "created_time": "2013-07-26T22:45:45+0000",
-         "updated_time": "2013-07-26T22:45:45+0000"
-      },
-      {
-         "id": "123_6",
-         "from": {
-            "category": "Public figure",
-            "name": "Person 6",
-            "id": "6"
-         },
-         "message": "Dummy message Person 6",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/6"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:45:44+0000",
-         "updated_time": "2013-07-26T22:45:44+0000"
-      },
-      {
-         "id": "123_7",
-         "from": {
-            "name": "Person 7",
-            "id": "7"
-         },
-         "to": {
-            "data": [
-               {
-                  "name": "Person 89",
-                  "id": "89"
-               }
-            ]
-         },
-         "message": "Dummy message Person 7",
-         "message_tags": {
-            "16": [
-               {
-                  "id": "987",
-                  "name": "Person 987",
-                  "type": "user",
-                  "offset": 16,
-                  "length": 18
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/7.jpg",
-         "link": "https://custom.url/123/7",
-         "source": "https://source.url/123/7",
-         "name": "Link name person 7",
-         "description": "Description Person 7",
-         "icon": "https://custom.url/123/7.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "video",
-         "created_time": "2013-07-26T22:45:44+0000",
-         "updated_time": "2013-07-26T22:45:44+0000"
-      },
-      {
-         "id": "123_8",
-         "from": {
-            "name": "Person 8",
-            "id": "8"
-         },
-         "to": {
-            "data": [
-               {
-                  "name": "Person 1",
-                  "id": "1"
-               },
-               {
-                  "name": "Person 2",
-                  "id": "2"
-               },
-               {
-                  "name": "Person 3",
-                  "id": "3"
-               },
-               {
-                  "name": "Person 4",
-                  "id": "4"
-               },
-               {
-                  "name": "Person 5",
-                  "id": "5"
-               },
-               {
-                  "name": "Person 99",
-                  "id": "99"
-               },
-               {
-                  "name": "Person 98",
-                  "id": "98"
-               },
-               {
-                  "name": "Person 69",
-                  "id": "69"
-               }
-            ]
-         },
-         "message": "Dummy message Person 8",
-         "message_tags": {
-            "77": [
-               {
-                  "id": "1",
-                  "name": "Person 1",
-                  "type": "user",
-                  "offset": 77,
-                  "length": 26
-               }
-            ],
-            "104": [
-               {
-                  "id": "2",
-                  "name": "Person 2",
-                  "type": "user",
-                  "offset": 104,
-                  "length": 11
-               }
-            ],
-            "116": [
-               {
-                  "id": "3",
-                  "name": "Person 3",
-                  "type": "user",
-                  "offset": 116,
-                  "length": 13
-               }
-            ],
-            "130": [
-               {
-                  "id": "4",
-                  "name": "Person 4",
-                  "type": "user",
-                  "offset": 130,
-                  "length": 22
-               }
-            ],
-            "153": [
-               {
-                  "id": "5",
-                  "name": "Person 5",
-                  "type": "user",
-                  "offset": 153,
-                  "length": 20
-               }
-            ],
-            "174": [
-               {
-                  "id": "99",
-                  "name": "Person 99",
-                  "type": "user",
-                  "offset": 174,
-                  "length": 12
-               }
-            ],
-            "187": [
-               {
-                  "id": "98",
-                  "name": "Person 98",
-                  "type": "user",
-                  "offset": 187,
-                  "length": 16
-               }
-            ],
-            "204": [
-               {
-                  "id": "69",
-                  "name": "Person 69",
-                  "type": "user",
-                  "offset": 204,
-                  "length": 21
-               }
-            ]
-         },
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:45:41+0000",
-         "updated_time": "2013-07-26T22:45:41+0000"
-      },
-      {
-         "id": "123_9",
-         "from": {
-            "name": "Person 9",
-            "id": "9"
-         },
-         "message": "Dummy message Person 9",
-         "story": "Story Person 9",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "8",
-                  "name": "Person 8",
-                  "offset": 0,
-                  "length": 10,
-                  "type": "user"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/9.jpg",
-         "link": "https://custom.url/123/9",
-         "icon": "https://custom.url/123/9.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_8",
-         "application": {
-            "name": "Facebook for Android",
-            "namespace": "fbandroid",
-            "id": "34567"
-         },
-         "created_time": "2013-07-26T22:45:33+0000",
-         "updated_time": "2013-07-26T22:45:33+0000"
-      },
-      {
-         "id": "123_9",
-         "from": {
-            "name": "Person 9",
-            "id": "9"
-         },
-         "message": "Dummy message Person 9",
-         "story": "Story Person 9",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "6",
-                  "name": "Person 6",
-                  "offset": 0,
-                  "length": 13,
-                  "type": "user"
-               }
-            ],
-            "21": [
-               {
-                  "id": "7",
-                  "name": "Person 7",
-                  "offset": 21,
-                  "length": 25,
-                  "type": "user"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/9.jpg",
-         "link": "https://custom.url/123/9",
-         "name": "Link Person 9",
-         "caption": "Caption Person 9",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Person 9",
-               "href": "https://custom.url/123/9"
-            }
-         ],
-         "icon": "https://custom.url/123/9.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_9",
-         "application": {
-            "name": "Links",
-            "id": "951753"
-         },
-         "created_time": "2013-07-26T22:45:33+0000",
-         "updated_time": "2013-07-26T22:45:33+0000"
-      },
-      {
-         "id": "123_10",
-         "from": {
-            "name": "Person 10",
-            "id": "10"
-         },
-         "message": "Dummy message Person 10",
-         "story": "Story Person 10",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "3",
-                  "name": "Person 3",
-                  "offset": 0,
-                  "length": 27,
-                  "type": "user"
-               }
-            ],
-            "35": [
-               {
-                  "id": "79",
-                  "name": "Page 79",
-                  "offset": 35,
-                  "length": 4,
-                  "type": "page"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/10.jpg",
-         "link": "https://link.url/123/10",
-         "name": "Timeline Photos",
-         "caption": "Caption link Person 10",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Page 79",
-               "href": "https://custom.url/123/79"
-            }
-         ],
-         "icon": "https://custom.url/123/10.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_10",
-         "application": {
-            "name": "Photos",
-            "id": "3456"
-         },
-         "created_time": "2013-07-26T22:45:31+0000",
-         "updated_time": "2013-07-26T22:45:31+0000"
-      },
-      {
-         "id": "123_11",
-         "from": {
-            "name": "Person 11",
-            "id": "11"
-         },
-         "message": "Dummy message Person 11",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for iPhone",
-            "namespace": "fbiphone",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:45:25+0000",
-         "updated_time": "2013-07-26T22:45:25+0000"
-      },
-      {
-         "id": "123_12",
-         "from": {
-            "name": "Person 12",
-            "id": "12"
-         },
-         "message": "Dummy message Person 12",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "3456"
-         },
-         "created_time": "2013-07-26T22:45:20+0000",
-         "updated_time": "2013-07-26T22:45:20+0000"
-      },
-      {
-         "id": "123_13",
-         "from": {
-            "name": "Person 13",
-            "id": "13"
-         },
-         "message": "Dummy message person 13",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:45:18+0000",
-         "updated_time": "2013-07-26T22:45:18+0000"
-      },
-      {
-         "id": "123_14",
-         "from": {
-            "name": "Person 14",
-            "id": "14"
-         },
-         "message": "Dummy message Person 14",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:45:17+0000",
-         "updated_time": "2013-07-26T22:45:17+0000"
-      },
-      {
-         "id": "123_15",
-         "from": {
-            "name": "Person 15",
-            "id": "15"
-         },
-         "message": "Dummy message Person 15",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:45:16+0000",
-         "updated_time": "2013-07-26T22:45:16+0000"
-      },
-      {
-         "id": "123_16",
-         "from": {
-            "name": "Person 16",
-            "id": "16"
-         },
-         "message": "Dummy message Person 16",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "3456"
-         },
-         "created_time": "2013-07-26T22:45:15+0000",
-         "updated_time": "2013-07-26T22:45:15+0000"
-      },
-      {
-         "id": "123_17",
-         "from": {
-            "name": "Person 17",
-            "id": "17"
-         },
-         "message": "Dummy message Person 17",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:45:12+0000",
-         "updated_time": "2013-07-26T22:45:12+0000"
-      },
-      {
-         "id": "123_18",
-         "from": {
-            "name": "Person 18",
-            "id": "18"
-         },
-         "message": "Dummy message Person 18",
-         "picture": "https://custom.url/123/18.jpg",
-         "link": "https://link.url/123/18",
-         "icon": "https://custom.url/123/18.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_18",
-         "created_time": "2013-07-26T22:45:11+0000",
-         "updated_time": "2013-07-26T22:45:11+0000"
-      },
-      {
-         "id": "123_19",
-         "from": {
-            "name": "Person 19",
-            "id": "19"
-         },
-         "message": "Dummy message Person 19",
-         "story": "Person 19 Story",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "19",
-                  "name": "Person 19",
-                  "offset": 0,
-                  "length": 13,
-                  "type": "user"
-               }
-            ],
-            "21": [
-               {
-                  "id": "75",
-                  "name": "Person 75",
-                  "offset": 21,
-                  "length": 31,
-                  "type": "page"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/19.jpg",
-         "link": "https://link.url/123/19",
-         "name": "Person 19 Photos",
-         "caption": "Caption Person 19",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Group 89",
-               "href": "https://custom.url/123/19"
-            }
-         ],
-         "icon": "https://custom.url/123/19.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_19",
-         "application": {
-            "name": "Photos",
-            "id": "12375"
-         },
-         "created_time": "2013-07-26T22:45:07+0000",
-         "updated_time": "2013-07-26T22:45:07+0000"
-      },
-      {
-         "id": "123_20",
-         "from": {
-            "name": "Person 20",
-            "id": "20"
-         },
-         "message": "Dummy message Person 20",
-         "story": "Person 20 shared a photo.",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "20",
-                  "name": "Person 20",
-                  "offset": 0,
-                  "length": 21,
-                  "type": "user"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/20.jpg",
-         "link": "https://link.url/123/23",
-         "name": "Person 20's Photos",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Person 20",
-               "href": "https://custom.url/123/20"
-            }
-         ],
-         "icon": "https://custom.url/123/20.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_20",
-         "application": {
-            "name": "Photos",
-            "id": "45678"
-         },
-         "created_time": "2013-07-26T22:45:00+0000",
-         "updated_time": "2013-07-26T22:45:00+0000"
-      },
-      {
-         "id": "123_21",
-         "from": {
-            "name": "Person 21",
-            "id": "21"
-         },
-         "message": "Dummy message Person 21",
-         "story": "Person 21 shared something.",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "21",
-                  "name": "Person 21",
-                  "offset": 0,
-                  "length": 18,
-                  "type": "user"
-               }
-            ],
-            "26": [
-               {
-                  "id": "67",
-                  "name": "Group 67",
-                  "offset": 26,
-                  "length": 30,
-                  "type": "page"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/21.jpg",
-         "link": "https://link.url/123/21",
-         "name": "Timeline Photos",
-         "caption": "Person 21 Caption",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Group 75",
-               "href": "https://custom.url/123/75"
-            }
-         ],
-         "icon": "https://custom.url/123/21.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_21",
-         "application": {
-            "name": "Photos",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:44:58+0000",
-         "updated_time": "2013-07-26T22:44:58+0000"
-      },
-      {
-         "id": "123_22",
-         "from": {
-            "name": "Person 22",
-            "id": "22"
-         },
-         "message": "Dummy message Person 22",
-         "story": "Person 22 shared photo.",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "22",
-                  "name": "Person 22",
-                  "offset": 0,
-                  "length": 21,
-                  "type": "user"
-               }
-            ],
-            "29": [
-               {
-                  "id": "88",
-                  "name": "Person 88",
-                  "offset": 29,
-                  "length": 12,
-                  "type": "page"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/22.jpg",
-         "link": "https://link.url/123/22",
-         "name": "Timeline Photos",
-         "caption": "Person 22 caption",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Person 45",
-               "href": "https://custom.url/123/45"
-            }
-         ],
-         "icon": "https://custom.url/123/22.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_22",
-         "application": {
-            "name": "Photos",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:44:58+0000",
-         "updated_time": "2013-07-26T22:44:58+0000"
-      },
-      {
-         "id": "123_23",
-         "from": {
-            "category": "Teacher",
-            "name": "Person 23",
-            "id": "23"
-         },
-         "message": "Dummy message Person 23",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/23"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:44:57+0000",
-         "updated_time": "2013-07-26T22:44:57+0000"
-      },
-      {
-         "id": "24_10151496285490925",
-         "from": {
-            "name": "Person 24",
-            "id": "24"
-         },
-         "message": "Dummy message Person 24",
-         "story": "Person 24 shared photo.",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "24",
-                  "name": "Person 24",
-                  "offset": 0,
-                  "length": 30,
-                  "type": "user"
-               }
-            ],
-            "38": [
-               {
-                  "id": "86",
-                  "name": "Person 86",
-                  "offset": 38,
-                  "length": 14,
-                  "type": "user"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/24.jpg",
-         "link": "https://link.url/123/23",
-         "name": "Person 86 Photos",
-         "caption": "Person 24 Caption",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Person 86",
-               "href": "https://custom.url/123/86"
-            }
-         ],
-         "icon": "https://custom.url/123/24.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_24",
-         "application": {
-            "name": "Links",
-            "id": "654321"
-         },
-         "created_time": "2013-07-26T22:44:50+0000",
-         "updated_time": "2013-07-26T22:44:50+0000"
-      }
-   ],
-   "paging": {
-      "previous": "https://custom.url/previous",
-      "next": "https://custom.url/next"
-   }
-}
\ No newline at end of file
diff --git a/impl/src/test/resources/facebook2.json b/impl/src/test/resources/facebook2.json
deleted file mode 100644
index b57b1ed..0000000
--- a/impl/src/test/resources/facebook2.json
+++ /dev/null
@@ -1,555 +0,0 @@
-{
-   "data": [
-      {
-         "id": "123_1",
-         "from": {
-            "name": "Person 1",
-            "id": "1"
-         },
-         "message": "Dummy message Person 1",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:57:09+0000",
-         "updated_time": "2013-07-26T22:57:09+0000"
-      },
-      {
-         "id": "123_2",
-         "from": {
-            "name": "Person 2",
-            "id": "2"
-         },
-         "message": "Dummy message Person 2",
-         "picture": "https://custom.url/123/2.jpg",
-         "link": "https://link.url/123/2",
-         "source": "https://source.url/123/2",
-         "name": "Person 2",
-         "icon": "https://custom.url/123/2.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "video",
-         "application": {
-            "name": "Share_bookmarklet",
-            "id": "234567"
-         },
-         "created_time": "2013-07-26T22:57:08+0000",
-         "updated_time": "2013-07-26T22:57:08+0000"
-      },
-      {
-         "id": "123_3",
-         "from": {
-            "category": "Community",
-            "name": "Group 3",
-            "id": "3"
-         },
-         "message": "Dummy message Group 3",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/3"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for Android",
-            "namespace": "fbandroid",
-            "id": "456789"
-         },
-         "created_time": "2013-07-26T22:57:05+0000",
-         "updated_time": "2013-07-26T22:57:05+0000"
-      },
-      {
-         "id": "123_4",
-         "from": {
-            "name": "Person 4",
-            "id": "4"
-         },
-         "message": "Dummy message Person 4",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for Android",
-            "namespace": "fbandroid",
-            "id": "456789"
-         },
-         "created_time": "2013-07-26T22:57:00+0000",
-         "updated_time": "2013-07-26T22:57:00+0000"
-      },
-      {
-         "id": "123_5",
-         "from": {
-            "name": "Person 5",
-            "id": "5"
-         },
-         "message": "Dummy message Person 5",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:56:58+0000",
-         "updated_time": "2013-07-26T22:56:58+0000"
-      },
-      {
-         "id": "123_6",
-         "from": {
-            "name": "Person 6",
-            "id": "6"
-         },
-         "message": "Dummy message Person 6",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for iPhone",
-            "namespace": "fbiphone",
-            "id": "23456"
-         },
-         "created_time": "2013-07-26T22:56:54+0000",
-         "updated_time": "2013-07-26T22:56:54+0000"
-      },
-      {
-         "id": "123_7",
-         "from": {
-            "name": "Person 7",
-            "id": "7"
-         },
-         "message": "Dummy message Person 7",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:56:47+0000",
-         "updated_time": "2013-07-26T22:56:47+0000"
-      },
-      {
-         "id": "123_8",
-         "from": {
-            "name": "Person 8",
-            "id": "8"
-         },
-         "message": "Dummy message Person 8",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:56:45+0000",
-         "updated_time": "2013-07-26T22:56:45+0000"
-      },
-      {
-         "id": "123_9",
-         "from": {
-            "name": "Person 9",
-            "id": "9"
-         },
-         "message": "Dummy message Person 9",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for Android",
-            "namespace": "fbandroid",
-            "id": "456789"
-         },
-         "created_time": "2013-07-26T22:56:44+0000",
-         "updated_time": "2013-07-26T22:56:44+0000"
-      },
-      {
-         "id": "123_10",
-         "from": {
-            "name": "Person 10",
-            "id": "10"
-         },
-         "message": "Dummy message Person 10",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for Android",
-            "namespace": "fbandroid",
-            "id": "456789"
-         },
-         "created_time": "2013-07-26T22:56:36+0000",
-         "updated_time": "2013-07-26T22:56:36+0000"
-      },
-      {
-         "id": "123_11",
-         "from": {
-            "name": "Person 11",
-            "id": "11"
-         },
-         "message": "Dummy message Person 11",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:56:32+0000",
-         "updated_time": "2013-07-26T22:56:32+0000"
-      },
-      {
-         "id": "123_12",
-         "from": {
-            "name": "Person 12",
-            "id": "12"
-         },
-         "message": "Dummy message Person 12",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:56:27+0000",
-         "updated_time": "2013-07-26T22:56:27+0000"
-      },
-      {
-         "id": "123_13",
-         "from": {
-            "category": "Bank/financial institution",
-            "name": "Group 13",
-            "id": "13"
-         },
-         "message": "Dummy message Group 13",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://link.url/123/23"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "PostCron",
-            "namespace": "postcron",
-            "id": "159357"
-         },
-         "created_time": "2013-07-26T22:56:26+0000",
-         "updated_time": "2013-07-26T22:56:26+0000"
-      },
-      {
-         "id": "123_14",
-         "from": {
-            "name": "Person 14",
-            "id": "14"
-         },
-         "to": {
-            "data": [
-               {
-                  "name": "Person 99",
-                  "id": "99"
-               },
-               {
-                  "name": "Person 98",
-                  "id": "98"
-               }
-            ]
-         },
-         "message": "Dummy message Person 14",
-         "message_tags": {
-            "0": [
-               {
-                  "id": "99",
-                  "name": "Person 99",
-                  "type": "user",
-                  "offset": 0,
-                  "length": 21
-               }
-            ],
-            "159": [
-               {
-                  "id": "98",
-                  "name": "Person 98",
-                  "type": "user",
-                  "offset": 159,
-                  "length": 26
-               }
-            ]
-         },
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:56:16+0000",
-         "updated_time": "2013-07-26T22:56:16+0000"
-      },
-      {
-         "id": "123_15",
-         "from": {
-            "name": "Person 15",
-            "id": "15"
-         },
-         "message": "Dummy message Person 15",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:56:15+0000",
-         "updated_time": "2013-07-26T22:56:15+0000"
-      },
-      {
-         "id": "123_16",
-         "from": {
-            "category": "Just for fun",
-            "name": "Group 16",
-            "id": "16"
-         },
-         "message": "Dummy message Group 16",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/16"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:56:14+0000",
-         "updated_time": "2013-07-26T22:56:14+0000",
-         "likes": {
-            "data": [
-               {
-                  "id": "97",
-                  "name": "Person 97"
-               }
-            ],
-            "paging": {
-               "cursors": {
-                  "after": "MTAwMDAzMDQzNDM5MDQ5",
-                  "before": "MTAwMDAzMDQzNDM5MDQ5"
-               }
-            }
-         }
-      },
-      {
-         "id": "123_17",
-         "from": {
-            "category": "Community",
-            "name": "Group 17",
-            "id": "17"
-         },
-         "message": "Dummy message Group 17",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/17"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Pages Manager for Android",
-            "namespace": "fbpagemgr_android",
-            "id": "951753"
-         },
-         "created_time": "2013-07-26T22:56:13+0000",
-         "updated_time": "2013-07-26T22:56:13+0000"
-      },
-      {
-         "id": "123_18",
-         "from": {
-            "name": "Person 18",
-            "id": "18"
-         },
-         "message": "Dummy message Person 18",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Facebook for iPad",
-            "namespace": "fbipad_",
-            "id": "456789"
-         },
-         "created_time": "2013-07-26T22:56:07+0000",
-         "updated_time": "2013-07-26T22:56:07+0000"
-      },
-      {
-         "id": "123_19",
-         "from": {
-            "name": "Person 19",
-            "id": "19"
-         },
-         "message": "Dummy message Person 19",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:56:04+0000",
-         "updated_time": "2013-07-26T22:56:04+0000"
-      },
-      {
-         "id": "123_20",
-         "from": {
-            "name": "Person 20",
-            "id": "20"
-         },
-         "message": "Dummy message Person 20",
-         "story": "Person 20 shared photo.",
-         "story_tags": {
-            "0": [
-               {
-                  "id": "20",
-                  "name": "Person 20",
-                  "offset": 0,
-                  "length": 11,
-                  "type": "user"
-               }
-            ],
-            "19": [
-               {
-                  "id": "95",
-                  "name": "Group 95",
-                  "offset": 19,
-                  "length": 27,
-                  "type": "page"
-               }
-            ]
-         },
-         "picture": "https://custom.url/123/20.jpg",
-         "link": "https://link.url/123/20",
-         "name": "Timeline Photos",
-         "caption": "Person 20 link caption",
-         "properties": [
-            {
-               "name": "By",
-               "text": "Group 95",
-               "href": "https://custom.url/123/95"
-            }
-         ],
-         "icon": "https://custom.url/123/20.gif",
-         "privacy": {
-            "value": ""
-         },
-         "type": "photo",
-         "object_id": "456_20",
-         "application": {
-            "name": "Facebook for Android",
-            "namespace": "fbandroid",
-            "id": "456789"
-         },
-         "created_time": "2013-07-26T22:56:04+0000",
-         "updated_time": "2013-07-26T22:56:04+0000"
-      },
-      {
-         "id": "123_21",
-         "from": {
-            "name": "Person 21",
-            "id": "21"
-         },
-         "message": "Dummy message Person 21",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:55:56+0000",
-         "updated_time": "2013-07-26T22:55:56+0000"
-      },
-      {
-         "id": "123_22",
-         "from": {
-            "name": "Person 22",
-            "id": "22"
-         },
-         "message": "Dummy message Person 22",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "948731"
-         },
-         "created_time": "2013-07-26T22:55:38+0000",
-         "updated_time": "2013-07-26T22:55:38+0000"
-      },
-      {
-         "id": "123_23",
-         "from": {
-            "name": "Person 23",
-            "id": "23"
-         },
-         "message": "Dummy message Person 23",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:55:37+0000",
-         "updated_time": "2013-07-26T22:55:37+0000"
-      },
-      {
-         "id": "123_24",
-         "from": {
-            "name": "Person 24",
-            "id": "24"
-         },
-         "message": "Dummy message Person 24",
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "application": {
-            "name": "Mobile",
-            "id": "123456"
-         },
-         "created_time": "2013-07-26T22:55:34+0000",
-         "updated_time": "2013-07-26T22:55:34+0000"
-      },
-      {
-         "id": "123_25",
-         "from": {
-            "category": "Community",
-            "name": "Group 25",
-            "id": "25"
-         },
-         "message": "Dummy message Group 25",
-         "actions": [
-            {
-               "name": "Comment",
-               "link": "https://custom.url/123/25"
-            }
-         ],
-         "privacy": {
-            "value": ""
-         },
-         "type": "status",
-         "created_time": "2013-07-26T22:55:32+0000",
-         "updated_time": "2013-07-26T22:55:32+0000"
-      }
-   ],
-   "paging": {
-      "previous": "https://custom.url/previous",
-      "next": "https://custom.url/next"
-   }
-}
\ No newline at end of file
diff --git a/impl/src/test/resources/jsonmergepatch.json b/impl/src/test/resources/jsonmergepatch.json
deleted file mode 100644
index 3b90e5f..0000000
--- a/impl/src/test/resources/jsonmergepatch.json
+++ /dev/null
@@ -1,103 +0,0 @@
-[
-        {
-            "target": {},
-            "patch": {"a": {"b":"c"}},
-            "expected": {"a":{"b":"c"}}
-        },
-        {
-            "target": {},
-            "patch": {"a":{"bb":{"ccc":null}}},
-            "expected": {"a":{"bb":{}}}
-        },
-        {
-            "target": {"a":"foo"},
-            "patch": "bar",
-            "expected": "bar"
-        },
-        {
-            "target": {"a":"foo"},
-            "patch": null,
-            "expected": null
-        },
-        {
-            "target": {"a": {"b":"c"}},
-            "patch": {"a": {"b":"d", "c":null}},
-            "expected": {"a": {"b":"d"}}
-        },
-        {
-            "target": { "c": "d" },
-            "patch": { "a": "b" },
-            "expected": { "a": "b", "c": "d" }
-        }, 
-        {
-            "target": { "a": { "d": 2 } },
-            "patch": { "a": { "d": 1 } },
-            "expected": { "a": { "d": 1 } }
-        }, 
-        {
-            "target": { "a": "b", "c": "d" },
-            "patch": { "c": null },
-            "expected": { "a": "b" }
-        }, 
-        {
-            "target": { "a": { "b": "c", "d": null} },
-            "patch": { "a": { "d": null} },
-            "expected": { "a": { "b": "c" } }
-        }, 
-        {
-            "target": {
-              "a": { "b": "c" },
-              "d": "e"
-            },
-            "patch": {
-              "a": 1000010002020389.8787987983
-            },
-            "expected": {
-              "a": 1000010002020389.8787987983,
-              "d": "e"
-            }
-        }, 
-        {
-            "target": { "a": "b" },
-            "patch": { "c": [ null ] },
-            "expected": { "a": "b", "c": [ null ] }
-        }, 
-        {
-            "target": { "a": { "b": null, "d": 3}, "e": -1 },
-            "patch": { "a": { "b": "c", "d": null } },
-            "expected": { "a": { "b": "c" }, "e": -1 }
-        }, 
-        {
-            "target": [1,2],
-            "patch": { "a": "b", "c": null },
-            "expected": { "a": "b"}
-        }, 
-        {
-            "target": {
-              "title": "Goodbye!",
-              "author": {
-                "givenName": "John",
-                "familyName": "Doe"
-              },
-              "tags": [ "example", "sample" ],
-              "content": "This will be unchanged"
-            },
-            "patch": {
-              "title": "Hello!",
-              "phoneNumber": "+01-123-456-7890",
-              "author": {
-                  "familyName": null
-              },
-            "tags": [ "example" ]
-            },
-            "expected": {
-            "title": "Hello!",
-            "author": {
-                "givenName": "John"
-            },
-            "tags": [ "example" ],
-            "content": "This will be unchanged",
-            "phoneNumber": "+01-123-456-7890"
-            }
-        }
-]
\ No newline at end of file
diff --git a/impl/src/test/resources/jsonmergepatchdiff.json b/impl/src/test/resources/jsonmergepatchdiff.json
deleted file mode 100644
index ac6c91d..0000000
--- a/impl/src/test/resources/jsonmergepatchdiff.json
+++ /dev/null
@@ -1,60 +0,0 @@
-[
-        {
-            "original": {
-              "title": "Goodbye!",
-              "author": {
-                "givenName": "John",
-                "familyName": "Doe"
-              },
-              "tags": [ "example", "sample" ],
-              "content": "This will be unchanged"
-            },
-            "expected": {
-              "title": "Hello!",
-              "phoneNumber": "+01-123-456-7890",
-              "author": {
-                  "familyName": null
-              },
-            "tags": [ "example" ]
-            },
-            "target": {
-              "title": "Hello!",
-              "author": {
-                  "givenName": "John"
-              },
-              "tags": [ "example" ],
-              "content": "This will be unchanged",
-              "phoneNumber": "+01-123-456-7890"
-            }
-        },
-        {
-            "original": {},
-            "expected": {"a": {"b":"c"}},
-            "target": {"a":{"b":"c"}}
-        },
-        {
-            "original": {"a":"foo"},
-            "expected": "bar",
-            "target": "bar"
-        },
-        {
-            "original": {"a":"foo"},
-            "expected": null,
-            "target": null
-        },
-        {
-            "original": { "c": "d" },
-            "expected": { "a": "b" },
-            "target": { "a": "b", "c": "d" }
-        }, 
-        {
-            "original": { "a": { "d": 2 } },
-            "expected": { "a": { "d": 1 } },
-            "target": { "a": { "d": 1 } }
-        }, 
-        {
-            "original": { "a": "b", "c": "d" },
-            "expected": { "c": null },
-            "target": { "a": "b" }
-        }
-]
\ No newline at end of file
diff --git a/impl/src/test/resources/jsonpatch.json b/impl/src/test/resources/jsonpatch.json
deleted file mode 100644
index 4db4794..0000000
--- a/impl/src/test/resources/jsonpatch.json
+++ /dev/null
@@ -1,219 +0,0 @@
-[
-        {
-            "op": { "op": "test", "path": "/a/1", "value": "hello" },
-            "target": { "a": [ null, "hello", "world" ] },
-            "expected": { "a": [ null, "hello", "world" ] }
-        },
-        {
-            "op": { "op": "test", "path": "/x", "value": {} },
-            "target": [ 1, 2 ],
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "test", "path": "", "value": true },
-            "target": [ 1, 2 ],
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "test", "path": "/x", "value": -30.000 },
-            "target": { "x": -29.020 },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "replace", "path": "", "value": false },
-            "target": { "x": { "a": "b", "y": {} } },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "replace", "path": "/x/y", "value": "hello" },
-            "target": { "x": { "a": "b", "y": {} } },
-            "expected": { "x": { "a": "b", "y": "hello" } }
-        },
-        {
-            "op": { "op": "replace", "path": "/0/2", "value": "x" },
-            "target": [ [ "a", "b", "c"], "d", "e" ],
-            "expected": [ [ "a", "b", "x" ], "d", "e" ]
-        },
-        {
-            "op": { "op": "replace", "path": "/x/0", "value": null },
-            "target": { "x": [ "y", "z" ], "foo": "bar" },
-            "expected": { "x": [ null, "z" ], "foo": "bar" }
-        },
-        {
-            "op": { "op": "replace", "path": "/x/y", "value": 42 },
-            "target": { "x": {} },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "remove", "path": "/x/y" },
-            "target": { "x": { "a": "b", "y": {} } },
-            "expected": { "x": { "a": "b" } }
-        },
-        {
-            "op": { "op": "remove", "path": "/0/2" },
-            "target": [ [ "a", "b", "c"], "d", "e" ],
-            "expected": [ [ "a", "b" ], "d", "e" ]
-        },
-        {
-            "op": { "op": "remove", "path": "/x/0" },
-            "target": { "x": [ "y", "z" ], "foo": "bar" },
-            "expected": { "x": [ "z" ], "foo": "bar" }
-        },
-        {
-            "op": { "op": "remove", "path": "/x/y" },
-            "target": { "x": {} },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "move", "from": "/x/a", "path": "/x/b" },
-            "target": { "x": { "a": "helo" } },
-            "expected": { "x": { "b": "helo" } }
-        },
-        {
-            "op": { "op": "move", "from": "/x/a", "path": "/x/a" },
-            "target": { "x": { "a": "helo" } },
-            "expected": { "x": { "a": "helo" } }
-        },
-        {
-            "op": { "op": "move", "from": "/0", "path": "/0/x" },
-            "target": [ "victim", {}, {} ],
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "move", "from": "/0", "path": "/-" },
-            "target": [ 0, 1, 2 ],
-            "expected": [ 1, 2, 0 ]
-        },
-        {
-            "op": { "op": "move", "from": "/a", "path": "/b/2" },
-            "target": { "a": "helo", "b": [ 1, 2, 3, 4 ] },
-            "expected": { "b": [ 1, 2, "helo", 3, 4 ] }
-        },
-        {
-            "op": { "op": "move", "from": "/a", "path": "/a/b" },
-            "target": {},
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "move", "from": "/a", "path": "/b/c" },
-            "target": { "a": "b" },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "move", "from": "/x/a", "path": "/x/c" },
-            "target": { "x": { "b": "helo" } },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "copy", "from": "/a", "path": "/b" },
-            "target": { "a": 1 },
-            "expected": { "a": 1, "b": 1 }
-        },
-        {
-            "op": { "op": "copy", "from": "/a", "path": "/b" },
-            "target": { "a": 1, "b": false },
-            "expected": { "a": 1, "b": 1 }
-        },
-        {
-            "op": { "op": "copy", "from": "/0", "path": "/-" },
-            "target": [ 1, 2, 3, 4 ],
-            "expected": [ 1, 2, 3, 4, 1 ]
-        },
-        {
-            "op": { "op": "copy", "from": "/0", "path": "/0" },
-            "target": [ true ],
-            "expected": [ true, true ]
-        },
-        {
-            "op": { "op": "copy", "from": "/a", "path": "/b" },
-            "target": {},
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "copy", "from": "/a", "path": "/b/c" },
-            "target": { "a": 1 },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "add", "path": "/a/b/c", "value": 1 },
-            "target": { "a": "b" },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "add", "path": "/~1", "value": 1 },
-            "target": [],
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "add", "path": "/3", "value": 1 },
-            "target": [ 1, 2 ],
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "add", "path": "/-2", "value": 1 },
-            "target": [ 1, 2 ],
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "add", "path": "/foo/f", "value": "bar" },
-            "target": { "foo": "bar" },
-            "exception": "jakarta.json.JsonException"
-        },
-        {
-            "op": { "op": "add", "path": "/a", "value": "b" },
-            "target": {},
-            "expected": { "a": "b" }
-        },
-        {
-            "op": { "op": "add", "path": "/a", "value": 1 },
-            "target": { "a": "b" },
-            "expected": { "a": 1 }
-        },
-        {
-            "op": { "op": "add", "path": "/array/-", "value": 1 },
-            "target": { "array": [ 2, null, {}, 1 ] },
-            "expected": { "array": [ 2, null, {}, 1, 1 ] }
-        },
-        {
-            "op": { "op": "add", "path": "/array/2", "value": "hello" },
-            "target": { "array": [ 2, null, {}, 1] },
-            "expected": { "array": [ 2, null, "hello", {}, 1 ] }
-        },
-        {
-            "op": { "op": "add", "path": "/obj/inner/b", "value": [ 1, 2 ] },
-            "target": {
-                "obj": {
-                    "inner": {
-                        "a": "hello"
-                    }
-                }
-            },
-            "expected": {
-                "obj": {
-                    "inner": {
-                        "a": "hello",
-                        "b": [ 1, 2 ]
-                    }
-                }
-            }
-        },
-        {
-            "op": { "op": "add", "path": "/obj/inner/b", "value": [ 1, 2 ] },
-            "target": {
-                "obj": {
-                    "inner": {
-                        "a": "hello",
-                        "b": "world"
-                    }
-                }
-            },
-            "expected": {
-                "obj": {
-                    "inner": {
-                        "a": "hello",
-                        "b": [ 1, 2 ]
-                    }
-                }
-            }
-        }
-]
diff --git a/impl/src/test/resources/jsonpatchdiff.json b/impl/src/test/resources/jsonpatchdiff.json
deleted file mode 100644
index d4aa8fe..0000000
--- a/impl/src/test/resources/jsonpatchdiff.json
+++ /dev/null
@@ -1,169 +0,0 @@
-[
-        {
-            "original": {"a":"b"},
-            "target": {"a":"b"},
-            "expected": []
-        },
-        {
-            "original": [ 1, 2, 3 ],
-            "target": [ 1, 2, 3, 4, 5 ],
-            "expected": [
-                            {"op":"add","path":"/3","value":4},
-                            {"op":"add","path":"/4","value":5}
-                        ]
-        },
-        {
-            "original": [1,2,3,4,5],
-            "target": [1,3,4],
-            "expected": [
-                            { "op": "remove", "path": "/4"},
-                            { "op": "remove", "path": "/1"}
-                        ]
-        },
-        {
-            "original": [1,2,3,4,5,6],
-            "target": [1,7,3,4,8,5],
-            "expected": [
-                            { "op": "remove", "path": "/5"},
-                            { "op": "replace", "path": "/1", "value": 7},
-                            { "op": "add", "path": "/4", "value": 8}
-                        ]
-        },
-        {
-            "original": [ 1, 2, 3 ],
-            "target": [ 1 ],
-            "expected": [
-                            { "op": "remove", "path": "/2" },
-                            { "op": "remove", "path": "/1" }
-                        ]
-        },
-        {
-            "original": { "a": "b", "c": "d" },
-            "target": { "a": "b" },
-            "expected": [
-                            { "op": "remove", "path": "/c" }
-                        ]
-        },
-        {
-            "original": { "a": 1 },
-            "target": { "a": 1, "c": 2, "b": 3, "d": 4 },
-            "expected": [
-                            { "op": "add", "path": "/c", "value": 2 },
-                            { "op": "add", "path": "/b", "value": 3 },
-                            { "op": "add", "path": "/d", "value": 4 }
-                        ]
-        },
-        {
-            "original": { "a": null },
-            "target": { "a": 6 },
-            "expected": [
-                            { "op": "replace", "path": "/a", "value": 6 }
-                        ]
-        },
-        {
-            "original": [ 1, 2, 3 ],
-            "target": { "hello": "world" },
-            "expected": [
-                            { "op": "replace", "path": "", "value": { "hello": "world" } }
-                        ]
-        },
-        {
-            "original": {
-                            "a": "b",
-                            "c": {
-                                    "d": "e"
-                                 }
-                        },
-            "target": {
-                        "a": "b",
-                        "c": {
-                                "d": 1,
-                                "e": "f"
-                             }
-                      },
-            "expected": [
-                            { "op": "replace", "path": "/c/d", "value": 1 },
-                            { "op": "add", "path": "/c/e", "value": "f" }
-                        ]
-        },
-        {
-            "original": {
-                            "a": [ 1, 2, 3 ]
-                        },
-            "target": {
-                        "a": [ "b", 2, 3, 4 ]
-                      },
-            "expected": [
-                            { "op": "replace", "path": "/a/0", "value":"b" },
-                            { "op": "add", "path": "/a/3", "value":4 }
-                        ]
-        },
-        {
-            "original": [ { "a": "b" }, "foo", { "bar": null } ],
-            "target": [ { "a": "b", "c": "d" }, "foo", { "bar": "baz" } ],
-            "expected": [
-                            { "op": "replace", "path": "/2/bar", "value": "baz" },
-                            { "op": "add", "path": "/0/c", "value": "d" }
-                        ]
-        },
-        {
-            "original": [ 1, [ 2, 3 ], 4 ],
-            "target": [ "x", [ 2, 3, "y" ], 4 ],
-            "expected": [
-                            { "op": "add", "path": "/1/2", "value": "y" },
-                            { "op": "replace", "path": "/0", "value": "x" }
-                        ]
-        },
-        {
-            "original": { "a": "b" },
-            "target": { "c": "b" },
-            "expected": [
-                            { "op": "remove", "path": "/a"},
-                            { "op": "add", "path": "/c", "value": "b"}
-                        ]
-        },
-        {
-            "original": {"a": "c"},
-            "target": {"a": "c", "d": "c"},
-            "expected": [
-                            { "op": "add", "path": "/d", "value": "c" }
-                        ]
-        },
-        {
-            "original": [-1, 0, 1, 3, 4],
-            "target": [5, 0],
-            "expected": [
-                            { "path" : "/4", "op" : "remove"},
-                            { "path" : "/3", "op" : "remove"},
-                            { "path" : "/2", "op" : "remove"},
-                            { "value" : 5, "path" : "/0", "op" : "replace" }
-                        ]
-        },
-        {
-            "original": [0],
-            "target": [0, 1, 2, 3, 4],
-            "expected": [
-                            { "path" : "/1", "value" : 1, "op" : "add" },
-                            { "path" : "/2", "value" : 2, "op" : "add" },
-                            { "value" : 3, "path" : "/3", "op" : "add" },
-                            { "op" : "add", "path" : "/4", "value" : 4 }
-                        ]
-        },
-        {
-            "original": [0, 2, 4],
-            "target": [0, 1, 2, 3, 4],
-            "expected": [
-                            { "path" : "/1", "value" : 1, "op" : "add" },
-                            { "value" : 3, "op" : "add", "path" : "/3" }
-                        ]
-        },
-        {
-          "original": {"a/b": "c", "e/f":  "i"},
-          "target": {"a/b": "d", "f/g":  "i"},
-          "expected": [
-            { "op": "replace", "path": "/a~1b", "value": "d" },
-            { "op": "remove", "path":"/e~1f" },
-            { "op": "add", "path":"/f~1g", "value":"i" }
-          ]
-        }
-]
diff --git a/impl/src/test/resources/rfc6901.json b/impl/src/test/resources/rfc6901.json
deleted file mode 100644
index 170147b..0000000
--- a/impl/src/test/resources/rfc6901.json
+++ /dev/null
@@ -1,20 +0,0 @@
-   {
-      "foo": ["bar", "baz"],
-      "": 0,
-      "a/b": 1,
-      "c%d": 2,
-      "e^f": 3,
-      "g|h": 4,
-      "i\\j": 5,
-      "k\"l": 6,
-      " ": 7,
-      "m~n": 8,
-      "o" : null,
-      "p": {
-        "q":"r"
-       },
-       "s": [ {
-                "t":"u"
-              }
-       ]
-   }
\ No newline at end of file
diff --git a/impl/src/test/resources/twitter.json b/impl/src/test/resources/twitter.json
deleted file mode 100644
index 677f2b9..0000000
--- a/impl/src/test/resources/twitter.json
+++ /dev/null
@@ -1,2 +0,0 @@
-{"statuses":[{"metadata":{"result_type":"recent","iso_language_code":"de"},"created_at":"Fri Jul 26 19:31:26 +0000 2013","id":360844831439855616,"id_str":"360844831439855616","text":"Hiring ••â–º Pre-Sales Consultant ☛ http://t.co/fjlOd8PhcQ #Java #JUnit #Python #PHP #XML #XSLT #SOAP #REST #SAML #Node","source":"<a href=\"http://www.socialoomph.com\" rel=\"nofollow\">SocialOomph</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":93646439,"id_str":"93646439","name":"Paul Pleus","screen_name":"IER_Recruiting","location":"Worldwide","description":"International Executive Recruiting – IER, Xing, Linkedin, Recruiting, Recruiter, Headhunter Personalberater, Job, Jobs, Stellenangebot, Manager","url":"http://t.co/GtcxFsUyI3","entities":{"url":{"urls":[{"url":"http://t.co/GtcxFsUyI3","expanded_url":"http://www.ier-network.com","display_url":"ier-network.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":17822,"friends_count":15829,"listed_count":119,"created_at":"Mon Nov 30 15:02:59 +0000 2009","favourites_count":0,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":26733,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"0099B9","profile_background_image_url":"http://a0.twimg.com/profile_background_images/216930247/pleus_final_logo_KUGEL.jpg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/216930247/pleus_final_logo_KUGEL.jpg","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1270812893/Final_198x146_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/1270812893/Final_198x146_normal.jpg","profile_link_color":"0099B9","profile_sidebar_border_color":"5ED4DC","profile_sidebar_fill_color":"95E8EC","profile_text_color":"3C3940","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"Java","indices":[57,62]},{"text":"JUnit","indices":[63,69]},{"text":"Python","indices":[70,77]},{"text":"PHP","indices":[78,82]},{"text":"XML","indices":[83,87]},{"text":"XSLT","indices":[88,93]},{"text":"SOAP","indices":[94,99]},{"text":"REST","indices":[100,105]},{"text":"SAML","indices":[106,111]},{"text":"Node","indices":[112,117]}],"symbols":[],"urls":[{"url":"http://t.co/fjlOd8PhcQ","expanded_url":"http://bit.ly/19I4P7E","display_url":"bit.ly/19I4P7E","indices":[34,56]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"de"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:30:39 +0000 2013","id":360844632520798209,"id_str":"360844632520798209","text":"Death toll reaches 15 for #Indonesian asylum seeker boat that capsized off the coast of west #Java http://t.co/4rGk0LO9F8","source":"<a href=\"http://www.tweetdeck.com\" rel=\"nofollow\">TweetDeck</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":90407341,"id_str":"90407341","name":"CSIS Southeast Asia","screen_name":"SoutheastAsiaDC","location":"Washington, DC","description":"The Sumitro Chair for Southeast Asia Studies @CSIS is the premier forum for sustained elevated policy dialogue on Southeast Asia and US interests in the region.","url":"http://t.co/1bcQU6sG1V","entities":{"url":{"urls":[{"url":"http://t.co/1bcQU6sG1V","expanded_url":"http://bit.ly/csis-seap","display_url":"bit.ly/csis-seap","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":8127,"friends_count":523,"listed_count":427,"created_at":"Mon Nov 16 14:51:00 +0000 2009","favourites_count":16,"utc_offset":-14400,"time_zone":"Eastern Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":12019,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"B2DFDA","profile_background_image_url":"http://a0.twimg.com/profile_background_images/669153955/be1298700d512cfdd3734a677a587095.gif","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/669153955/be1298700d512cfdd3734a677a587095.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2648645038/e06eb649efb4030845d4cbf47d41651b_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/2648645038/e06eb649efb4030845d4cbf47d41651b_normal.jpeg","profile_banner_url":"https://pbs.twimg.com/profile_banners/90407341/1371826204","profile_link_color":"93A644","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"FFFFFF","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"Indonesian","indices":[26,37]},{"text":"Java","indices":[93,98]}],"symbols":[],"urls":[{"url":"http://t.co/4rGk0LO9F8","expanded_url":"http://fxn.ws/1c7VZ2F","display_url":"fxn.ws/1c7VZ2F","indices":[99,121]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:30:15 +0000 2013","id":360844531593261057,"id_str":"360844531593261057","text":"Senior Java Developer w/ #Java #Software skills Addison @p2people http://t.co/Fc9UlSdyWj","source":"<a href=\"http://www.p2people.co.uk\" rel=\"nofollow\">p2people</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":551581457,"id_str":"551581457","name":"p2p WebMobileIT","screen_name":"p2pWebMobileIt","location":"Stevenage | Hertfordshire","description":"Web, Mobile & IT micro #outsourcing and #freelance jobs at p2people","url":"http://t.co/OxLhyJdlxw","entities":{"url":{"urls":[{"url":"http://t.co/OxLhyJdlxw","expanded_url":"http://www.p2people.co.uk","display_url":"p2people.co.uk","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":712,"friends_count":3,"listed_count":44,"created_at":"Thu Apr 12 05:07:17 +0000 2012","favourites_count":0,"utc_offset":3600,"time_zone":"London","geo_enabled":false,"verified":false,"statuses_count":88202,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2099631495/p2people_logo_48x48_normal.png","profile_image_url_https":"https://si0.twimg.com/profile_images/2099631495/p2people_logo_48x48_normal.png","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"Java","indices":[25,30]},{"text":"Software","indices":[31,40]}],"symbols":[],"urls":[{"url":"http://t.co/Fc9UlSdyWj","expanded_url":"http://bit.ly/175ch6w","display_url":"bit.ly/175ch6w","indices":[66,88]}],"user_mentions":[{"screen_name":"p2people","name":"p2people","id":22741835,"id_str":"22741835","indices":[56,65]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:30:00 +0000 2013","id":360844471761502209,"id_str":"360844471761502209","text":"Took 658ms to processing 200 tweets #JAVA #APPENGINE #1374867000804","source":"<a href=\"http://google.co.id/\" rel=\"nofollow\">You Can't Be Wrong</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1186398894,"id_str":"1186398894","name":"You Can't Be Wrong","screen_name":"YouCantBeWrong","location":"@tegaralaga's mind","description":"User generated content text game based on Twitter. For more information send your email to tegaralaga(at)live(dot)com","url":"http://t.co/Jto68Xkf","entities":{"url":{"urls":[{"url":"http://t.co/Jto68Xkf","expanded_url":"http://google.co.id/","display_url":"google.co.id","indices":[0,20]}]},"description":{"urls":[]}},"protected":false,"followers_count":8,"friends_count":1,"listed_count":1,"created_at":"Sat Feb 16 14:30:21 +0000 2013","favourites_count":0,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":22815,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/3261474447/f3cabcc48d277be37e45ac7b1038d73e_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/3261474447/f3cabcc48d277be37e45ac7b1038d73e_normal.jpeg","profile_banner_url":"https://pbs.twimg.com/profile_banners/1186398894/1361117710","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"JAVA","indices":[36,41]},{"text":"APPENGINE","indices":[42,52]}],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:29:22 +0000 2013","id":360844310297591811,"id_str":"360844310297591811","text":"RT @ECBader: Some interesting open source #Java projects from #Esri http://t.co/1pvAEzkV9r. Geometry API is worth checking out! https://t.c…","source":"<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":11640022,"id_str":"11640022","name":"Philip Heede","screen_name":"pheede","location":"Redlands, CA","description":"Transplanted Dane using GIS at Esri w/.NET/XAML/Geoprocessing/Python/ArcObjects/Network Analyst/.. Disclaimer: all opinions, comments are my own, blah blah..","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":355,"friends_count":267,"listed_count":22,"created_at":"Sat Dec 29 20:25:10 +0000 2007","favourites_count":114,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":1711,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/335064929/n701240139_383204_9480_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/335064929/n701240139_383204_9480_normal.jpg","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 15:40:13 +0000 2013","id":360786645261352961,"id_str":"360786645261352961","text":"Some interesting open source #Java projects from #Esri http://t.co/1pvAEzkV9r. Geometry API is worth checking out! https://t.co/yEXKNTClKZ","source":"<a href=\"http://www.tweetdeck.com\" rel=\"nofollow\">TweetDeck</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":26422164,"id_str":"26422164","name":"Eric Bader","screen_name":"ECBader","location":"Southern California","description":"Geographer, Musician, Christ-follower, Java dude, Nebraska Cornhusker, Esri Product Management Team - ArcGIS.","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":614,"friends_count":473,"listed_count":37,"created_at":"Wed Mar 25 03:44:15 +0000 2009","favourites_count":27,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":2700,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"1A1B1F","profile_background_image_url":"http://a0.twimg.com/images/themes/theme9/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme9/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2586630286/dct7znna7xosntblt7jb_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/2586630286/dct7znna7xosntblt7jb_normal.jpeg","profile_link_color":"2FC2EF","profile_sidebar_border_color":"181A1E","profile_sidebar_fill_color":"252429","profile_text_color":"666666","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":2,"favorite_count":0,"entities":{"hashtags":[{"text":"Java","indices":[29,34]},{"text":"Esri","indices":[49,54]}],"symbols":[],"urls":[{"url":"http://t.co/1pvAEzkV9r","expanded_url":"http://esri.github.io/#Java","display_url":"esri.github.io/#Java","indices":[55,77]},{"url":"https://t.co/yEXKNTClKZ","expanded_url":"https://github.com/Esri/geometry-api-java","display_url":"github.com/Esri/geometry-…","indices":[115,138]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},"retweet_count":2,"favorite_count":0,"entities":{"hashtags":[{"text":"Java","indices":[42,47]},{"text":"Esri","indices":[62,67]}],"symbols":[],"urls":[{"url":"http://t.co/1pvAEzkV9r","expanded_url":"http://esri.github.io/#Java","display_url":"esri.github.io/#Java","indices":[68,90]}],"user_mentions":[{"screen_name":"ECBader","name":"Eric Bader","id":26422164,"id_str":"26422164","indices":[3,11]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:29:17 +0000 2013","id":360844289841971200,"id_str":"360844289841971200","text":"Looking for a new IT challenge? Take a look at our job openings http://t.co/MhnnR101cT #atlassian #java #oracle #mobile #infra #jobs","source":"<a href=\"http://www.tweetdeck.com\" rel=\"nofollow\">TweetDeck</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":296655269,"id_str":"296655269","name":"Koen Gillard","screen_name":"KoenGillard","location":"","description":"Sr Java/Oracle Consultant at @Contribute4J. Certified Scrum Master. Big Atlassian enthusiast. Father of 2 great sons. Other interests music/soccer/cycling/...","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":151,"friends_count":341,"listed_count":4,"created_at":"Wed May 11 05:23:43 +0000 2011","favourites_count":874,"utc_offset":7200,"time_zone":"Brussels","geo_enabled":false,"verified":false,"statuses_count":549,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"ACDED6","profile_background_image_url":"http://a0.twimg.com/images/themes/theme18/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme18/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/3690118960/3bf92c8b7f1398f35e635f0d08bde368_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/3690118960/3bf92c8b7f1398f35e635f0d08bde368_normal.jpeg","profile_link_color":"038543","profile_sidebar_border_color":"EEEEEE","profile_sidebar_fill_color":"F6F6F6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"atlassian","indices":[87,97]},{"text":"java","indices":[98,103]},{"text":"oracle","indices":[104,111]},{"text":"mobile","indices":[112,119]},{"text":"infra","indices":[120,126]},{"text":"jobs","indices":[127,132]}],"symbols":[],"urls":[{"url":"http://t.co/MhnnR101cT","expanded_url":"http://jobs.contribute.be","display_url":"jobs.contribute.be","indices":[64,86]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"in"},"created_at":"Fri Jul 26 19:27:56 +0000 2013","id":360843950518566914,"id_str":"360843950518566914","text":"RT @SKSMediaMalay: Rip-off or investor's dream? You decide...http://t.co/bxk76YXRJM #Bandar #Lampung #java #Sumatra #Banten #Riau #Padang //","source":"<a href=\"http://roundteam.co\" rel=\"nofollow\">RoundTeam</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1596343046,"id_str":"1596343046","name":"Rooms_In_Lowestoft","screen_name":"RoomsLowestoft","location":"Lowestoft, Suffolk, UK","description":"#Rooms #Room to #rent #let in #Lowestoft, #Suffolk, #UK E: lowestoft@niche.me.uk \r\n\r\n#norfolk #greatyarmouth #saxmundham #ipswich #aldeburgh #leiston #tfbuk","url":"https://t.co/aeCwVfy3l0","entities":{"url":{"urls":[{"url":"https://t.co/aeCwVfy3l0","expanded_url":"https://twitter.com/RoomsLowestoft","display_url":"twitter.com/RoomsLowestoft","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":963,"friends_count":1742,"listed_count":14,"created_at":"Mon Jul 15 17:23:58 +0000 2013","favourites_count":182,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":9095,"lang":"en-gb","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/profile_background_images/378800000024425110/a2acf9f2d9bf8f8c90cb24910a71c037.jpeg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/378800000024425110/a2acf9f2d9bf8f8c90cb24910a71c037.jpeg","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/378800000138549193/b276cf4d94b9c96e5b61c92f9864615f_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/378800000138549193/b276cf4d94b9c96e5b61c92f9864615f_normal.jpeg","profile_banner_url":"https://pbs.twimg.com/profile_banners/1596343046/1373917379","profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"metadata":{"result_type":"recent","iso_language_code":"in"},"created_at":"Fri Jul 26 19:20:50 +0000 2013","id":360842165292773376,"id_str":"360842165292773376","text":"Rip-off or investor's dream? You decide...http://t.co/bxk76YXRJM #Bandar #Lampung #java #Sumatra #Banten #Riau #Padang //","source":"<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">HootSuite</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1449573356,"id_str":"1449573356","name":"SKS Media Malaysia","screen_name":"SKSMediaMalay","location":"Kuala Lumpur","description":"Pemasaran syarikat perkhidmatan.\r\n\r\n#teamfollowback #tfb #tfbjp #autofollow #followback","url":"https://t.co/nfmdo6g6HC","entities":{"url":{"urls":[{"url":"https://t.co/nfmdo6g6HC","expanded_url":"https://twitter.com/SKSMediaMalay","display_url":"twitter.com/SKSMediaMalay","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":1048,"friends_count":877,"listed_count":27,"created_at":"Wed May 22 18:07:31 +0000 2013","favourites_count":166,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":8006,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/profile_background_images/874883247/77db35ff9cff8c42d2ef4c2bcd22df35.jpeg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/874883247/77db35ff9cff8c42d2ef4c2bcd22df35.jpeg","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/3695357949/77db35ff9cff8c42d2ef4c2bcd22df35_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/3695357949/77db35ff9cff8c42d2ef4c2bcd22df35_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"Bandar","indices":[65,72]},{"text":"Lampung","indices":[73,81]},{"text":"java","indices":[82,87]},{"text":"Sumatra","indices":[88,96]},{"text":"Banten","indices":[97,104]},{"text":"Riau","indices":[105,110]},{"text":"Padang","indices":[111,118]}],"symbols":[],"urls":[{"url":"http://t.co/bxk76YXRJM","expanded_url":"http://tinyurl.com/dxxrao5","display_url":"tinyurl.com/dxxrao5","indices":[42,64]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"in"},"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"Bandar","indices":[84,91]},{"text":"Lampung","indices":[92,100]},{"text":"java","indices":[101,106]},{"text":"Sumatra","indices":[107,115]},{"text":"Banten","indices":[116,123]},{"text":"Riau","indices":[124,129]},{"text":"Padang","indices":[130,137]}],"symbols":[],"urls":[{"url":"http://t.co/bxk76YXRJM","expanded_url":"http://tinyurl.com/dxxrao5","display_url":"tinyurl.com/dxxrao5","indices":[61,83]}],"user_mentions":[{"screen_name":"SKSMediaMalay","name":"SKS Media Malaysia","id":1449573356,"id_str":"1449573356","indices":[3,17]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"in"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:25:27 +0000 2013","id":360843324011184128,"id_str":"360843324011184128","text":"#Java #Developer #BackEnd position open in #Dallas TX. #BED #BE #JavaDev Apply Online Today! - http://t.co/oVDyhoR65M","source":"<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">HootSuite</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":52097984,"id_str":"52097984","name":"InSource Group","screen_name":"InSourcegroup","location":"Dallas, Texas","description":"Technical Resource & Contract Staffing Provider with offices in Dallas, Fort Worth, and Houston.","url":"http://t.co/IyUTPyeCMm","entities":{"url":{"urls":[{"url":"http://t.co/IyUTPyeCMm","expanded_url":"http://www.insourcegroup.com","display_url":"insourcegroup.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":1712,"friends_count":1899,"listed_count":63,"created_at":"Mon Jun 29 16:03:36 +0000 2009","favourites_count":81,"utc_offset":-18000,"time_zone":"Central Time (US & Canada)","geo_enabled":false,"verified":false,"statuses_count":43289,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"FFFFFF","profile_background_image_url":"http://a0.twimg.com/profile_background_images/57804915/nvoffice.br.jpg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/57804915/nvoffice.br.jpg","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1109935707/insource-fb_normal.gif","profile_image_url_https":"https://si0.twimg.com/profile_images/1109935707/insource-fb_normal.gif","profile_banner_url":"https://pbs.twimg.com/profile_banners/52097984/1369854759","profile_link_color":"0083FF","profile_sidebar_border_color":"000000","profile_sidebar_fill_color":"7ABAE6","profile_text_color":"000000","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"Java","indices":[0,5]},{"text":"Developer","indices":[6,16]},{"text":"BackEnd","indices":[17,25]},{"text":"Dallas","indices":[43,50]},{"text":"BED","indices":[55,59]},{"text":"BE","indices":[60,63]},{"text":"JavaDev","indices":[64,72]}],"symbols":[],"urls":[{"url":"http://t.co/oVDyhoR65M","expanded_url":"http://ow.ly/nkcSS","display_url":"ow.ly/nkcSS","indices":[95,117]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:22:18 +0000 2013","id":360842533410045954,"id_str":"360842533410045954","text":"3,2,1... Stir and energy will be served! #coffee #addict #givemecaffine #java http://t.co/OjGso3pbPt","source":"<a href=\"http://instagram.com\" rel=\"nofollow\">Instagram</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":17855557,"id_str":"17855557","name":"Heather Cereghino","screen_name":"HeatherCinOC","location":"Orange County, CA","description":"Social media-lite, creative writing (beach + laptop = bliss), Event Planner, PR, cook in the making, love the outdoors, traveling & shoes. PS. I love shoes!","url":null,"entities":{"description":{"urls":[]}},"protected":false,"followers_count":4114,"friends_count":4410,"listed_count":232,"created_at":"Thu Dec 04 01:19:51 +0000 2008","favourites_count":218,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":12505,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"B2DFDA","profile_background_image_url":"http://a0.twimg.com/images/themes/theme13/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme13/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/3673021821/693873aafc52e32076ff85d68302ff78_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/3673021821/693873aafc52e32076ff85d68302ff78_normal.jpeg","profile_banner_url":"https://pbs.twimg.com/profile_banners/17855557/1370094052","profile_link_color":"93A644","profile_sidebar_border_color":"EEEEEE","profile_sidebar_fill_color":"FFFFFF","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"coffee","indices":[41,48]},{"text":"addict","indices":[49,56]},{"text":"givemecaffine","indices":[57,71]},{"text":"java","indices":[72,77]}],"symbols":[],"urls":[{"url":"http://t.co/OjGso3pbPt","expanded_url":"http://instagram.com/p/cPZ9yEqwlf/","display_url":"instagram.com/p/cPZ9yEqwlf/","indices":[78,100]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"in"},"created_at":"Fri Jul 26 19:20:50 +0000 2013","id":360842165292773376,"id_str":"360842165292773376","text":"Rip-off or investor's dream? You decide...http://t.co/bxk76YXRJM #Bandar #Lampung #java #Sumatra #Banten #Riau #Padang //","source":"<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">HootSuite</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1449573356,"id_str":"1449573356","name":"SKS Media Malaysia","screen_name":"SKSMediaMalay","location":"Kuala Lumpur","description":"Pemasaran syarikat perkhidmatan.\r\n\r\n#teamfollowback #tfb #tfbjp #autofollow #followback","url":"https://t.co/nfmdo6g6HC","entities":{"url":{"urls":[{"url":"https://t.co/nfmdo6g6HC","expanded_url":"https://twitter.com/SKSMediaMalay","display_url":"twitter.com/SKSMediaMalay","indices":[0,23]}]},"description":{"urls":[]}},"protected":false,"followers_count":1048,"friends_count":877,"listed_count":27,"created_at":"Wed May 22 18:07:31 +0000 2013","favourites_count":166,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":8006,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/profile_background_images/874883247/77db35ff9cff8c42d2ef4c2bcd22df35.jpeg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/874883247/77db35ff9cff8c42d2ef4c2bcd22df35.jpeg","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/3695357949/77db35ff9cff8c42d2ef4c2bcd22df35_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/3695357949/77db35ff9cff8c42d2ef4c2bcd22df35_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"Bandar","indices":[65,72]},{"text":"Lampung","indices":[73,81]},{"text":"java","indices":[82,87]},{"text":"Sumatra","indices":[88,96]},{"text":"Banten","indices":[97,104]},{"text":"Riau","indices":[105,110]},{"text":"Padang","indices":[111,118]}],"symbols":[],"urls":[{"url":"http://t.co/bxk76YXRJM","expanded_url":"http://tinyurl.com/dxxrao5","display_url":"tinyurl.com/dxxrao5","indices":[42,64]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"in"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:20:08 +0000 2013","id":360841988431556609,"id_str":"360841988431556609","text":"Took 8397ms to processing 200 tweets #JAVA #APPENGINE #1374866408704","source":"<a href=\"http://google.co.id/\" rel=\"nofollow\">You Can't Be Wrong</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":1186398894,"id_str":"1186398894","name":"You Can't Be Wrong","screen_name":"YouCantBeWrong","location":"@tegaralaga's mind","description":"User generated content text game based on Twitter. For more information send your email to tegaralaga(at)live(dot)com","url":"http://t.co/Jto68Xkf","entities":{"url":{"urls":[{"url":"http://t.co/Jto68Xkf","expanded_url":"http://google.co.id/","display_url":"google.co.id","indices":[0,20]}]},"description":{"urls":[]}},"protected":false,"followers_count":8,"friends_count":1,"listed_count":1,"created_at":"Sat Feb 16 14:30:21 +0000 2013","favourites_count":0,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":22815,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/3261474447/f3cabcc48d277be37e45ac7b1038d73e_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/3261474447/f3cabcc48d277be37e45ac7b1038d73e_normal.jpeg","profile_banner_url":"https://pbs.twimg.com/profile_banners/1186398894/1361117710","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"JAVA","indices":[37,42]},{"text":"APPENGINE","indices":[43,53]}],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:18:09 +0000 2013","id":360841487262547968,"id_str":"360841487262547968","text":"Can’t decide between more #java or #c++","source":"<a href=\"http://tapbots.com/tweetbot\" rel=\"nofollow\">Tweetbot for iOS</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":29063267,"id_str":"29063267","name":"Steven Truesdell","screen_name":"TrueSteve","location":"Denver, CO","description":"Snowboarder. Photographer. Web Designer. Journalist. Music lover. Soon to be Firefighter & EMT","url":"http://t.co/fCPFLstB49","entities":{"url":{"urls":[{"url":"http://t.co/fCPFLstB49","expanded_url":"http://www.steventruesdell.com","display_url":"steventruesdell.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":88,"friends_count":144,"listed_count":3,"created_at":"Sun Apr 05 21:02:17 +0000 2009","favourites_count":0,"utc_offset":-21600,"time_zone":"Mountain Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":1792,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"1A1B1F","profile_background_image_url":"http://a0.twimg.com/images/themes/theme9/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme9/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/3637401835/e96f6955cd6bfd3d7bf78002ebdbd0de_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/3637401835/e96f6955cd6bfd3d7bf78002ebdbd0de_normal.jpeg","profile_link_color":"2FC2EF","profile_sidebar_border_color":"181A1E","profile_sidebar_fill_color":"252429","profile_text_color":"666666","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":{"id":"2571b7720cd62ad3","url":"https://api.twitter.com/1.1/geo/id/2571b7720cd62ad3.json","place_type":"city","name":"Highlands Ranch","full_name":"Highlands Ranch, CO","country_code":"US","country":"United States","bounding_box":{"type":"Polygon","coordinates":[[[-105.05306,39.510546],[-104.899484,39.510546],[-104.899484,39.566782],[-105.05306,39.566782]]]},"attributes":{}},"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"java","indices":[26,31]},{"text":"c","indices":[35,37]}],"symbols":[],"urls":[],"user_mentions":[]},"favorited":false,"retweeted":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"pt"},"created_at":"Fri Jul 26 19:17:48 +0000 2013","id":360841400004251648,"id_str":"360841400004251648","text":"RT @maribalbe: No Brasil? Piada! RT @rogerio_gentil: Desenvolvedores em #PHP e #Java ganham até R$ 9 mil http://t.co/Cj6dotO8Be // #souDev","source":"<a href=\"http://www.tweetdeck.com\" rel=\"nofollow\">TweetDeck</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":188855964,"id_str":"188855964","name":"Rodrigo Baron","screen_name":"b4r0n__","location":"Medianeira","description":"Full-stack Rails Developer. Addicts script codes and Internet App Dev. Startup Co-Founder: http://t.co/Vvj2Un84yC","url":"http://t.co/WEJSgUafv6","entities":{"url":{"urls":[{"url":"http://t.co/WEJSgUafv6","expanded_url":"http://about.me/baron.rodrigo","display_url":"about.me/baron.rodrigo","indices":[0,22]}]},"description":{"urls":[{"url":"http://t.co/Vvj2Un84yC","expanded_url":"http://www.saifer.com.br","display_url":"saifer.com.br","indices":[91,113]}]}},"protected":false,"followers_count":121,"friends_count":183,"listed_count":1,"created_at":"Thu Sep 09 19:15:20 +0000 2010","favourites_count":105,"utc_offset":-10800,"time_zone":"Brasilia","geo_enabled":true,"verified":false,"statuses_count":3777,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"FFFFFF","profile_background_image_url":"http://a0.twimg.com/images/themes/theme14/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme14/bg.gif","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/378800000105833766/cfe4372a0fce180e09813ab02f909a4d_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/378800000105833766/cfe4372a0fce180e09813ab02f909a4d_normal.jpeg","profile_link_color":"006DCC","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"EFEFEF","profile_text_color":"333333","profile_use_background_image":false,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"metadata":{"result_type":"recent","iso_language_code":"pt"},"created_at":"Fri Jul 26 14:37:46 +0000 2013","id":360770928357027840,"id_str":"360770928357027840","text":"No Brasil? Piada! RT @rogerio_gentil: Desenvolvedores em #PHP e #Java ganham até R$ 9 mil http://t.co/Cj6dotO8Be // #souDev","source":"<a href=\"http://www.tweetdeck.com\" rel=\"nofollow\">TweetDeck</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":41602902,"id_str":"41602902","name":"Marília Balbé","screen_name":"maribalbe","location":"Florianópolis, Brazil","description":"Certified Scrum Master. MCTS Microsoft Project 2010, Managing Projects. MTAC. Gaúcha. Feeling. Liderança. Agilidade. Follow me!","url":"http://t.co/v7BRmRMPEn","entities":{"url":{"urls":[{"url":"http://t.co/v7BRmRMPEn","expanded_url":"http://mariliabalbe.com","display_url":"mariliabalbe.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":2065,"friends_count":1464,"listed_count":81,"created_at":"Thu May 21 15:05:11 +0000 2009","favourites_count":51,"utc_offset":-10800,"time_zone":"Brasilia","geo_enabled":true,"verified":false,"statuses_count":26222,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"9AE4E8","profile_background_image_url":"http://a0.twimg.com/images/themes/theme16/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme16/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/2914714002/d2b0d4771ad8c92841a8d6a37d24c920_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/2914714002/d2b0d4771ad8c92841a8d6a37d24c920_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"BDDCAD","profile_sidebar_fill_color":"DDFFCC","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":21,"favorite_count":1,"entities":{"hashtags":[{"text":"PHP","indices":[57,61]},{"text":"Java","indices":[64,69]},{"text":"souDev","indices":[116,123]}],"symbols":[],"urls":[{"url":"http://t.co/Cj6dotO8Be","expanded_url":"http://lnkd.in/zsQhdg","display_url":"lnkd.in/zsQhdg","indices":[90,112]}],"user_mentions":[{"screen_name":"rogerio_gentil","name":"Rogerio J. Gentil","id":71697548,"id_str":"71697548","indices":[21,36]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"pt"},"retweet_count":21,"favorite_count":0,"entities":{"hashtags":[{"text":"PHP","indices":[72,76]},{"text":"Java","indices":[79,84]},{"text":"souDev","indices":[131,138]}],"symbols":[],"urls":[{"url":"http://t.co/Cj6dotO8Be","expanded_url":"http://lnkd.in/zsQhdg","display_url":"lnkd.in/zsQhdg","indices":[105,127]}],"user_mentions":[{"screen_name":"maribalbe","name":"Marília Balbé","id":41602902,"id_str":"41602902","indices":[3,13]},{"screen_name":"rogerio_gentil","name":"Rogerio J. Gentil","id":71697548,"id_str":"71697548","indices":[36,51]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"pt"},{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 19:16:15 +0000 2013","id":360841008411447296,"id_str":"360841008411447296","text":"RT @danielleandy: Finding a way to have our morning coffee together! #bestneighbors #technology  #java #screenshot… http://t.co/ZakQ5Ip16C","source":"<a href=\"http://twitter.com/download/iphone\" rel=\"nofollow\">Twitter for iPhone</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":169605040,"id_str":"169605040","name":"Bucko","screen_name":"jonathonbuckley","location":"Los Angeles","description":"","url":"http://t.co/Vsgepye3eK","entities":{"url":{"urls":[{"url":"http://t.co/Vsgepye3eK","expanded_url":"http://jonathonbuckley.com","display_url":"jonathonbuckley.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":2059,"friends_count":116,"listed_count":86,"created_at":"Thu Jul 22 18:56:12 +0000 2010","favourites_count":5,"utc_offset":-25200,"time_zone":"Pacific Time (US & Canada)","geo_enabled":true,"verified":false,"statuses_count":436,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"1A1B1F","profile_background_image_url":"http://a0.twimg.com/images/themes/theme9/bg.gif","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme9/bg.gif","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/1097180716/8X10_6255_no_pink_small_normal.jpg","profile_image_url_https":"https://si0.twimg.com/profile_images/1097180716/8X10_6255_no_pink_small_normal.jpg","profile_link_color":"2FC2EF","profile_sidebar_border_color":"181A1E","profile_sidebar_fill_color":"252429","profile_text_color":"666666","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweeted_status":{"metadata":{"result_type":"recent","iso_language_code":"en"},"created_at":"Fri Jul 26 16:44:25 +0000 2013","id":360802801032499200,"id_str":"360802801032499200","text":"Finding a way to have our morning coffee together! #bestneighbors #technology  #java #screenshot… http://t.co/ZakQ5Ip16C","source":"<a href=\"http://instagram.com\" rel=\"nofollow\">Instagram</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":259458041,"id_str":"259458041","name":"Danielle Anderson","screen_name":"danielleandy","location":"Los Angeles ","description":"","url":"http://t.co/JiAcLT2Wfg","entities":{"url":{"urls":[{"url":"http://t.co/JiAcLT2Wfg","expanded_url":"http://www.danielleandy.com","display_url":"danielleandy.com","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":209,"friends_count":127,"listed_count":3,"created_at":"Tue Mar 01 23:31:29 +0000 2011","favourites_count":0,"utc_offset":null,"time_zone":null,"geo_enabled":false,"verified":false,"statuses_count":1451,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/images/themes/theme1/bg.png","profile_background_image_url_https":"https://si0.twimg.com/images/themes/theme1/bg.png","profile_background_tile":false,"profile_image_url":"http://a0.twimg.com/profile_images/378800000130553531/82c57daecf779a8d61f17a53a44d31d3_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/378800000130553531/82c57daecf779a8d61f17a53a44d31d3_normal.jpeg","profile_banner_url":"https://pbs.twimg.com/profile_banners/259458041/1373653784","profile_link_color":"0084B4","profile_sidebar_border_color":"C0DEED","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":true,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"bestneighbors","indices":[51,65]},{"text":"technology","indices":[66,77]},{"text":"java","indices":[79,84]},{"text":"screenshot","indices":[85,96]}],"symbols":[],"urls":[{"url":"http://t.co/ZakQ5Ip16C","expanded_url":"http://instagram.com/p/cPHow7KIcS/","display_url":"instagram.com/p/cPHow7KIcS/","indices":[98,120]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},"retweet_count":1,"favorite_count":0,"entities":{"hashtags":[{"text":"bestneighbors","indices":[69,83]},{"text":"technology","indices":[84,95]},{"text":"java","indices":[97,102]},{"text":"screenshot","indices":[103,114]}],"symbols":[],"urls":[{"url":"http://t.co/ZakQ5Ip16C","expanded_url":"http://instagram.com/p/cPHow7KIcS/","display_url":"instagram.com/p/cPHow7KIcS/","indices":[116,138]}],"user_mentions":[{"screen_name":"danielleandy","name":"Danielle Anderson","id":259458041,"id_str":"259458041","indices":[3,16]}]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"en"},{"metadata":{"result_type":"recent","iso_language_code":"in"},"created_at":"Fri Jul 26 19:11:01 +0000 2013","id":360839690812784641,"id_str":"360839690812784641","text":"Rip-off or investor's dream? You decide...http://t.co/yLzRPs1Qly #Bandar #Lampung #java #Sumatra #Banten #Riau #Padang //","source":"<a href=\"http://www.hootsuite.com\" rel=\"nofollow\">HootSuite</a>","truncated":false,"in_reply_to_status_id":null,"in_reply_to_status_id_str":null,"in_reply_to_user_id":null,"in_reply_to_user_id_str":null,"in_reply_to_screen_name":null,"user":{"id":854562582,"id_str":"854562582","name":"SKS Media Londres","screen_name":"SKSMediaLondres","location":"","description":"Nous sommes aussi #teamfollowback #followback @sksfollowback","url":"http://t.co/g6dzOOabDQ","entities":{"url":{"urls":[{"url":"http://t.co/g6dzOOabDQ","expanded_url":"http://www.niche-advertising.co.uk","display_url":"niche-advertising.co.uk","indices":[0,22]}]},"description":{"urls":[]}},"protected":false,"followers_count":1972,"friends_count":1380,"listed_count":100,"created_at":"Sun Sep 30 11:39:09 +0000 2012","favourites_count":439,"utc_offset":7200,"time_zone":"Amsterdam","geo_enabled":false,"verified":false,"statuses_count":144790,"lang":"en","contributors_enabled":false,"is_translator":false,"profile_background_color":"C0DEED","profile_background_image_url":"http://a0.twimg.com/profile_background_images/673161806/9c3894fdf100336e2f53e97bffeace6c.jpeg","profile_background_image_url_https":"https://si0.twimg.com/profile_background_images/673161806/9c3894fdf100336e2f53e97bffeace6c.jpeg","profile_background_tile":true,"profile_image_url":"http://a0.twimg.com/profile_images/2665504502/86c0fc8adfb2d7f13e687f7dbfddf876_normal.jpeg","profile_image_url_https":"https://si0.twimg.com/profile_images/2665504502/86c0fc8adfb2d7f13e687f7dbfddf876_normal.jpeg","profile_link_color":"0084B4","profile_sidebar_border_color":"FFFFFF","profile_sidebar_fill_color":"DDEEF6","profile_text_color":"333333","profile_use_background_image":true,"default_profile":false,"default_profile_image":false,"following":false,"follow_request_sent":false,"notifications":false},"geo":null,"coordinates":null,"place":null,"contributors":null,"retweet_count":0,"favorite_count":0,"entities":{"hashtags":[{"text":"Bandar","indices":[65,72]},{"text":"Lampung","indices":[73,81]},{"text":"java","indices":[82,87]},{"text":"Sumatra","indices":[88,96]},{"text":"Banten","indices":[97,104]},{"text":"Riau","indices":[105,110]},{"text":"Padang","indices":[111,118]}],"symbols":[],"urls":[{"url":"http://t.co/yLzRPs1Qly","expanded_url":"http://tinyurl.com/dxxrao5","display_url":"tinyurl.com/dxxrao5","indices":[42,64]}],"user_mentions":[]},"favorited":false,"retweeted":false,"possibly_sensitive":false,"lang":"in"}],"search_metadata":{"completed_in":0.033,"max_id":360844831439855616,"max_id_str":"360844831439855616","next_results":"?max_id=360839690812784640&q=%23java&include_entities=1","query":"%23java","refresh_url":"?since_id=360844831439855616&q=%23java&include_entities=1","count":15,"since_id":0,"since_id_str":"0"}}
-
diff --git a/impl/src/test/resources/wiki.json b/impl/src/test/resources/wiki.json
deleted file mode 100644
index 17bb193..0000000
--- a/impl/src/test/resources/wiki.json
+++ /dev/null
@@ -1,21 +0,0 @@
-{
-     "firstName": "John",
-     "lastName": "Smith",
-     "age": 25,
-     "address": {
-         "streetAddress": "21 2nd Street",
-         "city": "New York",
-         "state": "NY",
-         "postalCode": "10021"
-     },
-     "phoneNumber": [
-         {
-           "type": "home",
-           "number": "212 555-1234"
-         },
-         {
-           "type": "fax",
-           "number": "646 555-4567"
-         }
-     ]
-}
diff --git a/jaxrs/pom.xml b/jaxrs/pom.xml
deleted file mode 100644
index b29df8d..0000000
--- a/jaxrs/pom.xml
+++ /dev/null
@@ -1,87 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>json</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <groupId>org.eclipse.jsonp</groupId>
-    <artifactId>jsonp-jaxrs</artifactId>
-    <packaging>jar</packaging>
-    <version>2.0.2-SNAPSHOT</version>
-    <name>Jakarta JSON Processing Media for Jakarta RESTful Web Services</name>
-    <description>Jakarta RESTful Web Services MessageBodyReader and MessageBodyWriter to support JsonValue API of Jakarta JSON Processing</description>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.ws.rs</groupId>
-            <artifactId>jakarta.ws.rs-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.xml.bind</groupId>
-            <artifactId>jakarta.xml.bind-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.annotation</groupId>
-            <artifactId>jakarta.annotation-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.felix</groupId>
-                <artifactId>maven-bundle-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>bundle-manifest</id>
-                        <phase>process-classes</phase>
-                        <goals>
-                            <goal>manifest</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </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>
-        </plugins>
-    </build>
-
-</project>
diff --git a/jaxrs/src/main/java/module-info.java b/jaxrs/src/main/java/module-info.java
deleted file mode 100644
index 02eb5d3..0000000
--- a/jaxrs/src/main/java/module-info.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * Copyright (c) 2020, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-module org.eclipse.jsonp.jaxrs {
-
-    requires jakarta.json;
-    requires jakarta.annotation;
-    requires jakarta.ws.rs;
-
-    exports org.eclipse.jsonp.jaxrs;
-
-}
diff --git a/jaxrs/src/main/java/org/eclipse/jsonp/jaxrs/JsonValueBodyReader.java b/jaxrs/src/main/java/org/eclipse/jsonp/jaxrs/JsonValueBodyReader.java
deleted file mode 100644
index 758b644..0000000
--- a/jaxrs/src/main/java/org/eclipse/jsonp/jaxrs/JsonValueBodyReader.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.jaxrs;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import jakarta.json.Json;
-import jakarta.json.JsonReader;
-import jakarta.json.JsonReaderFactory;
-import jakarta.json.JsonValue;
-import jakarta.ws.rs.Consumes;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.MultivaluedMap;
-import jakarta.ws.rs.ext.MessageBodyReader;
-import jakarta.ws.rs.ext.Provider;
-
-/**
- * Jakarta RESTful Web Services MessageBodyReader for JsonValue.
- * This allows JsonValue to be a parameter of a resource method.
- *
- * @author Jitendra Kotamraju
- * @author Blaise Doughan
- * @author Michal Gajdos
- */
-@Provider
-@Consumes({"application/json", "text/json", "*/*"})
-public class JsonValueBodyReader implements MessageBodyReader<JsonValue> {
-    private final JsonReaderFactory rf = Json.createReaderFactory(null);
-
-    private static final String JSON = "json";
-    private static final String PLUS_JSON = "+json";
-
-    @Override
-    public boolean isReadable(Class<?> aClass, Type type,
-            Annotation[] annotations, MediaType mediaType) {
-        return JsonValue.class.isAssignableFrom(aClass) && supportsMediaType(mediaType);
-    }
-
-    /**
-     * @return true for all media types of the pattern *&#47;json and
-     * *&#47;*+json.
-     */
-    private static boolean supportsMediaType(final MediaType mediaType) {
-        return mediaType.getSubtype().equals(JSON) || mediaType.getSubtype().endsWith(PLUS_JSON);
-    }
-
-    @Override
-    public JsonValue readFrom(Class<JsonValue> jsonValueClass,
-            Type type, Annotation[] annotations, MediaType mediaType,
-            MultivaluedMap<String, String> stringStringMultivaluedMap,
-            InputStream inputStream) throws IOException, WebApplicationException {
-        try (JsonReader reader = rf.createReader(inputStream)) {
-            return reader.readValue();
-        }
-    }
-}
diff --git a/jaxrs/src/main/java/org/eclipse/jsonp/jaxrs/JsonValueBodyWriter.java b/jaxrs/src/main/java/org/eclipse/jsonp/jaxrs/JsonValueBodyWriter.java
deleted file mode 100644
index 3fbaf5c..0000000
--- a/jaxrs/src/main/java/org/eclipse/jsonp/jaxrs/JsonValueBodyWriter.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.jaxrs;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.Map;
-import jakarta.annotation.PostConstruct;
-import jakarta.json.Json;
-import jakarta.json.JsonValue;
-import jakarta.json.JsonWriter;
-import jakarta.json.JsonWriterFactory;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.ws.rs.Produces;
-import jakarta.ws.rs.WebApplicationException;
-import jakarta.ws.rs.core.Configuration;
-import jakarta.ws.rs.core.Context;
-import jakarta.ws.rs.core.MediaType;
-import jakarta.ws.rs.core.MultivaluedMap;
-import jakarta.ws.rs.ext.MessageBodyWriter;
-import jakarta.ws.rs.ext.Provider;
-
-/**
- * Jakarta RESTful Web Services MessageBodyWriter for JsonValue.
- * This allows JsonValue to be return type of a resource method.
- *
- * @author Jitendra Kotamraju
- * @author Blaise Doughan
- * @author Michal Gajdos
- */
-@Provider
-@Produces({"application/json", "text/json", "*/*"})
-public class JsonValueBodyWriter implements MessageBodyWriter<JsonValue> {
-    private static final String JSON = "json";
-    private static final String PLUS_JSON = "+json";
-
-    private JsonWriterFactory wf = Json.createWriterFactory(null);
-
-    @Context
-    private Configuration config;
-
-    @PostConstruct
-    private void init() {
-        Map<String, Object> props = new HashMap<>();
-        if (config != null && config.getProperties().containsKey(JsonGenerator.PRETTY_PRINTING)) {
-            props.put(JsonGenerator.PRETTY_PRINTING, true);
-        }
-        wf = Json.createWriterFactory(props);
-    }
-
-    @Override
-    public boolean isWriteable(Class<?> aClass,
-            Type type, Annotation[] annotations, MediaType mediaType) {
-        return JsonValue.class.isAssignableFrom(aClass) && supportsMediaType(mediaType);
-    }
-
-    /**
-     * @return true for all media types of the pattern *&#47;json and
-     * *&#47;*+json.
-     */
-    private static boolean supportsMediaType(final MediaType mediaType) {
-        return mediaType.getSubtype().equals(JSON) || mediaType.getSubtype().endsWith(PLUS_JSON);
-    }
-
-    @Override
-    public long getSize(JsonValue jsonValue, Class<?> aClass,
-            Type type, Annotation[] annotations, MediaType mediaType) {
-
-        return -1;
-    }
-
-    @Override
-    public void writeTo(JsonValue jsonValue, Class<?> aClass, Type type,
-            Annotation[] annotations, MediaType mediaType,
-            MultivaluedMap<String, Object> stringObjectMultivaluedMap,
-            OutputStream outputStream) throws IOException, WebApplicationException {
-        try (JsonWriter writer = wf.createWriter(outputStream)) {
-            writer.write(jsonValue);
-        }
-    }
-}
diff --git a/pom.xml b/pom.xml
deleted file mode 100644
index 4a2131c..0000000
--- a/pom.xml
+++ /dev/null
@@ -1,502 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!--
-
-    Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.ee4j</groupId>
-        <artifactId>project</artifactId>
-        <version>1.0.6</version>
-    </parent>
-
-    <groupId>org.eclipse.jsonp</groupId>
-    <artifactId>json</artifactId>
-    <packaging>pom</packaging>
-    <version>2.0.2-SNAPSHOT</version>
-    <name>Jakarta JSON Processing</name>
-    <description>Jakarta JSON Processing defines a Java(R) based framework for parsing, generating, transforming, and querying JSON documents.</description>
-    <url>https://github.com/eclipse-ee4j/jsonp</url>
-
-    <scm>
-        <connection>scm:git:git://github.com/eclipse-ee4j/jsonp.git</connection>
-        <developerConnection>scm:git:git@github.com:eclipse-ee4j/jsonp.git</developerConnection>
-        <url>https://github.com/eclipse-ee4j/jsonp</url>
-        <tag>HEAD</tag>
-    </scm>
-
-    <licenses>
-        <license>
-            <name>Eclipse Public License 2.0</name>
-            <url>https://projects.eclipse.org/license/epl-2.0</url>
-            <distribution>repo</distribution>
-        </license>
-        <license>
-            <name>GNU General Public License, version 2 with the GNU Classpath Exception</name>
-            <url>https://projects.eclipse.org/license/secondary-gpl-2.0-cp</url>
-            <distribution>repo</distribution>
-        </license>
-    </licenses>
-
-    <developers>
-        <developer>
-            <id>m0mus</id>
-            <name>Dmitry Kornilov</name>
-            <organization>Oracle</organization>
-            <roles>
-                <role>project lead</role>
-            </roles>
-        </developer>
-        <developer>
-            <id>lukasj</id>
-            <name>Lukas Jungmann</name>
-            <organization>Oracle</organization>
-            <roles>
-                <role>dev lead</role>
-            </roles>
-        </developer>
-    </developers>
-
-    <properties>
-        <api_package>jakarta.json</api_package>
-        <impl_namespace>org.eclipse.jsonp</impl_namespace>
-        <spec_version>2.0</spec_version>
-        <new_spec_version>2.1</new_spec_version>
-        <new_spec_impl_version>2.1.0</new_spec_impl_version>
-        <impl_version>${project.version}</impl_version>
-        <new_impl_version>2.1.0</new_impl_version>
-        <non.final>false</non.final>
-        <legal.doc.source>${maven.multiModuleProjectDirectory}</legal.doc.source>
-        <config.dir>${project.root.location}/etc/config</config.dir>
-        <copyright.exclude>${config.dir}/copyright-exclude</copyright.exclude>
-        <copyright.templatefile>${config.dir}/copyright.txt</copyright.templatefile>
-        <copyright.ignoreyear>false</copyright.ignoreyear>
-        <copyright.scmonly>true</copyright.scmonly>
-        <copyright.update>false</copyright.update>
-        <spotbugs.exclude>${config.dir}/exclude.xml</spotbugs.exclude>
-        <spotbugs.skip>false</spotbugs.skip>
-        <spotbugs.threshold>Low</spotbugs.threshold>
-        <spotbugs.version>4.2.2</spotbugs.version>
-
-        <jakarta.json-api.version>2.0.1</jakarta.json-api.version>
-
-        <jakarta.annotation-api.version>2.0.0</jakarta.annotation-api.version>
-        <jakarta.xml.bind-api.version>3.0.1</jakarta.xml.bind-api.version>
-        <jakarta.ws.rs-api.version>3.0.0</jakarta.ws.rs-api.version>
-    </properties>
-
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-enforcer-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>enforce-maven</id>
-                        <goals>
-                            <goal>enforce</goal>
-                        </goals>
-                        <configuration>
-                            <rules>
-                                <requireJavaVersion>
-                                    <version>[11,)</version>
-                                </requireJavaVersion>
-                                <requireMavenVersion>
-                                    <version>[3.6.0,)</version>
-                                </requireMavenVersion>
-                            </rules>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.commonjava.maven.plugins</groupId>
-                <artifactId>directory-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>find-project-root</id>
-                        <phase>validate</phase>
-                        <goals>
-                            <goal>highest-basedir</goal>
-                        </goals>
-                        <configuration>
-                            <property>project.root.location</property>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>buildnumber-maven-plugin</artifactId>
-                <configuration>
-                    <getRevisionOnlyOnce>true</getRevisionOnlyOnce>
-                    <revisionOnScmFailure>false</revisionOnScmFailure>
-                    <shortRevisionLength>7</shortRevisionLength>
-                </configuration>
-                <executions>
-                    <execution>
-                        <phase>validate</phase>
-                        <goals>
-                            <goal>create</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-compiler-plugin</artifactId>
-                <configuration>
-                    <release>9</release>
-                    <compilerArgs>
-                        <arg>-Xlint:all</arg>
-                    </compilerArgs>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>base-compile</id>
-                        <goals>
-                            <goal>compile</goal>
-                        </goals>
-                        <configuration>
-                            <release>8</release>
-                            <excludes>
-                                <exclude>module-info.java</exclude>
-                            </excludes>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <!-- Requires validate target to initialize copyright.config.dir properly -->
-            <!-- e.g. mvn validate glassfish-copyright:repair -->
-            <plugin>
-                <groupId>org.glassfish.copyright</groupId>
-                <artifactId>glassfish-copyright-maven-plugin</artifactId>
-                <configuration>
-                    <templateFile>${copyright.templatefile}</templateFile>
-                    <excludeFile>${copyright.exclude}</excludeFile>
-                    <!-- skip files not under SCM-->
-                    <scmOnly>${copyright.scmonly}</scmOnly>
-                    <!-- for use with repair -->
-                    <update>${copyright.update}</update>
-                    <!-- check that year is correct -->
-                    <ignoreYear>${copyright.ignoreyear}</ignoreYear>
-                    <quiet>false</quiet>
-                </configuration>
-                <executions>
-                    <execution>
-                        <goals>
-                            <goal>check</goal>
-                        </goals>
-                        <phase>verify</phase>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.codehaus.mojo</groupId>
-                <artifactId>build-helper-maven-plugin</artifactId>
-                <executions>
-                    <execution>
-                        <id>add-legal-resource</id>
-                        <phase>generate-resources</phase>
-                        <goals>
-                            <goal>add-resource</goal>
-                        </goals>
-                        <configuration>
-                            <resources>
-                                <resource>
-                                    <directory>${legal.doc.source}</directory>
-                                    <includes>
-                                        <include>NOTICE.md</include>
-                                        <include>LICENSE.md</include>
-                                    </includes>
-                                    <targetPath>META-INF</targetPath>
-                                </resource>
-                            </resources>
-                        </configuration>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-source-plugin</artifactId>
-                <configuration>
-                    <archive>
-                        <manifest>
-                            <addDefaultEntries>false</addDefaultEntries>
-                            <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
-                        </manifest>
-                        <manifestEntries>
-                            <Implementation-Build-Id>${project.version} - ${buildNumber}</Implementation-Build-Id>
-                        </manifestEntries>
-                    </archive>
-                </configuration>
-                <executions>
-                    <execution>
-                        <id>attach-sources</id>
-                        <goals>
-                            <goal>jar-no-fork</goal>
-                        </goals>
-                    </execution>
-                </executions>
-            </plugin>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-release-plugin</artifactId>
-                <configuration>
-                    <mavenExecutorId>forked-path</mavenExecutorId>
-                    <useReleaseProfile>false</useReleaseProfile>
-                    <arguments>${release.arguments}</arguments>
-                </configuration>
-            </plugin>
-        </plugins>
-
-        <pluginManagement>
-            <plugins>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-enforcer-plugin</artifactId>
-                    <version>3.0.0-M3</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.commonjava.maven.plugins</groupId>
-                    <artifactId>directory-maven-plugin</artifactId>
-                    <version>0.3.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>buildnumber-maven-plugin</artifactId>
-                    <version>1.4</version>
-                </plugin>
-                <plugin>
-                    <groupId>com.github.spotbugs</groupId>
-                    <artifactId>spotbugs-maven-plugin</artifactId>
-                    <version>${spotbugs.version}</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.glassfish.build</groupId>
-                    <artifactId>spec-version-maven-plugin</artifactId>
-                    <version>2.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.glassfish.copyright</groupId>
-                    <artifactId>glassfish-copyright-maven-plugin</artifactId>
-                    <version>2.4</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.felix</groupId>
-                    <artifactId>maven-bundle-plugin</artifactId>
-                    <version>5.1.2</version>
-                    <configuration>
-                        <niceManifest>true</niceManifest>
-                        <instructions>
-                            <_noextraheaders>true</_noextraheaders>
-                        </instructions>
-                    </configuration>
-                </plugin>
-                <plugin>
-                    <groupId>org.codehaus.mojo</groupId>
-                    <artifactId>build-helper-maven-plugin</artifactId>
-                    <version>3.2.0</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-javadoc-plugin</artifactId>
-                    <version>3.2.0</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-source-plugin</artifactId>
-                    <version>3.2.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-compiler-plugin</artifactId>
-                    <version>3.8.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-jar-plugin</artifactId>
-                    <version>3.2.0</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-dependency-plugin</artifactId>
-                    <version>3.1.2</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-resources-plugin</artifactId>
-                    <version>3.2.0</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-clean-plugin</artifactId>
-                    <version>3.1.0</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-antrun-plugin</artifactId>
-                    <version>3.0.0</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-site-plugin</artifactId>
-                    <version>3.9.1</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-surefire-plugin</artifactId>
-                    <version>3.0.0-M5</version>
-                </plugin>
-                <plugin>
-                    <groupId>org.apache.maven.plugins</groupId>
-                    <artifactId>maven-assembly-plugin</artifactId>
-                    <version>3.3.0</version>
-                </plugin>
-            </plugins>
-        </pluginManagement>
-    </build>
-
-    <dependencyManagement>
-        <dependencies>
-            <dependency>
-                <groupId>jakarta.ws.rs</groupId>
-                <artifactId>jakarta.ws.rs-api</artifactId>
-                <version>${jakarta.ws.rs-api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>jakarta.annotation</groupId>
-                <artifactId>jakarta.annotation-api</artifactId>
-                <version>${jakarta.annotation-api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>jakarta.json</groupId>
-                <artifactId>jakarta.json-api</artifactId>
-                <version>${jakarta.json-api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jsonp</groupId>
-                <artifactId>jsonp</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jsonp</groupId>
-                <artifactId>jakarta.json</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>org.eclipse.jsonp</groupId>
-                <artifactId>jsonp-jaxrs</artifactId>
-                <version>${project.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>jakarta.xml.bind</groupId>
-                <artifactId>jakarta.xml.bind-api</artifactId>
-                <version>${jakarta.xml.bind-api.version}</version>
-            </dependency>
-            <dependency>
-                <groupId>junit</groupId>
-                <artifactId>junit</artifactId>
-                <version>4.13.2</version>
-            </dependency>
-            <dependency>
-                <groupId>org.hamcrest</groupId>
-                <artifactId>hamcrest-core</artifactId>
-                <version>1.3</version>
-                <scope>test</scope>
-            </dependency>
-        </dependencies>
-    </dependencyManagement>
-
-    <modules>
-        <module>impl</module>
-        <module>jaxrs</module>
-        <module>bundles</module>
-    </modules>
-
-    <profiles>
-        <profile>
-            <id>all</id>
-            <dependencyManagement>
-                <!-- dependencies used by demo projects only -->
-                <dependencies>
-                    <dependency>
-                        <groupId>jakarta.servlet</groupId>
-                        <artifactId>jakarta.servlet-api</artifactId>
-                        <version>5.0.0</version>
-                    </dependency>
-                    <dependency>
-                        <groupId>com.sun.xml.bind</groupId>
-                        <artifactId>jaxb-impl</artifactId>
-                        <version>3.0.0</version>
-                    </dependency>
-                </dependencies>
-            </dependencyManagement>
-
-            <modules>
-                <module>providers</module>
-                <module>demos</module>
-            </modules>
-
-            <build>
-                <pluginManagement>
-                    <plugins>
-                        <plugin>
-                            <groupId>org.apache.maven.plugins</groupId>
-                            <artifactId>maven-war-plugin</artifactId>
-                            <version>3.3.1</version>
-                            <configuration>
-                                <failOnMissingWebXml>false</failOnMissingWebXml>
-                            </configuration>
-                        </plugin>
-                        <plugin>
-                            <groupId>org.codehaus.mojo</groupId>
-                            <artifactId>wagon-maven-plugin</artifactId>
-                            <version>2.0.2</version>
-                        </plugin>
-                        <plugin>
-                            <groupId>org.codehaus.mojo</groupId>
-                            <artifactId>exec-maven-plugin</artifactId>
-                            <version>3.0.0</version>
-                        </plugin>
-                    </plugins>
-                </pluginManagement>
-            </build>
-        </profile>
-    </profiles>
-
-    <reporting>
-        <plugins>
-            <plugin>
-                <groupId>com.github.spotbugs</groupId>
-                <artifactId>spotbugs-maven-plugin</artifactId>
-                <configuration>
-                    <skip>${spotbugs.skip}</skip>
-                    <threshold>${spotbugs.threshold}</threshold>
-                    <findbugsXmlWithMessages>true</findbugsXmlWithMessages>
-                    <excludeFilterFile>
-                        ${spotbugs.exclude}
-                    </excludeFilterFile>
-                    <fork>true</fork>
-                </configuration>
-            </plugin>
-        </plugins>
-    </reporting>
-
-</project>
diff --git a/providers/customprovider/pom.xml b/providers/customprovider/pom.xml
deleted file mode 100644
index fd7e816..0000000
--- a/providers/customprovider/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-
-    Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>providers</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>war</packaging>
-    <url>http://maven.apache.org</url>
-    <artifactId>customprovider</artifactId>
-
-    <name>customprovider</name>
-
-    <build>
-        <finalName>customprovider</finalName>
-    </build>
-</project>
diff --git a/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestGenerator.java b/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestGenerator.java
deleted file mode 100644
index 4c7fb80..0000000
--- a/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestGenerator.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.customprovider;
-
-import jakarta.json.JsonException;
-import jakarta.json.JsonValue;
-import jakarta.json.stream.JsonGenerator;
-import java.io.IOException;
-import java.io.Writer;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class TestGenerator implements JsonGenerator {
-    private final Writer writer;
-
-    public TestGenerator(Writer writer) {
-        this.writer = writer;
-    }
-
-    @Override
-    public void flush() {
-    }
-
-    @Override
-    public JsonGenerator writeStartObject() {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeStartObject(String name) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, String fieldValue) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, int value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, long value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, double value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, BigInteger value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, BigDecimal value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, boolean value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeNull(String name) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(JsonValue value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray() {
-        try {
-            writer.write("[");
-        } catch(IOException ioe) {
-            throw new JsonException("I/O error", ioe);
-        }
-        return this;
-    }
-
-    @Override
-    public JsonGenerator writeStartArray(String name) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String name, JsonValue value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(String value) {
-        return null;
-    }
-
-
-    @Override
-    public JsonGenerator write(int value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(long value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(double value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(BigInteger value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(BigDecimal value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator write(boolean value) {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeNull() {
-        return null;
-    }
-
-    @Override
-    public JsonGenerator writeEnd() {
-        try {
-            writer.write("]");
-        } catch(IOException ioe) {
-            throw new JsonException("I/O error", ioe);
-        }
-        return this;
-    }
-
-    @Override
-    public void close() {
-        try {
-            writer.close();
-        } catch(IOException ioe) {
-            throw new JsonException("I/O error", ioe);
-        }
-    }
-
-    @Override
-    public JsonGenerator writeKey(String name) {
-        return null;
-    }
-
-}
diff --git a/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestProvider.java b/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestProvider.java
deleted file mode 100644
index b0c24d2..0000000
--- a/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestProvider.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.customprovider;
-
-import jakarta.json.*;
-import jakarta.json.spi.JsonProvider;
-import jakarta.json.stream.JsonGenerator;
-import jakarta.json.stream.JsonGeneratorFactory;
-import jakarta.json.stream.JsonParser;
-import jakarta.json.stream.JsonParserFactory;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.io.Writer;
-import java.util.Map;
-
-/**
- * @author Jitendra Kotamraju
- */
-public class TestProvider extends JsonProvider {
-
-    @Override
-    public JsonGenerator createGenerator(Writer writer) {
-        return new TestGenerator(writer);
-    }
-
-    @Override
-    public JsonGenerator createGenerator(OutputStream out) {
-        return null;
-    }
-
-    @Override
-    public JsonGeneratorFactory createGeneratorFactory(Map<String, ?> config) {
-        return null;
-    }
-
-    @Override
-    public JsonReader createReader(Reader reader) {
-        return null;
-    }
-
-    @Override
-    public JsonReader createReader(InputStream in) {
-        return null;
-    }
-
-    @Override
-    public JsonWriter createWriter(Writer writer) {
-        return null;
-    }
-
-    @Override
-    public JsonWriter createWriter(OutputStream out) {
-        return null;
-    }
-
-    @Override
-    public JsonWriterFactory createWriterFactory(Map<String, ?> config) {
-        return null;
-    }
-
-    @Override
-    public JsonReaderFactory createReaderFactory(Map<String, ?> config) {
-        return null;
-    }
-
-    @Override
-    public JsonObjectBuilder createObjectBuilder() {
-        return null;
-    }
-
-    @Override
-    public JsonArrayBuilder createArrayBuilder() {
-        return null;
-    }
-
-    @Override
-    public JsonBuilderFactory createBuilderFactory(Map<String, ?> config) {
-        return null;
-    }
-
-    @Override
-    public JsonParser createParser(Reader reader) {
-        return null;
-    }
-
-    @Override
-    public JsonParser createParser(InputStream in) {
-        return null;
-    }
-
-    @Override
-    public JsonParserFactory createParserFactory(Map<String, ?> config) {
-        return null;
-    }
-
-
-}
diff --git a/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestServlet.java b/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestServlet.java
deleted file mode 100644
index dca1451..0000000
--- a/providers/customprovider/src/main/java/org/eclipse/jsonp/customprovider/TestServlet.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.customprovider;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-
-import jakarta.servlet.ServletException;
-import jakarta.servlet.annotation.WebServlet;
-import jakarta.servlet.http.HttpServlet;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
-
-import jakarta.json.Json;
-import jakarta.json.stream.JsonGenerator;
-
-/**
- * @author Jitendra Kotamraju
- */
-@WebServlet("/json")
-public class TestServlet extends HttpServlet {
-
-    @Override
-    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException {
-        try {
-            res.setStatus(200);
-            res.setContentType("application/json");
-            OutputStream os = res.getOutputStream();
-            JsonGenerator generator = Json.createGenerator(new OutputStreamWriter(os));
-            if (!(generator instanceof TestGenerator)) {
-                throw new RuntimeException("MyGenerator is not picked up");
-            }
-            generator.writeStartArray().writeEnd();
-            generator.close();
-            os.close();
-        } catch (IOException ioe) {
-            throw new ServletException(ioe);
-        }
-    }
-
-}
diff --git a/providers/customprovider/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider b/providers/customprovider/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider
deleted file mode 100644
index f0c0203..0000000
--- a/providers/customprovider/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider
+++ /dev/null
@@ -1 +0,0 @@
-org.eclipse.jsonp.customprovider.TestProvider
diff --git a/providers/defaultprovider/pom.xml b/providers/defaultprovider/pom.xml
deleted file mode 100644
index f49a484..0000000
--- a/providers/defaultprovider/pom.xml
+++ /dev/null
@@ -1,38 +0,0 @@
-<!--
-
-    Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>providers</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>war</packaging>
-    <url>http://maven.apache.org</url>
-    <artifactId>defaultprovider</artifactId>
-
-    <name>defaultprovider</name>
-
-    <build>
-        <finalName>defaultprovider</finalName>
-    </build>
-</project>
diff --git a/providers/defaultprovider/src/main/java/org/eclipse/jsonp/defaultprovider/TestServlet.java b/providers/defaultprovider/src/main/java/org/eclipse/jsonp/defaultprovider/TestServlet.java
deleted file mode 100644
index a85bb6f..0000000
--- a/providers/defaultprovider/src/main/java/org/eclipse/jsonp/defaultprovider/TestServlet.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
- *
- * This program and the accompanying materials are made available under the
- * terms of the Eclipse Public License v. 2.0, which is available at
- * http://www.eclipse.org/legal/epl-2.0.
- *
- * This Source Code may also be made available under the following Secondary
- * Licenses when the conditions for such availability set forth in the
- * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
- * version 2 with the GNU Classpath Exception, which is available at
- * https://www.gnu.org/software/classpath/license.html.
- *
- * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
- */
-
-package org.eclipse.jsonp.defaultprovider;
-
-import jakarta.servlet.annotation.*;
-import jakarta.servlet.http.*;
-import jakarta.servlet.*;
-import java.io.IOException;
-import jakarta.json.*;
-import jakarta.json.stream.*;
-import java.io.*;
-
-/**
- * @author Jitendra Kotamraju
- */
-@WebServlet("/json")
-public class TestServlet extends HttpServlet {
-
-    @Override
-    public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException {
-        try {
-            res.setStatus(200);
-            res.setContentType("application/json");
-            OutputStream os = res.getOutputStream();
-            JsonGenerator generator = Json.createGenerator(os);
-            generator.writeStartArray().writeEnd();
-            generator.close();
-        } catch(IOException ioe) {
-            throw new ServletException(ioe);
-        }
-    }
-
-}
diff --git a/providers/pom.xml b/providers/pom.xml
deleted file mode 100644
index 7446d9b..0000000
--- a/providers/pom.xml
+++ /dev/null
@@ -1,59 +0,0 @@
-<!--
-
-    Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
-
-    This program and the accompanying materials are made available under the
-    terms of the Eclipse Public License v. 2.0, which is available at
-    http://www.eclipse.org/legal/epl-2.0.
-
-    This Source Code may also be made available under the following Secondary
-    Licenses when the conditions for such availability set forth in the
-    Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
-    version 2 with the GNU Classpath Exception, which is available at
-    https://www.gnu.org/software/classpath/license.html.
-
-    SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
-
--->
-
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
-    <modelVersion>4.0.0</modelVersion>
-
-    <parent>
-        <groupId>org.eclipse.jsonp</groupId>
-        <artifactId>json</artifactId>
-        <version>2.0.2-SNAPSHOT</version>
-        <relativePath>../pom.xml</relativePath>
-    </parent>
-
-    <packaging>pom</packaging>
-    <url>http://maven.apache.org</url>
-    <groupId>org.eclipse.jsonp</groupId>
-    <artifactId>providers</artifactId>
-
-    <dependencies>
-        <dependency>
-            <groupId>jakarta.servlet</groupId>
-            <artifactId>jakarta.servlet-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-        <dependency>
-            <groupId>jakarta.json</groupId>
-            <artifactId>jakarta.json-api</artifactId>
-            <scope>provided</scope>
-        </dependency>
-    </dependencies>
-    <build>
-        <plugins>
-            <plugin>
-                <groupId>org.apache.maven.plugins</groupId>
-                <artifactId>maven-war-plugin</artifactId>
-            </plugin>
-        </plugins>
-        <finalName>customprovider</finalName>
-    </build>
-    <modules>
-        <module>customprovider</module>
-        <module>defaultprovider</module>
-    </modules>
-</project>