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>
