diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/JSONP_Data.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/JSONP_Data.java
similarity index 99%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/common/JSONP_Data.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/JSONP_Data.java
index e7da0b1..3a9887d 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/JSONP_Data.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/JSONP_Data.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.common;
+package ee.jakarta.tck.jsonp.common;
 
 
 import java.util.*;
diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/JSONP_Util.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/JSONP_Util.java
similarity index 99%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/common/JSONP_Util.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/JSONP_Util.java
index 0239f59..45679d2 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/JSONP_Util.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/JSONP_Util.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.common;
+package ee.jakarta.tck.jsonp.common;
 
 
 import java.util.*;
@@ -52,7 +52,7 @@
   public static final Charset UTF_32LE = Charset.forName("UTF-32LE");
 
   // Test Config properties
-  public static final String FOO_CONFIG = "jakarta.jsonp.tck.common.FOO_CONFIG";
+  public static final String FOO_CONFIG = "ee.jakarta.tck.jsonp.common.FOO_CONFIG";
 
   // Number of parser errors encountered
   private static int parseErrs = 0;
diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedInputStream.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedInputStream.java
similarity index 98%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedInputStream.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedInputStream.java
index 7a258fd..883dc6f 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedInputStream.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedInputStream.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.common;
+package ee.jakarta.tck.jsonp.common;
 
 
 import java.io.*;
diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedReader.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedReader.java
similarity index 98%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedReader.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedReader.java
index bb9e3ae..61a9305 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedReader.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedReader.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.common;
+package ee.jakarta.tck.jsonp.common;
 
 
 import java.io.*;
diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedWriter.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedWriter.java
similarity index 98%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedWriter.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedWriter.java
index d507bcc..7ef87c8 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyBufferedWriter.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyBufferedWriter.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.common;
+package ee.jakarta.tck.jsonp.common;
 
 
 import java.io.*;
diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyJsonLocation.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyJsonLocation.java
similarity index 97%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyJsonLocation.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyJsonLocation.java
index 4882ac7..1838785 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/common/MyJsonLocation.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/common/MyJsonLocation.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.common;
+package ee.jakarta.tck.jsonp.common;
 
 
 import jakarta.json.stream.JsonLocation;
diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/util/FileUTFConverter.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/FileUTFConverter.java
similarity index 98%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/util/FileUTFConverter.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/FileUTFConverter.java
index 8d0497e..99d5926 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/util/FileUTFConverter.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/FileUTFConverter.java
@@ -46,7 +46,7 @@
  * UTF-32LE
  */
 
-package jakarta.jsonp.tck.util;
+package ee.jakarta.tck.jsonp.util;
 
 import java.io.*;
 import java.util.logging.Logger;
diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/util/MyEncoder.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/MyEncoder.java
similarity index 98%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/util/MyEncoder.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/MyEncoder.java
index 1d55f4c..e51d9d1 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/util/MyEncoder.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/MyEncoder.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.util;
+package ee.jakarta.tck.jsonp.util;
 
 import java.io.*;
 import java.util.logging.Logger;
diff --git a/tck/tck-common/src/main/java/jakarta/jsonp/tck/util/StringUTFConverter.java b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/StringUTFConverter.java
similarity index 97%
rename from tck/tck-common/src/main/java/jakarta/jsonp/tck/util/StringUTFConverter.java
rename to tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/StringUTFConverter.java
index fb3475c..4360a1c 100644
--- a/tck/tck-common/src/main/java/jakarta/jsonp/tck/util/StringUTFConverter.java
+++ b/tck/tck-common/src/main/java/ee/jakarta/tck/jsonp/util/StringUTFConverter.java
@@ -31,7 +31,7 @@
  * output file (fooUTF16LE).
  */
 
-package jakarta.jsonp.tck.util;
+package ee.jakarta.tck.jsonp.util;
 
 import java.io.*;
 import java.util.logging.Logger;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/pluggability/jsonprovidertests/ClientTests.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/pluggability/jsonprovidertests/ClientTests.java
similarity index 98%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/pluggability/jsonprovidertests/ClientTests.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/pluggability/jsonprovidertests/ClientTests.java
index fbd4a82..7ab0ffc 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/pluggability/jsonprovidertests/ClientTests.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/pluggability/jsonprovidertests/ClientTests.java
@@ -17,8 +17,9 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.pluggability.jsonprovidertests;
+package ee.jakarta.tck.jsonp.pluggability.jsonprovidertests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.Json;
 import jakarta.json.JsonArrayBuilder;
 import jakarta.json.JsonBuilderFactory;
@@ -33,9 +34,8 @@
 import jakarta.json.stream.JsonGeneratorFactory;
 import jakarta.json.stream.JsonParser;
 import jakarta.json.stream.JsonParserFactory;
-import jakarta.jsonp.tck.common.JSONP_Util;
-import jakarta.jsonp.tck.provider.MyJsonGenerator;
-import jakarta.jsonp.tck.provider.MyJsonProvider;
+import ee.jakarta.tck.jsonp.provider.MyJsonGenerator;
+import ee.jakarta.tck.jsonp.provider.MyJsonProvider;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
 
@@ -55,7 +55,7 @@
 
 public class ClientTests {
 
-  private static final String MY_JSONPROVIDER_CLASS = "jakarta.jsonp.tck.provider.MyJsonProvider";
+  private static final String MY_JSONPROVIDER_CLASS = "MyJsonProvider";
   private static final Logger LOGGER = Logger.getLogger(ClientTests.class.getName());
 
   private String providerPath = null;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonGenerator.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonGenerator.java
similarity index 99%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonGenerator.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonGenerator.java
index d7407c6..65a3792 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonGenerator.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonGenerator.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 import java.io.*;
 import java.math.BigDecimal;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonGeneratorFactory.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonGeneratorFactory.java
similarity index 98%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonGeneratorFactory.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonGeneratorFactory.java
index 3392f2e..ae50022 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonGeneratorFactory.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonGeneratorFactory.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 import jakarta.json.stream.*;
 import java.io.*;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonParser.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonParser.java
similarity index 98%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonParser.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonParser.java
index 9d1c02d..cc474ba 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonParser.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonParser.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 
 import jakarta.json.stream.*;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonParserFactory.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonParserFactory.java
similarity index 98%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonParserFactory.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonParserFactory.java
index 44da00b..c057ea6 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonParserFactory.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonParserFactory.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 import jakarta.json.*;
 import jakarta.json.stream.*;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonProvider.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonProvider.java
similarity index 99%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonProvider.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonProvider.java
index 1e303b0..ef92afd 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonProvider.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonProvider.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 import java.io.*;
 import java.util.*;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonReader.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonReader.java
similarity index 93%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonReader.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonReader.java
index f397d94..472593b 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonReader.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonReader.java
@@ -18,14 +18,11 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 import jakarta.json.*;
-import jakarta.json.stream.*;
-import jakarta.json.spi.JsonProvider;
+
 import java.io.*;
-import java.nio.charset.Charset;
-import java.util.*;
 import java.util.logging.Logger;
 
 /*
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonReaderFactory.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonReaderFactory.java
similarity index 98%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonReaderFactory.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonReaderFactory.java
index ca6e6ab..a1f15da 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonReaderFactory.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonReaderFactory.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 import jakarta.json.*;
 import java.io.*;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonWriter.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonWriter.java
similarity index 98%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonWriter.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonWriter.java
index 44640bb..b569cea 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonWriter.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonWriter.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 import jakarta.json.*;
 import java.io.*;
diff --git a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonWriterFactory.java b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonWriterFactory.java
similarity index 98%
rename from tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonWriterFactory.java
rename to tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonWriterFactory.java
index 1ab07af..b0eb6a5 100644
--- a/tck/tck-tests-pluggability/src/main/java/jakarta/jsonp/tck/provider/MyJsonWriterFactory.java
+++ b/tck/tck-tests-pluggability/src/main/java/ee/jakarta/tck/jsonp/provider/MyJsonWriterFactory.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.provider;
+package ee.jakarta.tck.jsonp.provider;
 
 
 import jakarta.json.*;
diff --git a/tck/tck-tests-pluggability/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider b/tck/tck-tests-pluggability/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider
index 997ae9a..348b4e8 100644
--- a/tck/tck-tests-pluggability/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider
+++ b/tck/tck-tests-pluggability/src/main/resources/META-INF/services/jakarta.json.spi.JsonProvider
@@ -1 +1 @@
-jakarta.jsonp.tck.provider.MyJsonProvider
+ee.jakarta.tck.jsonp.provider.MyJsonProvider
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/collectortests/CollectorTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/collectortests/CollectorTests.java
similarity index 93%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/collectortests/CollectorTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/collectortests/CollectorTests.java
index 08d73e4..b456c29 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/collectortests/CollectorTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/collectortests/CollectorTests.java
@@ -14,9 +14,9 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.collectortests;
+package ee.jakarta.tck.jsonp.api.collectortests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import org.junit.jupiter.api.Test;
 import org.opentest4j.AssertionFailedError;
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/collectortests/Collectors.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/collectortests/Collectors.java
similarity index 89%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/collectortests/Collectors.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/collectortests/Collectors.java
index e0993fd..2ce5cfa 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/collectortests/Collectors.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/collectortests/Collectors.java
@@ -14,9 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.collectortests;
+package ee.jakarta.tck.jsonp.api.collectortests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.Map;
@@ -33,9 +36,6 @@
 import jakarta.json.stream.JsonCollectors;
 import jakarta.json.stream.JsonParser;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) Pointer compatibility tests.<br>
@@ -50,18 +50,18 @@
 
   /** Tests input data with JsonArray instances. */
   private static final JsonArray[] ARRAY_VALUES = new JsonArray[] {
-      createSimpleStringArray5(), // JsonArray with String
-      createSimpleIntArray5(), // JsonArray with int
-      createSimpleBoolArray5(), // JsonArray with boolean
-      createSimpleObjectArray5() // JsonArray with JsonObject
+      SimpleValues.createSimpleStringArray5(), // JsonArray with String
+      SimpleValues.createSimpleIntArray5(), // JsonArray with int
+      SimpleValues.createSimpleBoolArray5(), // JsonArray with boolean
+      SimpleValues.createSimpleObjectArray5() // JsonArray with JsonObject
   };
 
   /** Tests input data with JsonArray instances. */
   private static final JsonObject[] OBJ_VALUES = new JsonObject[] {
-      createSimpleObjectWithStr(), // JsonObject with String
-      createSimpleObjectWithInt(), // JsonObject with int
-      createSimpleObjectWithBool(), // JsonObject with boolean
-      createCompoundObject() // JsonObject with JsonObject
+      SimpleValues.createSimpleObjectWithStr(), // JsonObject with String
+      SimpleValues.createSimpleObjectWithInt(), // JsonObject with int
+      SimpleValues.createSimpleObjectWithBool(), // JsonObject with boolean
+      SimpleValues.createCompoundObject() // JsonObject with JsonObject
   };
 
   /** Test input data for {@code groupingBy} methods. */
@@ -116,14 +116,14 @@
   private void testToJsonArrayCollector(final TestResult result) {
     LOGGER.info(" - Collector returned by toJsonArray()");
     for (final JsonArray in : ARRAY_VALUES) {
-      LOGGER.info("   - Input: " + valueToString(in));
+      LOGGER.info("   - Input: " + JsonAssert.valueToString(in));
       final Collector<JsonValue, JsonArrayBuilder, JsonArray> col = JsonCollectors
           .toJsonArray();
       final JsonArray out = in.getValuesAs(JsonObject.class).stream()
           .collect(col);
       if (operationFailed(in, out)) {
-        result.fail("toJsonArray()", "Output Stream value " + valueToString(out)
-            + " shall be " + valueToString(in));
+        result.fail("toJsonArray()", "Output Stream value " + JsonAssert.valueToString(out)
+            + " shall be " + JsonAssert.valueToString(in));
       }
     }
   }
@@ -171,19 +171,19 @@
   private void testToJsonObjectCollector(final TestResult result) {
     LOGGER.info(" - Collector returned by toJsonObject(Function,Function)");
     final JsonArray in = Json.createArrayBuilder()
-        .add(Json.createObjectBuilder().add("key", STR_NAME).add("value",
-            STR_VALUE))
-        .add(Json.createObjectBuilder().add("key", INT_NAME).add("value",
-            INT_VALUE))
-        .add(Json.createObjectBuilder().add("key", BOOL_NAME).add("value",
-            BOOL_VALUE))
-        .add(Json.createObjectBuilder().add("key", OBJ_NAME).add("value",
-            OBJ_VALUE))
+        .add(Json.createObjectBuilder().add("key", SimpleValues.STR_NAME).add("value",
+            SimpleValues.STR_VALUE))
+        .add(Json.createObjectBuilder().add("key", SimpleValues.INT_NAME).add("value",
+            SimpleValues.INT_VALUE))
+        .add(Json.createObjectBuilder().add("key", SimpleValues.BOOL_NAME).add("value",
+            SimpleValues.BOOL_VALUE))
+        .add(Json.createObjectBuilder().add("key", SimpleValues.OBJ_NAME).add("value",
+            SimpleValues.OBJ_VALUE))
         .build();
-    final JsonObject check = Json.createObjectBuilder().add(STR_NAME, STR_VALUE)
-        .add(INT_NAME, INT_VALUE).add(BOOL_NAME, BOOL_VALUE)
-        .add(OBJ_NAME, OBJ_VALUE).build();
-    LOGGER.info("     Input: " + valueToString(in));
+    final JsonObject check = Json.createObjectBuilder().add(SimpleValues.STR_NAME, SimpleValues.STR_VALUE)
+        .add(SimpleValues.INT_NAME, SimpleValues.INT_VALUE).add(SimpleValues.BOOL_NAME, SimpleValues.BOOL_VALUE)
+        .add(SimpleValues.OBJ_NAME, SimpleValues.OBJ_VALUE).build();
+    LOGGER.info("     Input: " + JsonAssert.valueToString(in));
     final Collector<JsonValue, JsonObjectBuilder, JsonObject> col = JsonCollectors
         .toJsonObject(
             // Build key from stream value.
@@ -202,7 +202,7 @@
         .collect(col);
     if (operationFailed(out, check)) {
       result.fail("toJsonObject(Function,Function)", "Output Stream value "
-          + valueToString(out) + " shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -245,7 +245,7 @@
                     .add("office", "Green"))
                 .build())
         .build();
-    LOGGER.info("     Input: " + valueToString(OBJ_ARRAY_GROUP));
+    LOGGER.info("     Input: " + JsonAssert.valueToString(OBJ_ARRAY_GROUP));
     final Collector<JsonValue, Map<String, JsonArrayBuilder>, JsonObject> col = JsonCollectors
         .groupingBy((JsonValue v) -> {
           if (v.getValueType() == JsonValue.ValueType.OBJECT)
@@ -256,7 +256,7 @@
         .stream().collect(col);
     if (operationFailed(out, check)) {
       result.fail("groupingBy(Function)", "Output Stream value "
-          + valueToString(out) + " shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -486,7 +486,7 @@
     Collector<JsonValue, JsonArrayBuilder, JsonArray> toArray = Collector.of(
         ValueBuilder::new, JsonArrayBuilder::add, JsonArrayBuilder::addAll,
         JsonArrayBuilder::build);
-    LOGGER.info("     Input: " + valueToString(OBJ_ARRAY_GROUP));
+    LOGGER.info("     Input: " + JsonAssert.valueToString(OBJ_ARRAY_GROUP));
     final Collector<JsonValue, Map<String, JsonArrayBuilder>, JsonObject> col = JsonCollectors
         .groupingBy((JsonValue v) -> {
           if (v.getValueType() == JsonValue.ValueType.OBJECT)
@@ -497,7 +497,7 @@
         .stream().collect(col);
     if (operationFailed(out, check)) {
       result.fail("groupingBy(Function,Collector)", "Output Stream value "
-          + valueToString(out) + " shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -513,8 +513,8 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    LOGGER.info("     Checking " + valueToString(out));
-    return out == null || !assertEquals(check, out);
+    LOGGER.info("     Checking " + JsonAssert.valueToString(out));
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/ArrayBuilder.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/ArrayBuilder.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/ArrayBuilder.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/ArrayBuilder.java
index 63abcfe..0105ca0 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/ArrayBuilder.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/ArrayBuilder.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonAssert.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonAssert.java
similarity index 91%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonAssert.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonAssert.java
index 4eefdde..2564824 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonAssert.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonAssert.java
@@ -14,13 +14,14 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import java.io.StringReader;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.logging.Logger;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonNumber;
@@ -29,9 +30,6 @@
 import jakarta.json.JsonString;
 import jakarta.json.JsonValue;
 
-import static jakarta.jsonp.tck.common.JSONP_Util.toStringJsonArray;
-import static jakarta.jsonp.tck.common.JSONP_Util.toStringJsonObject;
-
 // $Id$
 /**
  * JSON values assertions.
@@ -46,8 +44,8 @@
       return true;
     } else {
       LOGGER.info("   " + message);
-      LOGGER.info("     Expected: " + toStringJsonObject(expected));
-      LOGGER.info("     Actual:   " + toStringJsonObject(actual));
+      LOGGER.info("     Expected: " + JSONP_Util.toStringJsonObject(expected));
+      LOGGER.info("     Actual:   " + JSONP_Util.toStringJsonObject(actual));
       return false;
     }
   }
@@ -58,8 +56,8 @@
       return true;
     } else {
       LOGGER.info("   " + message);
-      LOGGER.info("     Expected: " + toStringJsonArray(expected));
-      LOGGER.info("     Actual:   " + toStringJsonArray(actual));
+      LOGGER.info("     Expected: " + JSONP_Util.toStringJsonArray(expected));
+      LOGGER.info("     Actual:   " + JSONP_Util.toStringJsonArray(actual));
       return false;
     }
   }
@@ -189,9 +187,9 @@
   public static String valueToString(final JsonValue value) {
     switch (value.getValueType()) {
     case OBJECT:
-      return toStringJsonObject((JsonObject) value);
+      return JSONP_Util.toStringJsonObject((JsonObject) value);
     case ARRAY:
-      return toStringJsonArray((JsonArray) value);
+      return JSONP_Util.toStringJsonArray((JsonArray) value);
     case STRING:
       return ((JsonString) value).getString();
     case NUMBER:
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonIO.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonIO.java
similarity index 96%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonIO.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonIO.java
index 1261a5e..77d6022 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonIO.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonIO.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import java.io.StringReader;
 import jakarta.json.Json;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonValueType.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonValueType.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonValueType.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonValueType.java
index f8da982..65f403a 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/JsonValueType.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/JsonValueType.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/MergeRFCObject.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/MergeRFCObject.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/MergeRFCObject.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/MergeRFCObject.java
index 54b6279..ea479c5 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/MergeRFCObject.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/MergeRFCObject.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/ObjectBuilder.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/ObjectBuilder.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/ObjectBuilder.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/ObjectBuilder.java
index e31f468..2e718bd 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/ObjectBuilder.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/ObjectBuilder.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import java.math.BigDecimal;
 import java.math.BigInteger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/PointerRFCObject.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/PointerRFCObject.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/PointerRFCObject.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/PointerRFCObject.java
index b648d3c..91482de 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/PointerRFCObject.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/PointerRFCObject.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/SimpleValues.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/SimpleValues.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/SimpleValues.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/SimpleValues.java
index 326cdcf..089011f 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/SimpleValues.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/SimpleValues.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import java.io.StringWriter;
 import java.math.BigDecimal;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/TestFail.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/TestFail.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/TestFail.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/TestFail.java
index 630c286..cdc6eac 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/TestFail.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/TestFail.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 /**
  * Test failure notification.
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/TestResult.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/TestResult.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/TestResult.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/TestResult.java
index a883085..32c1b9c 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/common/TestResult.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/common/TestResult.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.common;
+package ee.jakarta.tck.jsonp.api.common;
 
 import org.opentest4j.AssertionFailedError;
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/exceptiontests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/exceptiontests/ClientTests.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/exceptiontests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/exceptiontests/ClientTests.java
index e4e8b7f..ff4f13f 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/exceptiontests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/exceptiontests/ClientTests.java
@@ -17,12 +17,13 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.exceptiontests;
+package ee.jakarta.tck.jsonp.api.exceptiontests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
+import ee.jakarta.tck.jsonp.common.MyJsonLocation;
 import jakarta.json.*;
 import jakarta.json.stream.*;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import java.util.logging.Logger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildAdd.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildAdd.java
similarity index 77%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildAdd.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildAdd.java
index be7439c..dabda75 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildAdd.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildAdd.java
@@ -14,12 +14,14 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonarraytests;
+package ee.jakarta.tck.jsonp.api.jsonarraytests;
 
-import jakarta.jsonp.tck.api.common.ArrayBuilder;
-import jakarta.jsonp.tck.api.common.JsonIO;
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.ArrayBuilder;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.JsonIO;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonArrayBuilder;
@@ -29,9 +31,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests:
@@ -85,14 +84,14 @@
    *          Test suite result.
    */
   private void testAdd(final TestResult result) {
-    final Object[] values = new Object[] { OBJ_VALUE, // add(int,JsonValue)
-        STR_VALUE, // add(int,String)
-        INT_VALUE, // add(int,int)
-        LNG_VALUE, // add(int,long)
-        DBL_VALUE, // add(int,double)
-        BIN_VALUE, // add(int,BigInteger)
-        BDC_VALUE, // add(int,BigDecimal)
-        BOOL_VALUE // add(int,boolean)
+    final Object[] values = new Object[] { SimpleValues.OBJ_VALUE, // add(int,JsonValue)
+        SimpleValues.STR_VALUE, // add(int,String)
+        SimpleValues.INT_VALUE, // add(int,int)
+        SimpleValues.LNG_VALUE, // add(int,long)
+        SimpleValues.DBL_VALUE, // add(int,double)
+        SimpleValues.BIN_VALUE, // add(int,BigInteger)
+        SimpleValues.BDC_VALUE, // add(int,BigDecimal)
+        SimpleValues.BOOL_VALUE // add(int,boolean)
     };
     for (Object value : values) {
       final String typeName = JsonValueType.getType(value).name();
@@ -103,7 +102,7 @@
       final JsonValue out = builder.build();
       if (operationFailed(check, out)) {
         result.fail("add(" + typeName + ")", "Builder output "
-            + valueToString(out) + " value shall be " + valueToString(check));
+            + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
       }
     }
   }
@@ -117,14 +116,14 @@
    *          Test suite result.
    */
   private void testAddOutOfBounds(final TestResult result) {
-    final Object[] values = new Object[] { OBJ_VALUE, // add(int,JsonValue)
-        STR_VALUE, // add(int,String)
-        INT_VALUE, // add(int,int)
-        LNG_VALUE, // add(int,long)
-        DBL_VALUE, // add(int,double)
-        BIN_VALUE, // add(int,BigInteger)
-        BDC_VALUE, // add(int,BigDecimal)
-        BOOL_VALUE // add(int,boolean)
+    final Object[] values = new Object[] { SimpleValues.OBJ_VALUE, // add(int,JsonValue)
+        SimpleValues.STR_VALUE, // add(int,String)
+        SimpleValues.INT_VALUE, // add(int,int)
+        SimpleValues.LNG_VALUE, // add(int,long)
+        SimpleValues.DBL_VALUE, // add(int,double)
+        SimpleValues.BIN_VALUE, // add(int,BigInteger)
+        SimpleValues.BDC_VALUE, // add(int,BigDecimal)
+        SimpleValues.BOOL_VALUE // add(int,boolean)
     };
     final int[] indexes = new int[] { -1, 2, 3 };
     for (Object value : values) {
@@ -197,8 +196,8 @@
     final JsonArrayBuilder builder = createArrayBuilder(0, value);
     final JsonValue out = builder.build();
     if (operationFailed(check, out)) {
-      result.fail("addNull(int)", "Builder output " + valueToString(out)
-          + " value shall be " + valueToString(check));
+      result.fail("addNull(int)", "Builder output " + JsonAssert.valueToString(out)
+          + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -242,23 +241,23 @@
   private void testAddArrayBuilder(final TestResult result) {
     LOGGER.info(" - add(int,JsonArrayBuilder)");
     final JsonValue checkBeg = JsonIO
-        .read("[[" + JsonValueType.toStringValue(STR_VALUE_1) + ","
-            + JsonValueType.toStringValue(STR_VALUE_2) + ","
-            + JsonValueType.toStringValue(STR_VALUE_3) + ","
-            + JsonValueType.toStringValue(STR_VALUE_4) + "],"
-            + JsonValueType.toStringValue(STR_VALUE_5) + "]");
+        .read("[[" + JsonValueType.toStringValue(SimpleValues.STR_VALUE_1) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_2) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_3) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_4) + "],"
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_5) + "]");
     final JsonValue checkEnd = JsonIO
-        .read("[" + JsonValueType.toStringValue(STR_VALUE_1) + ",["
-            + JsonValueType.toStringValue(STR_VALUE_2) + ","
-            + JsonValueType.toStringValue(STR_VALUE_3) + ","
-            + JsonValueType.toStringValue(STR_VALUE_4) + ","
-            + JsonValueType.toStringValue(STR_VALUE_5) + "]]");
-    final JsonArrayBuilder inBeg = createArrayBuilder(STR_VALUE_5);
-    final JsonArrayBuilder inEnd = createArrayBuilder(STR_VALUE_1);
-    final JsonArrayBuilder argBeg = createArrayBuilder(STR_VALUE_1)
-        .add(STR_VALUE_2).add(STR_VALUE_3).add(STR_VALUE_4);
-    final JsonArrayBuilder argEnd = createArrayBuilder(STR_VALUE_2)
-        .add(STR_VALUE_3).add(STR_VALUE_4).add(STR_VALUE_5);
+        .read("[" + JsonValueType.toStringValue(SimpleValues.STR_VALUE_1) + ",["
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_2) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_3) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_4) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_5) + "]]");
+    final JsonArrayBuilder inBeg = createArrayBuilder(SimpleValues.STR_VALUE_5);
+    final JsonArrayBuilder inEnd = createArrayBuilder(SimpleValues.STR_VALUE_1);
+    final JsonArrayBuilder argBeg = createArrayBuilder(SimpleValues.STR_VALUE_1)
+        .add(SimpleValues.STR_VALUE_2).add(SimpleValues.STR_VALUE_3).add(SimpleValues.STR_VALUE_4);
+    final JsonArrayBuilder argEnd = createArrayBuilder(SimpleValues.STR_VALUE_2)
+        .add(SimpleValues.STR_VALUE_3).add(SimpleValues.STR_VALUE_4).add(SimpleValues.STR_VALUE_5);
     verifyAddBuilder(result, checkBeg, 0, argBeg, inBeg);
     verifyAddBuilder(result, checkEnd, 1, argEnd, inEnd);
   }
@@ -272,7 +271,7 @@
    */
   private void testAddArrayBuilderNull(final TestResult result) {
     LOGGER.info(" - add(int,(JsonArrayBuilder)null)");
-    final JsonArrayBuilder in = createArrayBuilder(DEF_VALUE);
+    final JsonArrayBuilder in = createArrayBuilder(SimpleValues.DEF_VALUE);
     final JsonArrayBuilder arg = null;
     try {
       in.add(0, arg);
@@ -298,9 +297,9 @@
   private void testAddArrayBuilderOutOfBounds(final TestResult result) {
     LOGGER.info(" - add(int,JsonArrayBuilder)");
     final int[] indexes = new int[] { -1, 5, 6 };
-    final JsonArrayBuilder in = createArrayBuilder(STR_VALUE_1).add(STR_VALUE_2)
-        .add(STR_VALUE_3).add(STR_VALUE_4);
-    final JsonArrayBuilder arg = createArrayBuilder(STR_VALUE_5);
+    final JsonArrayBuilder in = createArrayBuilder(SimpleValues.STR_VALUE_1).add(SimpleValues.STR_VALUE_2)
+        .add(SimpleValues.STR_VALUE_3).add(SimpleValues.STR_VALUE_4);
+    final JsonArrayBuilder arg = createArrayBuilder(SimpleValues.STR_VALUE_5);
     for (int index : indexes) {
       try {
         // Add value on out of bounds index
@@ -330,19 +329,19 @@
   private void testAddObjectBuilder(final TestResult result) {
     LOGGER.info(" - add(int,JsonObjectBuilder)");
     final JsonValue checkBeg = JsonIO
-        .read("[{" + JsonValueType.toStringValue(STR_NAME) + ":"
-            + JsonValueType.toStringValue(STR_VALUE) + "},"
-            + JsonValueType.toStringValue(STR_VALUE_1) + "]");
+        .read("[{" + JsonValueType.toStringValue(SimpleValues.STR_NAME) + ":"
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE) + "},"
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_1) + "]");
     final JsonValue checkEnd = JsonIO
-        .read("[" + JsonValueType.toStringValue(STR_VALUE_1) + ",{"
-            + JsonValueType.toStringValue(STR_NAME) + ":"
-            + JsonValueType.toStringValue(STR_VALUE) + "}]");
-    final JsonArrayBuilder inBeg = createArrayBuilder(STR_VALUE_1);
-    final JsonArrayBuilder inEnd = createArrayBuilder(STR_VALUE_1);
-    final JsonObjectBuilder argBeg = Json.createObjectBuilder().add(STR_NAME,
-        STR_VALUE);
-    final JsonObjectBuilder argEnd = Json.createObjectBuilder().add(STR_NAME,
-        STR_VALUE);
+        .read("[" + JsonValueType.toStringValue(SimpleValues.STR_VALUE_1) + ",{"
+            + JsonValueType.toStringValue(SimpleValues.STR_NAME) + ":"
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE) + "}]");
+    final JsonArrayBuilder inBeg = createArrayBuilder(SimpleValues.STR_VALUE_1);
+    final JsonArrayBuilder inEnd = createArrayBuilder(SimpleValues.STR_VALUE_1);
+    final JsonObjectBuilder argBeg = Json.createObjectBuilder().add(SimpleValues.STR_NAME,
+        SimpleValues.STR_VALUE);
+    final JsonObjectBuilder argEnd = Json.createObjectBuilder().add(SimpleValues.STR_NAME,
+        SimpleValues.STR_VALUE);
     verifyAddBuilder(result, checkBeg, 0, argBeg, inBeg);
     verifyAddBuilder(result, checkEnd, 1, argEnd, inEnd);
   }
@@ -356,7 +355,7 @@
    */
   private void testAddObjectBuilderNull(final TestResult result) {
     LOGGER.info(" - add(int,(JsonObjectBuilder)null)");
-    final JsonArrayBuilder in = createArrayBuilder(DEF_VALUE);
+    final JsonArrayBuilder in = createArrayBuilder(SimpleValues.DEF_VALUE);
     final JsonObjectBuilder arg = null;
     try {
       in.add(0, arg);
@@ -382,10 +381,10 @@
   private void testAddObjectBuilderOutOfBounds(final TestResult result) {
     LOGGER.info(" - add(int,JsonObjectBuilder)");
     final int[] indexes = new int[] { -1, 5, 6 };
-    final JsonArrayBuilder in = createArrayBuilder(STR_VALUE_1).add(STR_VALUE_2)
-        .add(STR_VALUE_3).add(STR_VALUE_4);
-    final JsonObjectBuilder arg = Json.createObjectBuilder().add(STR_NAME,
-        STR_VALUE);
+    final JsonArrayBuilder in = createArrayBuilder(SimpleValues.STR_VALUE_1).add(SimpleValues.STR_VALUE_2)
+        .add(SimpleValues.STR_VALUE_3).add(SimpleValues.STR_VALUE_4);
+    final JsonObjectBuilder arg = Json.createObjectBuilder().add(SimpleValues.STR_NAME,
+        SimpleValues.STR_VALUE);
     for (int index : indexes) {
       try {
         // Add value on out of bounds index
@@ -414,9 +413,9 @@
    */
   private void testAddAllString(final TestResult result) {
     LOGGER.info(" - addAll(JsonArrayBuilder) for String array");
-    final JsonArray check = createSimpleStringArray5();
-    final String[] strings = new String[] { STR_VALUE_1, STR_VALUE_2,
-        STR_VALUE_3, STR_VALUE_4, STR_VALUE_5 };
+    final JsonArray check = SimpleValues.createSimpleStringArray5();
+    final String[] strings = new String[] { SimpleValues.STR_VALUE_1, SimpleValues.STR_VALUE_2,
+        SimpleValues.STR_VALUE_3, SimpleValues.STR_VALUE_4, SimpleValues.STR_VALUE_5 };
     verifyAddAll(result, check, strings);
   }
 
@@ -426,9 +425,9 @@
    */
   private void testAddAllInt(final TestResult result) {
     LOGGER.info(" - addAll(JsonArrayBuilder) for int array");
-    final JsonArray check = createSimpleIntArray5();
-    final Integer[] ints = new Integer[] { INT_VALUE_1, INT_VALUE_2,
-        INT_VALUE_3, INT_VALUE_4, INT_VALUE_5 };
+    final JsonArray check = SimpleValues.createSimpleIntArray5();
+    final Integer[] ints = new Integer[] { SimpleValues.INT_VALUE_1, SimpleValues.INT_VALUE_2,
+        SimpleValues.INT_VALUE_3, SimpleValues.INT_VALUE_4, SimpleValues.INT_VALUE_5 };
     verifyAddAll(result, check, ints);
   }
 
@@ -438,9 +437,9 @@
    */
   private void testAddAllBool(final TestResult result) {
     LOGGER.info(" - addAll(JsonArrayBuilder) for boolean array");
-    final JsonArray check = createSimpleBoolArray5();
-    final Boolean[] bools = new Boolean[] { BOOL_FALSE, BOOL_TRUE, BOOL_TRUE,
-        BOOL_FALSE, BOOL_TRUE };
+    final JsonArray check = SimpleValues.createSimpleBoolArray5();
+    final Boolean[] bools = new Boolean[] { SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_TRUE,
+        SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE };
     verifyAddAll(result, check, bools);
   }
 
@@ -450,9 +449,9 @@
    */
   private void testAddAllObject(final TestResult result) {
     LOGGER.info(" - addAll(JsonArrayBuilder) for JsonObject array");
-    final JsonArray check = createSimpleObjectArray5();
-    final JsonObject[] bools = new JsonObject[] { OBJ_VALUE_1, OBJ_VALUE_2,
-        OBJ_VALUE_3, OBJ_VALUE_4, OBJ_VALUE_5 };
+    final JsonArray check = SimpleValues.createSimpleObjectArray5();
+    final JsonObject[] bools = new JsonObject[] { SimpleValues.OBJ_VALUE_1, SimpleValues.OBJ_VALUE_2,
+        SimpleValues.OBJ_VALUE_3, SimpleValues.OBJ_VALUE_4, SimpleValues.OBJ_VALUE_5 };
     verifyAddAll(result, check, bools);
   }
 
@@ -502,7 +501,7 @@
     final JsonArray out = builderOut.build();
     if (operationFailed(check, out)) {
       result.fail("addAll(JsonArrayBuilder)", "Output builder "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -526,7 +525,7 @@
     final JsonArray out = target.add(index, src).build();
     if (operationFailed(check, out)) {
       result.fail("add(int,JsonArrayBuilder)", "Output builder "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -550,7 +549,7 @@
     final JsonArray out = target.add(index, src).build();
     if (operationFailed(check, out)) {
       result.fail("add(int,JsonObjectBuilder)", "Output builder "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildRemove.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildRemove.java
similarity index 81%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildRemove.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildRemove.java
index 9a9daaf..556d7e2 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildRemove.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildRemove.java
@@ -14,21 +14,20 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonarraytests;
+package ee.jakarta.tck.jsonp.api.jsonarraytests;
 
-import jakarta.jsonp.tck.api.common.ArrayBuilder;
-import jakarta.jsonp.tck.api.common.JsonIO;
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.ArrayBuilder;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.JsonIO;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArrayBuilder;
 import jakarta.json.JsonValue;
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests:
@@ -68,14 +67,14 @@
    *          Test suite result.
    */
   private void testRemove(final TestResult result) {
-    final Object[] values = new Object[] { OBJ_VALUE, // remove(int,JsonValue)
-        STR_VALUE, // remove(int,String)
-        INT_VALUE, // remove(int,int)
-        LNG_VALUE, // remove(int,long)
-        DBL_VALUE, // remove(int,double)
-        BIN_VALUE, // remove(int,BigInteger)
-        BDC_VALUE, // remove(int,BigDecimal)
-        BOOL_VALUE // remove(int,boolean)
+    final Object[] values = new Object[] { SimpleValues.OBJ_VALUE, // remove(int,JsonValue)
+        SimpleValues.STR_VALUE, // remove(int,String)
+        SimpleValues.INT_VALUE, // remove(int,int)
+        SimpleValues.LNG_VALUE, // remove(int,long)
+        SimpleValues.DBL_VALUE, // remove(int,double)
+        SimpleValues.BIN_VALUE, // remove(int,BigInteger)
+        SimpleValues.BDC_VALUE, // remove(int,BigDecimal)
+        SimpleValues.BOOL_VALUE // remove(int,boolean)
     };
     for (Object value : values) {
       final String typeName = JsonValueType.getType(value).name();
@@ -88,7 +87,7 @@
       final JsonValue out = builder.build();
       if (operationFailed(check, out)) {
         result.fail("remove(" + typeName + ")", "Builder output "
-            + valueToString(out) + " value shall be " + valueToString(check));
+            + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
       }
     }
   }
@@ -102,14 +101,14 @@
    *          Test suite result.
    */
   private void testRemoveOutOfBounds(final TestResult result) {
-    final Object[] values = new Object[] { OBJ_VALUE, // remove(int,JsonValue)
-        STR_VALUE, // remove(int,String)
-        INT_VALUE, // remove(int,int)
-        LNG_VALUE, // remove(int,long)
-        DBL_VALUE, // remove(int,double)
-        BIN_VALUE, // remove(int,BigInteger)
-        BDC_VALUE, // remove(int,BigDecimal)
-        BOOL_VALUE // remove(int,boolean)
+    final Object[] values = new Object[] { SimpleValues.OBJ_VALUE, // remove(int,JsonValue)
+        SimpleValues.STR_VALUE, // remove(int,String)
+        SimpleValues.INT_VALUE, // remove(int,int)
+        SimpleValues.LNG_VALUE, // remove(int,long)
+        SimpleValues.DBL_VALUE, // remove(int,double)
+        SimpleValues.BIN_VALUE, // remove(int,BigInteger)
+        SimpleValues.BDC_VALUE, // remove(int,BigDecimal)
+        SimpleValues.BOOL_VALUE // remove(int,boolean)
     };
     final int[] indexes = new int[] { -1, 2, 3 };
     for (Object value : values) {
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildSet.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildSet.java
similarity index 81%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildSet.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildSet.java
index 8fa5680..8888bb6 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuildSet.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuildSet.java
@@ -14,12 +14,14 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonarraytests;
+package ee.jakarta.tck.jsonp.api.jsonarraytests;
 
-import jakarta.jsonp.tck.api.common.ArrayBuilder;
-import jakarta.jsonp.tck.api.common.JsonIO;
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.ArrayBuilder;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.JsonIO;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonArrayBuilder;
@@ -28,9 +30,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests:
@@ -79,14 +78,14 @@
    *          Test suite result.
    */
   private void testSet(final TestResult result) {
-    final Object[] values = new Object[] { OBJ_VALUE, // set(int,JsonValue)
-        STR_VALUE, // set(int,String)
-        INT_VALUE, // set(int,int)
-        LNG_VALUE, // set(int,long)
-        DBL_VALUE, // set(int,double)
-        BIN_VALUE, // set(int,BigInteger)
-        BDC_VALUE, // set(int,BigDecimal)
-        BOOL_VALUE // set(int,boolean)
+    final Object[] values = new Object[] { SimpleValues.OBJ_VALUE, // set(int,JsonValue)
+        SimpleValues.STR_VALUE, // set(int,String)
+        SimpleValues.INT_VALUE, // set(int,int)
+        SimpleValues.LNG_VALUE, // set(int,long)
+        SimpleValues.DBL_VALUE, // set(int,double)
+        SimpleValues.BIN_VALUE, // set(int,BigInteger)
+        SimpleValues.BDC_VALUE, // set(int,BigDecimal)
+        SimpleValues.BOOL_VALUE // set(int,boolean)
     };
     for (Object value : values) {
       final String typeName = JsonValueType.getType(value).name();
@@ -94,11 +93,11 @@
       final String json = "[" + JsonValueType.toStringValue(value) + "]";
       final JsonValue check = JsonIO.read(json);
       final JsonArrayBuilder builder = updateOperationBuilder(
-          Json.createArrayBuilder().add(DEF_OBJ_VALUE), 0, value);
+          Json.createArrayBuilder().add(SimpleValues.DEF_OBJ_VALUE), 0, value);
       final JsonValue out = builder.build();
       if (operationFailed(check, out)) {
         result.fail("set(" + typeName + ")", "Builder output "
-            + valueToString(out) + " value shall be " + valueToString(check));
+            + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
       }
     }
   }
@@ -112,14 +111,14 @@
    *          Test suite result.
    */
   private void testSetOutOfBounds(final TestResult result) {
-    final Object[] values = new Object[] { OBJ_VALUE, // set(int,JsonValue)
-        STR_VALUE, // set(int,String)
-        INT_VALUE, // set(int,int)
-        LNG_VALUE, // set(int,long)
-        DBL_VALUE, // set(int,double)
-        BIN_VALUE, // set(int,BigInteger)
-        BDC_VALUE, // set(int,BigDecimal)
-        BOOL_VALUE // set(int,boolean)
+    final Object[] values = new Object[] { SimpleValues.OBJ_VALUE, // set(int,JsonValue)
+        SimpleValues.STR_VALUE, // set(int,String)
+        SimpleValues.INT_VALUE, // set(int,int)
+        SimpleValues.LNG_VALUE, // set(int,long)
+        SimpleValues.DBL_VALUE, // set(int,double)
+        SimpleValues.BIN_VALUE, // set(int,BigInteger)
+        SimpleValues.BDC_VALUE, // set(int,BigDecimal)
+        SimpleValues.BOOL_VALUE // set(int,boolean)
     };
     final int[] indexes = new int[] { -1, 2, 3 };
     for (Object value : values) {
@@ -127,11 +126,11 @@
       LOGGER.info(" - set(int," + typeName + ")");
       final String json = "[" + JsonValueType.toStringValue(value) + "]";
       JsonArrayBuilder builder = ArrayBuilder.add(Json.createArrayBuilder(),
-          DEF_OBJ_VALUE);
+          SimpleValues.DEF_OBJ_VALUE);
       for (int index : indexes) {
         try {
           builder = updateOperationBuilder(
-              Json.createArrayBuilder().add(DEF_OBJ_VALUE), index, value);
+              Json.createArrayBuilder().add(SimpleValues.DEF_OBJ_VALUE), index, value);
         } catch (IndexOutOfBoundsException e) {
           LOGGER.info("    - Expected exception for index=" + index + ": "
               + e.getMessage());
@@ -188,11 +187,11 @@
     final String json = "[" + JsonValueType.toStringValue(null) + "]";
     final JsonValue check = JsonIO.read(json);
     final JsonArrayBuilder builder = ArrayBuilder
-        .set(Json.createArrayBuilder().add(DEF_OBJ_VALUE), 0, value);
+        .set(Json.createArrayBuilder().add(SimpleValues.DEF_OBJ_VALUE), 0, value);
     final JsonValue out = builder.build();
     if (operationFailed(check, out)) {
-      result.fail("setNull(int)", "Builder output " + valueToString(out)
-          + " value shall be " + valueToString(check));
+      result.fail("setNull(int)", "Builder output " + JsonAssert.valueToString(out)
+          + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -238,13 +237,13 @@
   private void testSetArrayBuilder(final TestResult result) {
     LOGGER.info(" - set(int,JsonArrayBuilder)");
     final JsonValue check = JsonIO
-        .read("[[" + JsonValueType.toStringValue(STR_VALUE_1) + ","
-            + JsonValueType.toStringValue(STR_VALUE_2) + ","
-            + JsonValueType.toStringValue(STR_VALUE_3) + ","
-            + JsonValueType.toStringValue(STR_VALUE_4) + "]]");
-    final JsonArrayBuilder in = Json.createArrayBuilder().add(STR_VALUE_5);
-    final JsonArrayBuilder arg = Json.createArrayBuilder().add(STR_VALUE_1)
-        .add(STR_VALUE_2).add(STR_VALUE_3).add(STR_VALUE_4);
+        .read("[[" + JsonValueType.toStringValue(SimpleValues.STR_VALUE_1) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_2) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_3) + ","
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE_4) + "]]");
+    final JsonArrayBuilder in = Json.createArrayBuilder().add(SimpleValues.STR_VALUE_5);
+    final JsonArrayBuilder arg = Json.createArrayBuilder().add(SimpleValues.STR_VALUE_1)
+        .add(SimpleValues.STR_VALUE_2).add(SimpleValues.STR_VALUE_3).add(SimpleValues.STR_VALUE_4);
     verifySetBuilder(result, check, 0, arg, in);
   }
 
@@ -257,7 +256,7 @@
    */
   private void testSetArrayBuilderNull(final TestResult result) {
     LOGGER.info(" - set(int,(JsonArrayBuilder)null)");
-    final JsonArrayBuilder in = Json.createArrayBuilder().add(DEF_VALUE);
+    final JsonArrayBuilder in = Json.createArrayBuilder().add(SimpleValues.DEF_VALUE);
     final JsonArrayBuilder arg = null;
     try {
       in.set(0, arg);
@@ -283,9 +282,9 @@
   private void testSetArrayBuilderOutOfBounds(final TestResult result) {
     LOGGER.info(" - set(int,JsonArrayBuilder)");
     final int[] indexes = new int[] { -1, 5, 6 };
-    final JsonArrayBuilder in = Json.createArrayBuilder().add(STR_VALUE_1)
-        .add(STR_VALUE_2).add(STR_VALUE_3).add(STR_VALUE_4);
-    final JsonArrayBuilder arg = Json.createArrayBuilder().add(STR_VALUE_5);
+    final JsonArrayBuilder in = Json.createArrayBuilder().add(SimpleValues.STR_VALUE_1)
+        .add(SimpleValues.STR_VALUE_2).add(SimpleValues.STR_VALUE_3).add(SimpleValues.STR_VALUE_4);
+    final JsonArrayBuilder arg = Json.createArrayBuilder().add(SimpleValues.STR_VALUE_5);
     for (int index : indexes) {
       try {
         // Add value on out of bounds index
@@ -315,11 +314,11 @@
   private void testSetObjectBuilder(final TestResult result) {
     LOGGER.info(" - set(int,JsonObjectBuilder)");
     final JsonValue check = JsonIO
-        .read("[{" + JsonValueType.toStringValue(STR_NAME) + ":"
-            + JsonValueType.toStringValue(STR_VALUE) + "}]");
-    final JsonArrayBuilder in = Json.createArrayBuilder().add(STR_VALUE_1);
-    final JsonObjectBuilder arg = Json.createObjectBuilder().add(STR_NAME,
-        STR_VALUE);
+        .read("[{" + JsonValueType.toStringValue(SimpleValues.STR_NAME) + ":"
+            + JsonValueType.toStringValue(SimpleValues.STR_VALUE) + "}]");
+    final JsonArrayBuilder in = Json.createArrayBuilder().add(SimpleValues.STR_VALUE_1);
+    final JsonObjectBuilder arg = Json.createObjectBuilder().add(SimpleValues.STR_NAME,
+        SimpleValues.STR_VALUE);
     verifySetBuilder(result, check, 0, arg, in);
   }
 
@@ -332,7 +331,7 @@
    */
   private void testSetObjectBuilderNull(final TestResult result) {
     LOGGER.info(" - set(int,(JsonObjectBuilder)null)");
-    final JsonArrayBuilder in = Json.createArrayBuilder().add(DEF_VALUE);
+    final JsonArrayBuilder in = Json.createArrayBuilder().add(SimpleValues.DEF_VALUE);
     final JsonObjectBuilder arg = null;
     try {
       in.set(0, arg);
@@ -358,10 +357,10 @@
   private void testSetObjectBuilderOutOfBounds(final TestResult result) {
     LOGGER.info(" - set(int,JsonObjectBuilder)");
     final int[] indexes = new int[] { -1, 5, 6 };
-    final JsonArrayBuilder in = Json.createArrayBuilder().add(STR_VALUE_1)
-        .add(STR_VALUE_2).add(STR_VALUE_3).add(STR_VALUE_4);
-    final JsonObjectBuilder arg = Json.createObjectBuilder().add(STR_NAME,
-        STR_VALUE);
+    final JsonArrayBuilder in = Json.createArrayBuilder().add(SimpleValues.STR_VALUE_1)
+        .add(SimpleValues.STR_VALUE_2).add(SimpleValues.STR_VALUE_3).add(SimpleValues.STR_VALUE_4);
+    final JsonObjectBuilder arg = Json.createObjectBuilder().add(SimpleValues.STR_NAME,
+        SimpleValues.STR_VALUE);
     for (int index : indexes) {
       try {
         // Add value on out of bounds index
@@ -401,7 +400,7 @@
     final JsonArray out = target.set(index, src).build();
     if (operationFailed(check, out)) {
       result.fail("set(int,JsonArrayBuilder)", "Output builder "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -425,7 +424,7 @@
     final JsonArray out = target.set(index, src).build();
     if (operationFailed(check, out)) {
       result.fail("set(int,JsonObjectBuilder)", "Output builder "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuilders.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuilders.java
similarity index 85%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuilders.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuilders.java
index ef3889e..c2483d6 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayBuilders.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayBuilders.java
@@ -14,9 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonarraytests;
+package ee.jakarta.tck.jsonp.api.jsonarraytests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+
 import java.util.ArrayList;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
@@ -24,8 +27,6 @@
 import jakarta.json.JsonString;
 import jakarta.json.JsonValue;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
 import java.util.Iterator;
 import java.util.List;
 import java.util.logging.Logger;
@@ -73,7 +74,7 @@
    */
   private void testCreateFromCollection(final TestResult result) {
     LOGGER.info(" - Json#createArrayBuilder(Collection<Object>)");
-    final JsonArray check = createSimpleStringArray5();
+    final JsonArray check = SimpleValues.createSimpleStringArray5();
     final ArrayList<Object> values = new ArrayList<>(check.size());
     for (final JsonValue value : check) {
       values.add(((JsonString) value).getString());
@@ -82,7 +83,7 @@
     final JsonArray out = builder.build();
     if (operationFailed(check, out)) {
       result.fail("createArrayBuilder(Collection<Object>)", "Builder output "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -94,12 +95,12 @@
    */
   private void testCreateFromJsonArray(final TestResult result) {
     LOGGER.info(" - Json#createArrayBuilder(JsonArray)");
-    final JsonArray check = createSimpleStringArray5();
+    final JsonArray check = SimpleValues.createSimpleStringArray5();
     final JsonArrayBuilder builder = Json.createArrayBuilder(check);
     final JsonArray out = builder.build();
     if (operationFailed(check, out)) {
       result.fail("createArrayBuilder(JsonArray)", "Builder output "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -112,7 +113,7 @@
    */
   private void testGetStringValuesAs(final TestResult result) {
     LOGGER.info(" - getValuesAs(Function<K,T> on String array");
-    final JsonArray in = createStringArray2();
+    final JsonArray in = SimpleValues.createStringArray2();
     final List<String> out = in.getValuesAs(JsonString::getString);
     boolean failed = in.size() != out.size();
     if (!failed) {
@@ -126,7 +127,7 @@
     }
     if (failed) {
       result.fail("getValuesAs(Function<K,T>)", "Returned Array "
-          + out.toString() + " content shall match " + valueToString(in));
+          + out.toString() + " content shall match " + JsonAssert.valueToString(in));
     }
   }
 
@@ -139,7 +140,7 @@
    */
   private void testGetIntValuesAs(final TestResult result) {
     LOGGER.info(" - getValuesAs(Function<K,T> on int array");
-    final JsonArray in = createIntArray2();
+    final JsonArray in = SimpleValues.createIntArray2();
     final List<Integer> out = in.getValuesAs(JsonNumber::intValue);
     boolean failed = in.size() != out.size();
     if (!failed) {
@@ -153,7 +154,7 @@
     }
     if (failed) {
       result.fail("getValuesAs(Function<K,T>)", "Returned Array "
-          + out.toString() + " content shall match " + valueToString(in));
+          + out.toString() + " content shall match " + JsonAssert.valueToString(in));
     }
   }
 
@@ -169,7 +170,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayCommon.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayCommon.java
similarity index 94%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayCommon.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayCommon.java
index 1560b36..b19ea6a 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ArrayCommon.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ArrayCommon.java
@@ -14,13 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonarraytests;
+package ee.jakarta.tck.jsonp.api.jsonarraytests;
 
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
 import jakarta.json.JsonArrayBuilder;
 import jakarta.json.JsonValue;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests for {@link JsonArray}
@@ -93,7 +92,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ClientTests.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ClientTests.java
index 6078003..be4fe28 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonarraytests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonarraytests/ClientTests.java
@@ -14,10 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonarraytests;
+package ee.jakarta.tck.jsonp.api.jsonarraytests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
-import jakarta.jsonp.tck.common.*;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+import ee.jakarta.tck.jsonp.common.JSONP_Data;
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 
 import java.io.*;
 import java.math.BigDecimal;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonbuilderfactorytests/BuilderFactory.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonbuilderfactorytests/BuilderFactory.java
similarity index 84%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonbuilderfactorytests/BuilderFactory.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonbuilderfactorytests/BuilderFactory.java
index 0955a04..eaeb2c8 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonbuilderfactorytests/BuilderFactory.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonbuilderfactorytests/BuilderFactory.java
@@ -14,9 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonbuilderfactorytests;
+package ee.jakarta.tck.jsonp.api.jsonbuilderfactorytests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
@@ -28,9 +30,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests for
@@ -71,8 +70,8 @@
    */
   private void testCreateArrayBuilderString(final TestResult result) {
     LOGGER.info(" - createArrayBuilder(JsonArray) for String");
-    final JsonArray in = createStringArray2();
-    final JsonArray check = createStringArray2();
+    final JsonArray in = SimpleValues.createStringArray2();
+    final JsonArray check = SimpleValues.createStringArray2();
     verifyCreateArrayBuilder(result, check, in);
   }
 
@@ -85,8 +84,8 @@
    */
   private void testCreateArrayBuilderInt(final TestResult result) {
     LOGGER.info(" - createArrayBuilder(JsonArray) for int");
-    final JsonArray in = createIntArray2();
-    final JsonArray check = createIntArray2();
+    final JsonArray in = SimpleValues.createIntArray2();
+    final JsonArray check = SimpleValues.createIntArray2();
     verifyCreateArrayBuilder(result, check, in);
   }
 
@@ -99,8 +98,8 @@
    */
   private void testCreateArrayBuilderBool(final TestResult result) {
     LOGGER.info(" - createArrayBuilder(JsonArray) for boolean");
-    final JsonArray in = createBoolArray2();
-    final JsonArray check = createBoolArray2();
+    final JsonArray in = SimpleValues.createBoolArray2();
+    final JsonArray check = SimpleValues.createBoolArray2();
     verifyCreateArrayBuilder(result, check, in);
   }
 
@@ -113,8 +112,8 @@
    */
   private void testCreateArrayBuilderObject(final TestResult result) {
     LOGGER.info(" - createArrayBuilder(JsonArray) for JsonObject");
-    final JsonArray in = createObjectArray2();
-    final JsonArray check = createObjectArray2();
+    final JsonArray in = SimpleValues.createObjectArray2();
+    final JsonArray check = SimpleValues.createObjectArray2();
     verifyCreateArrayBuilder(result, check, in);
   }
 
@@ -152,8 +151,8 @@
    */
   private void testCreateObjectBuilderString(final TestResult result) {
     LOGGER.info(" - createObjectBuilder(JsonObject) for String");
-    final JsonObject in = createSimpleObjectStr();
-    final JsonObject check = createSimpleObjectStr();
+    final JsonObject in = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createSimpleObjectStr();
     verifyCreateObjectBuilder(result, check, in);
   }
 
@@ -166,8 +165,8 @@
    */
   private void testCreateObjectBuilderInt(final TestResult result) {
     LOGGER.info(" - createObjectBuilder(JsonObject) for int");
-    final JsonObject in = createSimpleObjectInt();
-    final JsonObject check = createSimpleObjectInt();
+    final JsonObject in = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createSimpleObjectInt();
     verifyCreateObjectBuilder(result, check, in);
   }
 
@@ -180,8 +179,8 @@
    */
   private void testCreateObjectBuilderBool(final TestResult result) {
     LOGGER.info(" - createObjectBuilder(JsonObject) for boolean");
-    final JsonObject in = createSimpleObjectBool();
-    final JsonObject check = createSimpleObjectBool();
+    final JsonObject in = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createSimpleObjectBool();
     verifyCreateObjectBuilder(result, check, in);
   }
 
@@ -194,8 +193,8 @@
    */
   private void testCreateObjectBuilderObject(final TestResult result) {
     LOGGER.info(" - createObjectBuilder(JsonObject) for JsonObject");
-    final JsonObject in = createSimpleObjectObject();
-    final JsonObject check = createSimpleObjectObject();
+    final JsonObject in = SimpleValues.createSimpleObjectObject();
+    final JsonObject check = SimpleValues.createSimpleObjectObject();
     verifyCreateObjectBuilder(result, check, in);
   }
 
@@ -217,7 +216,7 @@
     final JsonArray out = builder.build();
     if (operationFailed(check, out)) {
       result.fail("createArrayBuilder(JsonArray)", "Output builder "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -235,13 +234,13 @@
    */
   private void verifyCreateObjectBuilder(final TestResult result,
       final JsonObject check, final JsonObject in) {
-    LOGGER.info("    - IN: " + valueToString(in));
+    LOGGER.info("    - IN: " + JsonAssert.valueToString(in));
     final JsonBuilderFactory factory = Json.createBuilderFactory(null);
     final JsonObjectBuilder builder = factory.createObjectBuilder(in);
     final JsonObject out = builder.build();
     if (operationFailed(check, out)) {
       result.fail("createObjectBuilder(JsonObject)", "Output builder "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -282,7 +281,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonbuilderfactorytests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonbuilderfactorytests/ClientTests.java
similarity index 96%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonbuilderfactorytests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonbuilderfactorytests/ClientTests.java
index aa0b72f..65142bd 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonbuilderfactorytests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonbuilderfactorytests/ClientTests.java
@@ -17,10 +17,10 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonbuilderfactorytests;
+package ee.jakarta.tck.jsonp.api.jsonbuilderfactorytests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
-import jakarta.jsonp.tck.common.*;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 
 import java.util.Map;
 import java.util.logging.Logger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsoncoding/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsoncoding/ClientTests.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsoncoding/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsoncoding/ClientTests.java
index 97a6493..8135e4c 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsoncoding/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsoncoding/ClientTests.java
@@ -17,7 +17,7 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsoncoding;
+package ee.jakarta.tck.jsonp.api.jsoncoding;
 
 import jakarta.json.Json;
 import org.junit.jupiter.api.Test;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratorfactorytests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratorfactorytests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratorfactorytests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratorfactorytests/ClientTests.java
index 69715f4..0f328d7 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratorfactorytests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratorfactorytests/ClientTests.java
@@ -17,8 +17,9 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsongeneratorfactorytests;
+package ee.jakarta.tck.jsonp.api.jsongeneratorfactorytests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.*;
 import jakarta.json.stream.*;
 
@@ -27,7 +28,6 @@
 import java.util.Map;
 import java.util.logging.Logger;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratortests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratortests/ClientTests.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratortests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratortests/ClientTests.java
index 02332c5..39baadb 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratortests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratortests/ClientTests.java
@@ -17,10 +17,11 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsongeneratortests;
+package ee.jakarta.tck.jsonp.api.jsongeneratortests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
-import jakarta.jsonp.tck.common.*;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
+import ee.jakarta.tck.jsonp.common.MyBufferedWriter;
 
 import java.io.*;
 import java.math.BigDecimal;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratortests/Generator.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratortests/Generator.java
similarity index 83%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratortests/Generator.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratortests/Generator.java
index 03dde1b..19f5c12 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsongeneratortests/Generator.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsongeneratortests/Generator.java
@@ -14,10 +14,13 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsongeneratortests;
+package ee.jakarta.tck.jsonp.api.jsongeneratortests;
 
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+
 import java.io.StringReader;
 import java.io.StringWriter;
 import java.math.BigDecimal;
@@ -29,8 +32,6 @@
 import jakarta.json.JsonValue;
 import jakarta.json.stream.JsonGenerator;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
 import jakarta.json.JsonObject;
 
 // $Id$
@@ -43,17 +44,17 @@
   private static final Logger LOGGER = Logger.getLogger(Generator.class.getName());
 
   /** Tests input data. */
-  private static final Object[] VALUES = new Object[] { OBJ_VALUE, // write(JsonValue)
+  private static final Object[] VALUES = new Object[] { SimpleValues.OBJ_VALUE, // write(JsonValue)
                                                                    // for
                                                                    // JsonObject
-      createEmptyArrayWithStr(), // write(JsonValue) for simple JsonArray
-      STR_VALUE, // write(JsonValue) for String
-      INT_VALUE, // write(JsonValue) for int
-      LNG_VALUE, // write(JsonValue) for long
-      DBL_VALUE, // write(JsonValue) for double
-      BIN_VALUE, // write(JsonValue) for BigInteger
-      BDC_VALUE, // write(JsonValue) for BigDecimal
-      BOOL_VALUE, // write(JsonValue) for boolean
+      SimpleValues.createEmptyArrayWithStr(), // write(JsonValue) for simple JsonArray
+      SimpleValues.STR_VALUE, // write(JsonValue) for String
+      SimpleValues.INT_VALUE, // write(JsonValue) for int
+      SimpleValues.LNG_VALUE, // write(JsonValue) for long
+      SimpleValues.DBL_VALUE, // write(JsonValue) for double
+      SimpleValues.BIN_VALUE, // write(JsonValue) for BigInteger
+      SimpleValues.BDC_VALUE, // write(JsonValue) for BigDecimal
+      SimpleValues.BOOL_VALUE, // write(JsonValue) for boolean
       null // write(JsonValue) for null
   };
 
@@ -95,12 +96,12 @@
     final StringWriter strWriter = new StringWriter();
     try (JsonGenerator generator = Json.createGenerator(strWriter)) {
       generator.writeStartObject();
-      generator.writeKey(STR_NAME);
-      generator.write(STR_VALUE);
+      generator.writeKey(SimpleValues.STR_NAME);
+      generator.write(SimpleValues.STR_VALUE);
       generator.writeEnd();
     }
     final String out = strWriter.toString();
-    final JsonObject check = createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createSimpleObjectStr();
     if (operationFailed(check, out)) {
       final String checkStr = check.toString();
       LOGGER.info(
@@ -119,7 +120,7 @@
   private void verifyJsonGeneratorForJsonValue(final TestResult result,
       final Object value) {
     final StringWriter strWriter = new StringWriter();
-    final JsonValue jsonValue = toJsonValue(value);
+    final JsonValue jsonValue = SimpleValues.toJsonValue(value);
     try (JsonGenerator generator = Json.createGenerator(strWriter)) {
       generator.write(jsonValue);
     }
@@ -178,7 +179,7 @@
     }
     final String out = strWriter.toString();
     if (operationFailed(value, out)) {
-      final String check = toJsonValue(value).toString();
+      final String check = SimpleValues.toJsonValue(value).toString();
       LOGGER.info("     Generated simple value " + out + " shall be " + check);
       result.fail("write(JsonValue)",
           "Generated value " + out + " shall be " + check);
@@ -198,7 +199,7 @@
    *         otherwise.
    */
   protected boolean operationFailed(final Object check, final String out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
   /**
@@ -217,7 +218,7 @@
     }
     try (final JsonReader reader = Json.createReader(new StringReader(out))) {
       final JsonValue actVal = reader.readValue();
-      return !assertEquals((JsonValue) check, actVal);
+      return !JsonAssert.assertEquals((JsonValue) check, actVal);
     }
   }
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonnumbertests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonnumbertests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonnumbertests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonnumbertests/ClientTests.java
index c3fa387..accda6e 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonnumbertests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonnumbertests/ClientTests.java
@@ -17,11 +17,11 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonnumbertests;
+package ee.jakarta.tck.jsonp.api.jsonnumbertests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.*;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import java.util.logging.Logger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/ClientTests.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/ClientTests.java
index 95a4aad..13f3baf 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/ClientTests.java
@@ -17,9 +17,11 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonobjecttests;
+package ee.jakarta.tck.jsonp.api.jsonobjecttests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+import ee.jakarta.tck.jsonp.common.JSONP_Data;
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 
 import java.io.StringReader;
 import java.io.StringWriter;
@@ -39,8 +41,6 @@
 import jakarta.json.JsonString;
 import jakarta.json.JsonValue;
 import jakarta.json.JsonWriter;
-import jakarta.jsonp.tck.common.JSONP_Data;
-import jakarta.jsonp.tck.common.JSONP_Util;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/CreateObjectBuilder.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/CreateObjectBuilder.java
similarity index 80%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/CreateObjectBuilder.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/CreateObjectBuilder.java
index f3cca7e..0f96e36 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/CreateObjectBuilder.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/CreateObjectBuilder.java
@@ -14,9 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonobjecttests;
+package ee.jakarta.tck.jsonp.api.jsonobjecttests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+
 import java.util.HashMap;
 import java.util.Map;
 import java.util.logging.Logger;
@@ -26,9 +29,6 @@
 import jakarta.json.JsonObjectBuilder;
 import jakarta.json.JsonValue;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests:
@@ -60,15 +60,15 @@
    */
   private void testCreateFromMap(final TestResult result) {
     LOGGER.info(" - Json#createObjectBuilder(Map<String,Object>)");
-    final JsonObject check = createSimpleObjectWithStr();
+    final JsonObject check = SimpleValues.createSimpleObjectWithStr();
     Map<String, Object> values = new HashMap<>(2);
-    values.put(DEF_NAME, DEF_VALUE);
-    values.put(STR_NAME, STR_VALUE);
+    values.put(SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE);
+    values.put(SimpleValues.STR_NAME, SimpleValues.STR_VALUE);
     final JsonObjectBuilder builder = Json.createObjectBuilder(values);
     final JsonObject out = builder.build();
     if (operationFailed(check, out)) {
       result.fail("createObjectBuilder(Map<String,Object>)", "Builder output "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -80,12 +80,12 @@
    */
   private void testCreateFromJsonObject(final TestResult result) {
     LOGGER.info(" - Json#createObjectBuilder(JsonObject)");
-    final JsonObject check = createSimpleObjectWithStr();
+    final JsonObject check = SimpleValues.createSimpleObjectWithStr();
     final JsonObjectBuilder builder = Json.createObjectBuilder(check);
     final JsonObject out = builder.build();
     if (operationFailed(check, out)) {
       result.fail("reateObjectBuilder(JsonObject)", "Builder output "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -101,7 +101,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/ObjectBuild.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/ObjectBuild.java
similarity index 75%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/ObjectBuild.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/ObjectBuild.java
index b569140..64eaa39 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonobjecttests/ObjectBuild.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonobjecttests/ObjectBuild.java
@@ -14,10 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonobjecttests;
+package ee.jakarta.tck.jsonp.api.jsonobjecttests;
 
-import jakarta.jsonp.tck.api.common.ObjectBuilder;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.ObjectBuilder;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArrayBuilder;
 import jakarta.json.JsonObject;
@@ -26,9 +28,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests for {@link JsonObject}
@@ -70,10 +69,10 @@
   private void testAddString(final TestResult result) {
     LOGGER.info(" - addAll(JsonObjectBuilder) for String");
     final JsonObjectBuilder target = ObjectBuilder
-        .add(Json.createObjectBuilder(), DEF_NAME, DEF_VALUE);
+        .add(Json.createObjectBuilder(), SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE);
     final JsonObjectBuilder arg = ObjectBuilder.add(Json.createObjectBuilder(),
-        STR_NAME, STR_VALUE);
-    final JsonObject check = createSimpleObjectWithStr();
+        SimpleValues.STR_NAME, SimpleValues.STR_VALUE);
+    final JsonObject check = SimpleValues.createSimpleObjectWithStr();
     verifyAddAll(result, check, target, arg);
   }
 
@@ -87,10 +86,10 @@
   private void testAddInt(final TestResult result) {
     LOGGER.info(" - addAll(JsonObjectBuilder) for int");
     final JsonObjectBuilder target = ObjectBuilder
-        .add(Json.createObjectBuilder(), DEF_NAME, DEF_VALUE);
+        .add(Json.createObjectBuilder(), SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE);
     final JsonObjectBuilder arg = ObjectBuilder.add(Json.createObjectBuilder(),
-        INT_NAME, INT_VALUE);
-    final JsonObject check = createSimpleObjectWithInt();
+        SimpleValues.INT_NAME, SimpleValues.INT_VALUE);
+    final JsonObject check = SimpleValues.createSimpleObjectWithInt();
     verifyAddAll(result, check, target, arg);
   }
 
@@ -104,10 +103,10 @@
   private void testAddBool(final TestResult result) {
     LOGGER.info(" - addAll(JsonObjectBuilder) for boolean");
     final JsonObjectBuilder target = ObjectBuilder
-        .add(Json.createObjectBuilder(), DEF_NAME, DEF_VALUE);
+        .add(Json.createObjectBuilder(), SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE);
     final JsonObjectBuilder arg = ObjectBuilder.add(Json.createObjectBuilder(),
-        BOOL_NAME, BOOL_VALUE);
-    final JsonObject check = createSimpleObjectWithBool();
+        SimpleValues.BOOL_NAME, SimpleValues.BOOL_VALUE);
+    final JsonObject check = SimpleValues.createSimpleObjectWithBool();
     verifyAddAll(result, check, target, arg);
   }
 
@@ -121,11 +120,11 @@
   private void testAddObject(final TestResult result) {
     LOGGER.info(" - addAll(JsonObjectBuilder) for JsonObject");
     final JsonObjectBuilder target = ObjectBuilder
-        .add(Json.createObjectBuilder(), DEF_NAME, DEF_VALUE)
-        .add(DEF_OBJ_NAME, DEF_OBJ_VALUE);
+        .add(Json.createObjectBuilder(), SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE)
+        .add(SimpleValues.DEF_OBJ_NAME, SimpleValues.DEF_OBJ_VALUE);
     final JsonObjectBuilder arg = ObjectBuilder.add(Json.createObjectBuilder(),
-        OBJ_NAME, OBJ_VALUE);
-    final JsonObject check = createCompoundObjectWithObject();
+        SimpleValues.OBJ_NAME, SimpleValues.OBJ_VALUE);
+    final JsonObject check = SimpleValues.createCompoundObjectWithObject();
     verifyAddAll(result, check, target, arg);
   }
 
@@ -162,10 +161,10 @@
   private void testRemoveString(final TestResult result) {
     LOGGER.info(" - remove(String) for String");
     final JsonObjectBuilder in = ObjectBuilder
-        .add(Json.createObjectBuilder(), DEF_NAME, DEF_VALUE)
-        .add(STR_NAME, STR_VALUE);
-    final JsonObjectBuilder builder = in.remove(STR_NAME);
-    final JsonObject check = createSimpleObject();
+        .add(Json.createObjectBuilder(), SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE)
+        .add(SimpleValues.STR_NAME, SimpleValues.STR_VALUE);
+    final JsonObjectBuilder builder = in.remove(SimpleValues.STR_NAME);
+    final JsonObject check = SimpleValues.createSimpleObject();
     verifyRemovel(result, check, builder);
   }
 
@@ -178,10 +177,10 @@
   private void testRemoveInt(final TestResult result) {
     LOGGER.info(" - remove(String) for int");
     final JsonObjectBuilder in = ObjectBuilder
-        .add(Json.createObjectBuilder(), DEF_NAME, DEF_VALUE)
-        .add(INT_NAME, INT_VALUE);
-    final JsonObjectBuilder builder = in.remove(INT_NAME);
-    final JsonObject check = createSimpleObject();
+        .add(Json.createObjectBuilder(), SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE)
+        .add(SimpleValues.INT_NAME, SimpleValues.INT_VALUE);
+    final JsonObjectBuilder builder = in.remove(SimpleValues.INT_NAME);
+    final JsonObject check = SimpleValues.createSimpleObject();
     verifyRemovel(result, check, builder);
   }
 
@@ -195,10 +194,10 @@
   private void testRemoveBool(final TestResult result) {
     LOGGER.info(" - remove(String) for boolean");
     final JsonObjectBuilder in = ObjectBuilder
-        .add(Json.createObjectBuilder(), DEF_NAME, DEF_VALUE)
-        .add(BOOL_NAME, BOOL_VALUE);
-    final JsonObjectBuilder builder = in.remove(BOOL_NAME);
-    final JsonObject check = createSimpleObject();
+        .add(Json.createObjectBuilder(), SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE)
+        .add(SimpleValues.BOOL_NAME, SimpleValues.BOOL_VALUE);
+    final JsonObjectBuilder builder = in.remove(SimpleValues.BOOL_NAME);
+    final JsonObject check = SimpleValues.createSimpleObject();
     verifyRemovel(result, check, builder);
   }
 
@@ -212,10 +211,10 @@
   private void testRemoveObject(final TestResult result) {
     LOGGER.info(" - remove(String) for JsonObject");
     final JsonObjectBuilder in = ObjectBuilder
-        .add(Json.createObjectBuilder(), DEF_NAME, DEF_VALUE)
-        .add(DEF_OBJ_NAME, DEF_OBJ_VALUE).add(OBJ_NAME, OBJ_VALUE);
-    final JsonObjectBuilder builder = in.remove(OBJ_NAME);
-    final JsonObject check = createCompoundObject();
+        .add(Json.createObjectBuilder(), SimpleValues.DEF_NAME, SimpleValues.DEF_VALUE)
+        .add(SimpleValues.DEF_OBJ_NAME, SimpleValues.DEF_OBJ_VALUE).add(SimpleValues.OBJ_NAME, SimpleValues.OBJ_VALUE);
+    final JsonObjectBuilder builder = in.remove(SimpleValues.OBJ_NAME);
+    final JsonObject check = SimpleValues.createCompoundObject();
     verifyRemovel(result, check, builder);
   }
 
@@ -262,7 +261,7 @@
     final JsonObject out = target.build();
     if (operationFailed(check, out)) {
       result.fail("addAll(JsonObjectBuilder)", "Output builder "
-          + valueToString(out) + " value shall be " + valueToString(check));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -284,8 +283,8 @@
       JsonObjectBuilder builder) {
     final JsonObject out = builder.build();
     if (operationFailed(check, out)) {
-      result.fail("remove(String)", "Output builder " + valueToString(out)
-          + " value shall be " + valueToString(check));
+      result.fail("remove(String)", "Output builder " + JsonAssert.valueToString(out)
+          + " value shall be " + JsonAssert.valueToString(check));
     }
   }
 
@@ -301,7 +300,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsereventtests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsereventtests/ClientTests.java
similarity index 96%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsereventtests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsereventtests/ClientTests.java
index cc20fbd..16ef6fc 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsereventtests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsereventtests/ClientTests.java
@@ -17,11 +17,11 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonparsereventtests;
+package ee.jakarta.tck.jsonp.api.jsonparsereventtests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.stream.*;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import java.util.logging.Logger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparserfactorytests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparserfactorytests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparserfactorytests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparserfactorytests/ClientTests.java
index e3eac62..32480c4 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparserfactorytests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparserfactorytests/ClientTests.java
@@ -17,8 +17,10 @@
 /*
  * $Id: Client.java 66863 2012-07-23 11:26:40Z adf $
  */
-package jakarta.jsonp.tck.api.jsonparserfactorytests;
+package ee.jakarta.tck.jsonp.api.jsonparserfactorytests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
+import ee.jakarta.tck.jsonp.common.MyBufferedInputStream;
 import jakarta.json.*;
 import jakarta.json.stream.*;
 import java.io.*;
@@ -26,7 +28,6 @@
 import java.util.Map;
 import java.util.logging.Logger;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsertests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsertests/ClientTests.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsertests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsertests/ClientTests.java
index e8a7d48..d042fdc 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsertests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsertests/ClientTests.java
@@ -17,7 +17,7 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonparsertests;
+package ee.jakarta.tck.jsonp.api.jsonparsertests;
 
 import java.io.InputStream;
 import java.io.StringReader;
@@ -25,6 +25,10 @@
 import java.util.NoSuchElementException;
 import java.util.logging.Logger;
 
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+import ee.jakarta.tck.jsonp.common.JSONP_Data;
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
+import ee.jakarta.tck.jsonp.common.MyBufferedInputStream;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
@@ -32,10 +36,6 @@
 import jakarta.json.stream.JsonParser;
 import jakarta.json.stream.JsonParser.Event;
 import jakarta.json.stream.JsonParsingException;
-import jakarta.jsonp.tck.api.common.TestResult;
-import jakarta.jsonp.tck.common.JSONP_Data;
-import jakarta.jsonp.tck.common.JSONP_Util;
-import jakarta.jsonp.tck.common.MyBufferedInputStream;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.*;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsertests/Parser.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsertests/Parser.java
similarity index 74%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsertests/Parser.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsertests/Parser.java
index 3f9eaf3..87d78f5 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonparsertests/Parser.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonparsertests/Parser.java
@@ -14,9 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonparsertests;
+package ee.jakarta.tck.jsonp.api.jsonparsertests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+
 import java.io.StringReader;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -32,9 +35,6 @@
 import jakarta.json.JsonValue;
 import jakarta.json.stream.JsonParser;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests: {@link JsonParser} API
@@ -46,21 +46,21 @@
   
   /** Tests input data with various JsonValue instances. */
   private static final JsonValue[] VALUES = new JsonValue[] {
-      toJsonValue(STR_VALUE), // Non JsonObject with String
-      toJsonValue(INT_VALUE), // Non JsonObject with int
-      toJsonValue(LNG_VALUE), // Non JsonObject with long
-      toJsonValue(DBL_VALUE), // Non JsonObject with double
-      toJsonValue(BOOL_VALUE), // Non JsonObject with boolean
-      toJsonValue(BDC_VALUE), // Non JsonObject with BigDecimal
-      toJsonValue(BIN_VALUE), // Non JsonObject with BigInteger
-      createSimpleObjectStr(), // JsonObject with String
-      createSimpleObjectInt(), // JsonObject with int
-      createSimpleObjectBool(), // JsonObject with boolean
-      createSimpleObjectObject(), // JsonObject with JsonObject
-      createEmptyArrayWithStr(), // JsonArray with String
-      createEmptyArrayWithInt(), // JsonArray with int
-      createEmptyArrayWithBool(), // JsonArray with boolean
-      createEmptyArrayWithObject() // JsonArray with JsonObject
+      SimpleValues.toJsonValue(SimpleValues.STR_VALUE), // Non JsonObject with String
+      SimpleValues.toJsonValue(SimpleValues.INT_VALUE), // Non JsonObject with int
+      SimpleValues.toJsonValue(SimpleValues.LNG_VALUE), // Non JsonObject with long
+      SimpleValues.toJsonValue(SimpleValues.DBL_VALUE), // Non JsonObject with double
+      SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE), // Non JsonObject with boolean
+      SimpleValues.toJsonValue(SimpleValues.BDC_VALUE), // Non JsonObject with BigDecimal
+      SimpleValues.toJsonValue(SimpleValues.BIN_VALUE), // Non JsonObject with BigInteger
+      SimpleValues.createSimpleObjectStr(), // JsonObject with String
+      SimpleValues.createSimpleObjectInt(), // JsonObject with int
+      SimpleValues.createSimpleObjectBool(), // JsonObject with boolean
+      SimpleValues.createSimpleObjectObject(), // JsonObject with JsonObject
+      SimpleValues.createEmptyArrayWithStr(), // JsonArray with String
+      SimpleValues.createEmptyArrayWithInt(), // JsonArray with int
+      SimpleValues.createEmptyArrayWithBool(), // JsonArray with boolean
+      SimpleValues.createEmptyArrayWithObject() // JsonArray with JsonObject
   };
 
   // /** Tests input data with simple JsonValue instances. */
@@ -75,69 +75,69 @@
 
   /** Tests input data with compound JsonValue instances (object or array). */
   private static final JsonStructure[] COMPOUND_VALUES = new JsonStructure[] {
-      createSimpleObjectStr(), // JsonObject with String
-      createSimpleObjectInt(), // JsonObject with int
-      createSimpleObjectBool(), // JsonObject with boolean
-      createSimpleObjectObject(), // JsonObject with JsonObject
-      createEmptyArrayWithStr(), // JsonArray with String
-      createEmptyArrayWithInt(), // JsonArray with int
-      createEmptyArrayWithBool(), // JsonArray with boolean
-      createEmptyArrayWithObject() // JsonArray with JsonObject
+      SimpleValues.createSimpleObjectStr(), // JsonObject with String
+      SimpleValues.createSimpleObjectInt(), // JsonObject with int
+      SimpleValues.createSimpleObjectBool(), // JsonObject with boolean
+      SimpleValues.createSimpleObjectObject(), // JsonObject with JsonObject
+      SimpleValues.createEmptyArrayWithStr(), // JsonArray with String
+      SimpleValues.createEmptyArrayWithInt(), // JsonArray with int
+      SimpleValues.createEmptyArrayWithBool(), // JsonArray with boolean
+      SimpleValues.createEmptyArrayWithObject() // JsonArray with JsonObject
   };
 
   /** Tests input data with empty JsonObject and JsonArray instances. */
   private static final JsonStructure[] EMPTY_VALUES = new JsonStructure[] {
-      createEmptyObject(), // Empty JsonObject
-      createEmptyArray() // Empty JsonArray
+      SimpleValues.createEmptyObject(), // Empty JsonObject
+      SimpleValues.createEmptyArray() // Empty JsonArray
   };
 
   /** Tests input data with JsonObject instances. */
   private static final JsonObject[] OBJ_VALUES = new JsonObject[] {
-      createSimpleObjectStr(), // JsonObject with String
-      createSimpleObjectInt(), // JsonObject with int
-      createSimpleObjectBool(), // JsonObject with boolean
-      createSimpleObjectObject(), // JsonObject with JsonObject
-      createSimpleObjectWithStr() // JsonObject with default value (String) and
+      SimpleValues.createSimpleObjectStr(), // JsonObject with String
+      SimpleValues.createSimpleObjectInt(), // JsonObject with int
+      SimpleValues.createSimpleObjectBool(), // JsonObject with boolean
+      SimpleValues.createSimpleObjectObject(), // JsonObject with JsonObject
+      SimpleValues.createSimpleObjectWithStr() // JsonObject with default value (String) and
                                   // another String
 
   };
 
   /** Tests input data with non JsonObject instances. */
   private static final JsonValue[] NON_OBJ_VALUES = new JsonValue[] {
-      toJsonValue(STR_VALUE), // Non JsonObject with String
-      toJsonValue(INT_VALUE), // Non JsonObject with int
-      toJsonValue(LNG_VALUE), // Non JsonObject with long
-      toJsonValue(DBL_VALUE), // Non JsonObject with double
-      toJsonValue(BOOL_VALUE), // Non JsonObject with boolean
-      toJsonValue(BDC_VALUE), // Non JsonObject with BigDecimal
-      toJsonValue(BIN_VALUE), // Non JsonObject with BigInteger
-      createEmptyArrayWithStr(), // JsonArray with String
-      createEmptyArrayWithInt(), // JsonArray with int
-      createEmptyArrayWithBool(), // JsonArray with boolean
-      createEmptyArrayWithObject() // JsonArray with JsonObject
+      SimpleValues.toJsonValue(SimpleValues.STR_VALUE), // Non JsonObject with String
+      SimpleValues.toJsonValue(SimpleValues.INT_VALUE), // Non JsonObject with int
+      SimpleValues.toJsonValue(SimpleValues.LNG_VALUE), // Non JsonObject with long
+      SimpleValues.toJsonValue(SimpleValues.DBL_VALUE), // Non JsonObject with double
+      SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE), // Non JsonObject with boolean
+      SimpleValues.toJsonValue(SimpleValues.BDC_VALUE), // Non JsonObject with BigDecimal
+      SimpleValues.toJsonValue(SimpleValues.BIN_VALUE), // Non JsonObject with BigInteger
+      SimpleValues.createEmptyArrayWithStr(), // JsonArray with String
+      SimpleValues.createEmptyArrayWithInt(), // JsonArray with int
+      SimpleValues.createEmptyArrayWithBool(), // JsonArray with boolean
+      SimpleValues.createEmptyArrayWithObject() // JsonArray with JsonObject
   };
 
   /** Tests input data with JsonArray instances. */
   private static final JsonArray[] ARRAY_VALUES = new JsonArray[] {
-      createEmptyArrayWithStr(), // JsonArray with String
-      createEmptyArrayWithInt(), // JsonArray with int
-      createEmptyArrayWithBool(), // JsonArray with boolean
-      createEmptyArrayWithObject() // JsonArray with JsonObject
+      SimpleValues.createEmptyArrayWithStr(), // JsonArray with String
+      SimpleValues.createEmptyArrayWithInt(), // JsonArray with int
+      SimpleValues.createEmptyArrayWithBool(), // JsonArray with boolean
+      SimpleValues.createEmptyArrayWithObject() // JsonArray with JsonObject
   };
 
   /** Tests input data with non JsonArray instances. */
   private static final JsonValue[] NON_ARRAY_VALUES = new JsonValue[] {
-      toJsonValue(STR_VALUE), // Non JsonObject with String
-      toJsonValue(INT_VALUE), // Non JsonObject with int
-      toJsonValue(LNG_VALUE), // Non JsonObject with long
-      toJsonValue(DBL_VALUE), // Non JsonObject with double
-      toJsonValue(BOOL_VALUE), // Non JsonObject with boolean
-      toJsonValue(BDC_VALUE), // Non JsonObject with BigDecimal
-      toJsonValue(BIN_VALUE), // Non JsonObject with BigInteger
-      createSimpleObjectStr(), // JsonObject with String
-      createSimpleObjectInt(), // JsonObject with int
-      createSimpleObjectBool(), // JsonObject with boolean
-      createSimpleObjectObject() // JsonObject with JsonObject
+      SimpleValues.toJsonValue(SimpleValues.STR_VALUE), // Non JsonObject with String
+      SimpleValues.toJsonValue(SimpleValues.INT_VALUE), // Non JsonObject with int
+      SimpleValues.toJsonValue(SimpleValues.LNG_VALUE), // Non JsonObject with long
+      SimpleValues.toJsonValue(SimpleValues.DBL_VALUE), // Non JsonObject with double
+      SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE), // Non JsonObject with boolean
+      SimpleValues.toJsonValue(SimpleValues.BDC_VALUE), // Non JsonObject with BigDecimal
+      SimpleValues.toJsonValue(SimpleValues.BIN_VALUE), // Non JsonObject with BigInteger
+      SimpleValues.createSimpleObjectStr(), // JsonObject with String
+      SimpleValues.createSimpleObjectInt(), // JsonObject with int
+      SimpleValues.createSimpleObjectBool(), // JsonObject with boolean
+      SimpleValues.createSimpleObjectObject() // JsonObject with JsonObject
   };
 
   /**
@@ -181,15 +181,15 @@
    */
   private void testGetObject(final TestResult result) {
     for (JsonObject value : OBJ_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getObject() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
         parser.next();
         JsonObject out = parser.getObject();
         if (operationFailed(value, out)) {
-          result.fail("getObject()", "Output value " + valueToString(out)
-              + " shall be " + valueToString(value));
+          result.fail("getObject()", "Output value " + JsonAssert.valueToString(out)
+              + " shall be " + JsonAssert.valueToString(value));
         }
       } catch (JsonException ex) {
         LOGGER.info("Caught JsonException: " + ex.getLocalizedMessage());
@@ -204,7 +204,7 @@
    */
   private void testGetNonObject(final TestResult result) {
     for (JsonValue value : NON_OBJ_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getObject() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -227,15 +227,15 @@
    */
   private void testGetArray(final TestResult result) {
     for (JsonArray value : ARRAY_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getArray() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
         parser.next();
         JsonArray out = parser.getArray();
         if (operationFailed(value, out)) {
-          result.fail("getArray()", "Output value " + valueToString(out)
-              + " shall be " + valueToString(value));
+          result.fail("getArray()", "Output value " + JsonAssert.valueToString(out)
+              + " shall be " + JsonAssert.valueToString(value));
         }
       } catch (JsonException ex) {
         LOGGER.info("Caught JsonException: " + ex.getLocalizedMessage());
@@ -250,7 +250,7 @@
    */
   private void testGetNonArray(final TestResult result) {
     for (JsonValue value : NON_ARRAY_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getArray() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -273,15 +273,15 @@
    */
   private void testGetValue(final TestResult result) {
     for (JsonValue value : VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getValue() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
         parser.next();
         JsonValue out = parser.getValue();
         if (operationFailed(value, out)) {
-          result.fail("getValue()", "Output value " + valueToString(out)
-              + " shall be " + valueToString(value));
+          result.fail("getValue()", "Output value " + JsonAssert.valueToString(out)
+              + " shall be " + JsonAssert.valueToString(value));
         }
       } catch (JsonException ex) {
         LOGGER.info("Caught JsonException: " + ex.getLocalizedMessage());
@@ -297,7 +297,7 @@
    */
   private void testGetIllegalValue(final TestResult result) {
     for (JsonValue value : EMPTY_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getValue() on 2nd lexical element of " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -321,7 +321,7 @@
    */
   private void testGetObjectStream(final TestResult result) {
     for (JsonObject value : OBJ_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getObjectStream() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -329,7 +329,7 @@
         Stream<Map.Entry<String, JsonValue>> out = parser.getObjectStream();
         if (operationFailed(value, out)) {
           result.fail("getObjectStream()",
-              "Output Stream shall contain " + valueToString(value));
+              "Output Stream shall contain " + JsonAssert.valueToString(value));
         }
       } catch (JsonException ex) {
         LOGGER.info("Caught JsonException: " + ex.getLocalizedMessage());
@@ -344,7 +344,7 @@
    */
   private void testGetNonObjectStream(final TestResult result) {
     for (JsonValue value : NON_OBJ_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getObjectStream() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -367,7 +367,7 @@
    */
   private void testGetArrayStream(final TestResult result) {
     for (JsonArray value : ARRAY_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getArrayStream() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -375,7 +375,7 @@
         Stream<JsonValue> out = parser.getArrayStream();
         if (operationFailed(value, out)) {
           result.fail("getArrayStream()",
-              "Output Stream shall contain " + valueToString(value));
+              "Output Stream shall contain " + JsonAssert.valueToString(value));
         }
       } catch (JsonException ex) {
         LOGGER.info("Caught JsonException: " + ex.getLocalizedMessage());
@@ -390,7 +390,7 @@
    */
   private void testGetNonArrayStream(final TestResult result) {
     for (JsonValue value : NON_ARRAY_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getArrayStream() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -414,7 +414,7 @@
    */
   private void testGetValueStream(final TestResult result) {
     for (final JsonValue value : VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getValueStream() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -424,7 +424,7 @@
           final JsonValue out = i.next();
           if (operationFailed(value, out)) {
             result.fail("getValueStream()", "Output Stream value "
-                + valueToString(out) + " shall be " + valueToString(value));
+                + JsonAssert.valueToString(out) + " shall be " + JsonAssert.valueToString(value));
           }
           count++;
         }
@@ -444,7 +444,7 @@
    */
   private void testGetCompoundValueStream(final TestResult result) {
     for (final JsonValue value : COMPOUND_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - getValueStream() inside " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -469,7 +469,7 @@
    */
   private void testSkipArray(final TestResult result) {
     for (final JsonArray value : ARRAY_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - skipArray() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -496,7 +496,7 @@
    */
   private void testSkipNonArray(final TestResult result) {
     for (final JsonValue value : NON_ARRAY_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - skipArray() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -505,8 +505,8 @@
         final JsonValue out = parser.getValue();
         if (operationFailed(value, out)) {
           result.fail("skipArray()",
-              "Output value " + valueToString(out) + " shall be "
-                  + valueToString(value) + " even after skipArray()");
+              "Output value " + JsonAssert.valueToString(out) + " shall be "
+                  + JsonAssert.valueToString(value) + " even after skipArray()");
         }
       } catch (Throwable t) {
         LOGGER.info(
@@ -524,7 +524,7 @@
    */
   private void testSkipObject(final TestResult result) {
     for (final JsonObject value : OBJ_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - skipObject() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -551,7 +551,7 @@
    */
   private void testSkipNonObject(final TestResult result) {
     for (final JsonValue value : NON_OBJ_VALUES) {
-      final String data = jsonData(value);
+      final String data = SimpleValues.jsonData(value);
       LOGGER.info(" - skipObject() on " + data);
       final StringReader strReader = new StringReader(data);
       try (final JsonParser parser = Json.createParser(strReader)) {
@@ -560,8 +560,8 @@
         final JsonValue out = parser.getValue();
         if (operationFailed(value, out)) {
           result.fail("skipObject()",
-              "Output value " + valueToString(out) + " shall be "
-                  + valueToString(value) + " even after skipObject()");
+              "Output value " + JsonAssert.valueToString(out) + " shall be "
+                  + JsonAssert.valueToString(value) + " even after skipObject()");
         }
       } catch (Throwable t) {
         LOGGER.info(
@@ -584,8 +584,8 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    LOGGER.info("     Checking " + valueToString(out));
-    return out == null || !assertEquals(check, out);
+    LOGGER.info("     Checking " + JsonAssert.valueToString(out));
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
   /**
@@ -614,11 +614,11 @@
         .hasNext();) {
       final Map.Entry<String, JsonValue> item = i.next();
       final JsonValue checkValue = check.get(item.getKey());
-      LOGGER.info("     Checking " + valueToString(item.getValue()));
+      LOGGER.info("     Checking " + JsonAssert.valueToString(item.getValue()));
       // Operation failed if values with the same key are not equal.
       if (!item.getValue().equals(checkValue)) {
-        LOGGER.info("       check: " + valueToString(checkValue)
-            + " stream: " + valueToString(checkValue));
+        LOGGER.info("       check: " + JsonAssert.valueToString(checkValue)
+            + " stream: " + JsonAssert.valueToString(checkValue));
         return true;
       }
       keys.remove(item.getKey());
@@ -650,10 +650,10 @@
     while (ci.hasNext() && oi.hasNext()) {
       final JsonValue checkValue = ci.next();
       final JsonValue outValue = oi.next();
-      LOGGER.info("     Checking " + valueToString(outValue));
+      LOGGER.info("     Checking " + JsonAssert.valueToString(outValue));
       if (!checkValue.equals(outValue)) {
-        LOGGER.info("       check: " + valueToString(checkValue)
-            + " stream: " + valueToString(checkValue));
+        LOGGER.info("       check: " + JsonAssert.valueToString(checkValue)
+            + " stream: " + JsonAssert.valueToString(checkValue));
         return true;
       }
     }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreaderfactorytests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreaderfactorytests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreaderfactorytests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreaderfactorytests/ClientTests.java
index 225f411..7850ad8 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreaderfactorytests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreaderfactorytests/ClientTests.java
@@ -17,9 +17,10 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonreaderfactorytests;
+package ee.jakarta.tck.jsonp.api.jsonreaderfactorytests;
 
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.*;
 
 import java.io.*;
@@ -27,7 +28,6 @@
 import java.util.Map;
 import java.util.logging.Logger;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreadertests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreadertests/ClientTests.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreadertests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreadertests/ClientTests.java
index d67fd83..b859036 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreadertests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreadertests/ClientTests.java
@@ -14,10 +14,13 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonreadertests;
+package ee.jakarta.tck.jsonp.api.jsonreadertests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
-import jakarta.jsonp.tck.common.*;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+import ee.jakarta.tck.jsonp.common.JSONP_Data;
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
+import ee.jakarta.tck.jsonp.common.MyBufferedInputStream;
+import ee.jakarta.tck.jsonp.common.MyBufferedReader;
 
 import java.io.*;
 import java.util.*;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreadertests/Reader.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreadertests/Reader.java
similarity index 86%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreadertests/Reader.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreadertests/Reader.java
index 80818c2..27df0fa 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonreadertests/Reader.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonreadertests/Reader.java
@@ -14,11 +14,13 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonreadertests;
+package ee.jakarta.tck.jsonp.api.jsonreadertests;
 
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.SimpleValues;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+
 import java.io.File;
 import java.io.FileReader;
 import java.io.FileWriter;
@@ -32,9 +34,6 @@
 import jakarta.json.JsonValue;
 import jakarta.json.stream.JsonParsingException;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests for {@link JsonReader}.
@@ -44,17 +43,17 @@
   private static final Logger LOGGER = Logger.getLogger(Reader.class.getName());
   
   /** Tests input data. */
-  private static final Object[] VALUES = new Object[] { OBJ_VALUE, // readValue()
+  private static final Object[] VALUES = new Object[] { SimpleValues.OBJ_VALUE, // readValue()
                                                                    // for
                                                                    // JsonObject
-      createEmptyArrayWithStr(), // readValue() for simple JsonArray
-      STR_VALUE, // readValue() for String
-      INT_VALUE, // readValue() for int
-      LNG_VALUE, // readValue() for long
-      DBL_VALUE, // readValue() for double
-      BIN_VALUE, // readValue() for BigInteger
-      BDC_VALUE, // readValue() for BigDecimal
-      BOOL_VALUE, // readValue() for boolean
+      SimpleValues.createEmptyArrayWithStr(), // readValue() for simple JsonArray
+      SimpleValues.STR_VALUE, // readValue() for String
+      SimpleValues.INT_VALUE, // readValue() for int
+      SimpleValues.LNG_VALUE, // readValue() for long
+      SimpleValues.DBL_VALUE, // readValue() for double
+      SimpleValues.BIN_VALUE, // readValue() for BigInteger
+      SimpleValues.BDC_VALUE, // readValue() for BigDecimal
+      SimpleValues.BOOL_VALUE, // readValue() for boolean
       null // readValue() for null
   };
 
@@ -106,8 +105,8 @@
             "Caught JsonException: " + ex.getLocalizedMessage());
       }
       if (operationFailed(jsonValue, outValue)) {
-        result.fail("readValue()", "Reader output " + valueToString(outValue)
-            + " value shall be " + valueToString(jsonValue));
+        result.fail("readValue()", "Reader output " + JsonAssert.valueToString(outValue)
+            + " value shall be " + JsonAssert.valueToString(jsonValue));
       }
     }
   }
@@ -167,7 +166,7 @@
       temp = File.createTempFile("testIOExceptionOnReadValue", ".txt");
       LOGGER.info("    - Temporary file: " + temp.getAbsolutePath());
       try (final FileWriter fileWriter = new FileWriter(temp)) {
-        fileWriter.write(JsonValueType.toStringValue(DEF_VALUE));
+        fileWriter.write(JsonValueType.toStringValue(SimpleValues.DEF_VALUE));
       }
       final FileReader fileReader = new FileReader(temp);
       reader = Json.createReader(fileReader);
@@ -205,7 +204,7 @@
   private void testReadInvalidValue(final TestResult result) {
     LOGGER.info(" - readValue() on invalid JSON data");
     // Invalid JSON: starting an array, closing an object.
-    final String data = "[" + SimpleValues.toJsonValue(DEF_VALUE) + "}";
+    final String data = "[" + SimpleValues.toJsonValue(SimpleValues.DEF_VALUE) + "}";
     final StringReader strReader = new StringReader(data);
     JsonValue outValue = null;
     try (final JsonReader reader = Json.createReader(strReader)) {
@@ -233,7 +232,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonstreamingtests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonstreamingtests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonstreamingtests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonstreamingtests/ClientTests.java
index 0741b11..3ed79fd 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonstreamingtests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonstreamingtests/ClientTests.java
@@ -17,15 +17,15 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonstreamingtests;
+package ee.jakarta.tck.jsonp.api.jsonstreamingtests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.*;
 import jakarta.json.stream.*;
 
 import java.io.*;
 import java.util.logging.Logger;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonstringtests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonstringtests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonstringtests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonstringtests/ClientTests.java
index 04282db..595cccc 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonstringtests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonstringtests/ClientTests.java
@@ -17,11 +17,11 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonstringtests;
+package ee.jakarta.tck.jsonp.api.jsonstringtests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.*;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import java.util.logging.Logger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/ClientTests.java
index 50d6710..ce1349c 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/ClientTests.java
@@ -17,10 +17,10 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonvaluetests;
+package ee.jakarta.tck.jsonp.api.jsonvaluetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
-import jakarta.jsonp.tck.common.*;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 
 import jakarta.json.*;
 import org.junit.jupiter.api.Test;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/Structure.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/Structure.java
similarity index 72%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/Structure.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/Structure.java
index 923b254..a447932 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/Structure.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/Structure.java
@@ -14,9 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonvaluetests;
+package ee.jakarta.tck.jsonp.api.jsonvaluetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.PointerRFCObject;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
@@ -26,10 +29,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.PointerRFCObject.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests for
@@ -87,9 +86,9 @@
    *          Tests result record.
    */
   private void testResolveWholeDocument(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
     final JsonValue check = value;
-    verifyGetValue(result, check, value, RFC_KEY_WHOLE);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_KEY_WHOLE);
   }
 
   /**
@@ -100,9 +99,9 @@
    *          Tests result record.
    */
   private void testResolveEmptyName(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL2);
-    verifyGetValue(result, check, value, RFC_PTR2);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL2);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR2);
   }
 
   /**
@@ -113,9 +112,9 @@
    *          Tests result record.
    */
   private void testResolveSimpleArray(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = RFC_VAL1;
-    verifyGetValue(result, check, value, RFC_PTR1);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = PointerRFCObject.RFC_VAL1;
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR1);
   }
 
   /**
@@ -126,9 +125,9 @@
    *          Tests result record.
    */
   private void testResolveSimpleArrayItems(final TestResult result) {
-    final String[] itemPtrs = new String[] { RFC_PTR1_ITEM1, RFC_PTR1_ITEM2 };
-    final String[] itemVals = new String[] { RFC_VAL1_ITEM1, RFC_VAL1_ITEM2 };
-    final JsonObject value = createRFC6901Object();
+    final String[] itemPtrs = new String[] { PointerRFCObject.RFC_PTR1_ITEM1, PointerRFCObject.RFC_PTR1_ITEM2 };
+    final String[] itemVals = new String[] { PointerRFCObject.RFC_VAL1_ITEM1, PointerRFCObject.RFC_VAL1_ITEM2 };
+    final JsonObject value = PointerRFCObject.createRFC6901Object();
     for (int i = 0; i < itemPtrs.length; i++) {
       final JsonValue check = Json.createValue(itemVals[i]);
       verifyGetValue(result, check, value, itemPtrs[i]);
@@ -144,9 +143,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithEncodedSlash(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL3);
-    verifyGetValue(result, check, value, RFC_PTR3_ENC);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL3);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR3_ENC);
   }
 
   /**
@@ -159,8 +158,8 @@
    *          Tests result record.
    */
   private void testResolvePathWithSlash(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    verifyGetValueFail(result, value, RFC_PTR3);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    verifyGetValueFail(result, value, PointerRFCObject.RFC_PTR3);
   }
 
   /**
@@ -171,9 +170,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithPercent(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL4);
-    verifyGetValue(result, check, value, RFC_PTR4);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL4);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR4);
   }
 
   /**
@@ -184,9 +183,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithCaret(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL5);
-    verifyGetValue(result, check, value, RFC_PTR5);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL5);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR5);
   }
 
   /**
@@ -197,9 +196,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithVerticalBar(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL6);
-    verifyGetValue(result, check, value, RFC_PTR6);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL6);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR6);
   }
 
   /**
@@ -210,9 +209,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithBackSlash(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL7);
-    verifyGetValue(result, check, value, RFC_PTR7);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL7);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR7);
   }
 
   /**
@@ -223,9 +222,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithDoubleQuotes(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL8);
-    verifyGetValue(result, check, value, RFC_PTR8);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL8);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR8);
   }
 
   /**
@@ -236,9 +235,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithSpace(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL9);
-    verifyGetValue(result, check, value, RFC_PTR9);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL9);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR9);
   }
 
   /**
@@ -258,15 +257,15 @@
    *          Tests result record.
    */
   private void testResolvePathWithTilde(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR10 + "\" pointer (optional)");
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL10);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR10 + "\" pointer (optional)");
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL10);
     boolean noError = true;
     try {
-      final JsonValue out = value.getValue(RFC_PTR10);
+      final JsonValue out = value.getValue(PointerRFCObject.RFC_PTR10);
       if (operationFailed(check, out)) {
         noError = false;
-        LOGGER.info("    - Pointer \"" + RFC_KEY10
+        LOGGER.info("    - Pointer \"" + PointerRFCObject.RFC_KEY10
             + "\" did not return expected value");
       }
     } catch (JsonException e) {
@@ -288,9 +287,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithEncodedTilde(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL10);
-    verifyGetValue(result, check, value, RFC_KEY10_ENC);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL10);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_KEY10_ENC);
   }
 
   /**
@@ -304,9 +303,9 @@
    *          Tests result record.
    */
   private void testResolvePathWithEncodedTildeOne(final TestResult result) {
-    final JsonStructure value = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL11);
-    verifyGetValue(result, check, value, RFC_PTR11_ENC);
+    final JsonStructure value = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL11);
+    verifyGetValue(result, check, value, PointerRFCObject.RFC_PTR11_ENC);
   }
 
   /**
@@ -325,20 +324,20 @@
   private void testResolveValidNumericIndexInArray(final TestResult result) {
     LOGGER.info(
         " - getValue(String) resolving of pointer containing existing numeric array index");
-    final JsonArray[] arraysIn = new JsonArray[] { createSimpleStringArray5(),
-        createSimpleIntArray5(), createSimpleBoolArray5(),
-        createSimpleObjectArray5() };
-    final JsonValue[] strings = new JsonValue[] { toJsonValue(STR_VALUE_1),
-        toJsonValue(STR_VALUE_2), toJsonValue(STR_VALUE_3),
-        toJsonValue(STR_VALUE_4), toJsonValue(STR_VALUE_5) };
-    final JsonValue[] ints = new JsonValue[] { toJsonValue(INT_VALUE_1),
-        toJsonValue(INT_VALUE_2), toJsonValue(INT_VALUE_3),
-        toJsonValue(INT_VALUE_4), toJsonValue(INT_VALUE_5) };
-    final JsonValue[] bools = new JsonValue[] { toJsonValue(BOOL_FALSE),
-        toJsonValue(BOOL_TRUE), toJsonValue(BOOL_TRUE), toJsonValue(BOOL_FALSE),
-        toJsonValue(BOOL_TRUE) };
-    final JsonValue[] objs = new JsonValue[] { OBJ_VALUE_1, OBJ_VALUE_2,
-        OBJ_VALUE_3, OBJ_VALUE_4, OBJ_VALUE_5 };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createSimpleStringArray5(),
+        SimpleValues.createSimpleIntArray5(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createSimpleObjectArray5() };
+    final JsonValue[] strings = new JsonValue[] { SimpleValues.toJsonValue(SimpleValues.STR_VALUE_1),
+        SimpleValues.toJsonValue(SimpleValues.STR_VALUE_2), SimpleValues.toJsonValue(SimpleValues.STR_VALUE_3),
+        SimpleValues.toJsonValue(SimpleValues.STR_VALUE_4), SimpleValues.toJsonValue(SimpleValues.STR_VALUE_5) };
+    final JsonValue[] ints = new JsonValue[] { SimpleValues.toJsonValue(SimpleValues.INT_VALUE_1),
+        SimpleValues.toJsonValue(SimpleValues.INT_VALUE_2), SimpleValues.toJsonValue(SimpleValues.INT_VALUE_3),
+        SimpleValues.toJsonValue(SimpleValues.INT_VALUE_4), SimpleValues.toJsonValue(SimpleValues.INT_VALUE_5) };
+    final JsonValue[] bools = new JsonValue[] { SimpleValues.toJsonValue(SimpleValues.BOOL_FALSE),
+        SimpleValues.toJsonValue(SimpleValues.BOOL_TRUE), SimpleValues.toJsonValue(SimpleValues.BOOL_TRUE), SimpleValues.toJsonValue(SimpleValues.BOOL_FALSE),
+        SimpleValues.toJsonValue(SimpleValues.BOOL_TRUE) };
+    final JsonValue[] objs = new JsonValue[] { SimpleValues.OBJ_VALUE_1, SimpleValues.OBJ_VALUE_2,
+        SimpleValues.OBJ_VALUE_3, SimpleValues.OBJ_VALUE_4, SimpleValues.OBJ_VALUE_5 };
     final JsonValue[][] checks = new JsonValue[][] { strings, ints, bools,
         objs };
     // Go trough all array types
@@ -376,9 +375,9 @@
    */
   private void testResolveMemberAfterLastInArray(final TestResult result) {
     LOGGER.info(" - getValue(String) resolving of array \"/-\" pointer");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray(), createSimpleIntArray5(), createBoolArray2(),
-        createSimpleObjectArray5() };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray(), SimpleValues.createSimpleIntArray5(), SimpleValues.createBoolArray2(),
+        SimpleValues.createSimpleObjectArray5() };
     for (int i = 0; i < arraysIn.length; i++) {
       try {
         arraysIn[i].getValue("/-");
@@ -403,9 +402,9 @@
   private void testResolveNonNumericIndexInArray(final TestResult result) {
     LOGGER.info(
         " - getValue(String) resolving of pointer containing non numeric array index");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray(), createSimpleIntArray5(), createBoolArray2(),
-        createSimpleObjectArray5() };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray(), SimpleValues.createSimpleIntArray5(), SimpleValues.createBoolArray2(),
+        SimpleValues.createSimpleObjectArray5() };
     final String[] typeNames = new String[] { "empty", "String", "int",
         "boolean", "JsonObject" };
     final String wholeDocument = "";
@@ -484,7 +483,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/Value.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/Value.java
similarity index 64%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/Value.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/Value.java
index 32cc27b..8bff484 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonvaluetests/Value.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonvaluetests/Value.java
@@ -14,18 +14,17 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonvaluetests;
+package ee.jakarta.tck.jsonp.api.jsonvaluetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonObject;
 import jakarta.json.JsonValue;
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests for {@link JsonValue}.
@@ -67,15 +66,15 @@
    */
   private void testAsJsonObject(final TestResult result) {
     LOGGER.info(" - asJsonObject() on JsonObject instances");
-    final JsonObject[] values = { createEmptyObject(), createSimpleObjectStr(),
-        createSimpleObjectInt(), createSimpleObjectBool(),
-        createSimpleObjectObject(), createCompoundObject() };
+    final JsonObject[] values = { SimpleValues.createEmptyObject(), SimpleValues.createSimpleObjectStr(),
+        SimpleValues.createSimpleObjectInt(), SimpleValues.createSimpleObjectBool(),
+        SimpleValues.createSimpleObjectObject(), SimpleValues.createCompoundObject() };
     for (final JsonObject objValue : values) {
       final JsonValue value = objValue;
       final JsonObject out = objValue.asJsonObject();
       if (operationFailed(objValue, out)) {
-        result.fail("asJsonObject()", "Output " + valueToString(out)
-            + " value shall be " + valueToString(objValue));
+        result.fail("asJsonObject()", "Output " + JsonAssert.valueToString(out)
+            + " value shall be " + JsonAssert.valueToString(objValue));
       }
     }
   }
@@ -89,12 +88,12 @@
    */
   private void testAsJsonObjectOnNonObject(final TestResult result) {
     LOGGER.info(" - asJsonObject() on non JsonObject instances");
-    final JsonValue[] values = { createEmptyArrayWithStr(),
-        createEmptyArrayWithInt(), createEmptyArrayWithBool(),
-        createEmptyArrayWithObject(), toJsonValue(STR_VALUE),
-        toJsonValue(INT_VALUE), toJsonValue(LNG_VALUE), toJsonValue(DBL_VALUE),
-        toJsonValue(BIN_VALUE), toJsonValue(BDC_VALUE), toJsonValue(BOOL_VALUE),
-        toJsonValue(null) };
+    final JsonValue[] values = { SimpleValues.createEmptyArrayWithStr(),
+        SimpleValues.createEmptyArrayWithInt(), SimpleValues.createEmptyArrayWithBool(),
+        SimpleValues.createEmptyArrayWithObject(), SimpleValues.toJsonValue(SimpleValues.STR_VALUE),
+        SimpleValues.toJsonValue(SimpleValues.INT_VALUE), SimpleValues.toJsonValue(SimpleValues.LNG_VALUE), SimpleValues.toJsonValue(SimpleValues.DBL_VALUE),
+        SimpleValues.toJsonValue(SimpleValues.BIN_VALUE), SimpleValues.toJsonValue(SimpleValues.BDC_VALUE), SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE),
+        SimpleValues.toJsonValue(null) };
     for (final JsonValue value : values) {
       try {
         value.asJsonObject();
@@ -119,17 +118,17 @@
    */
   private void testAsJsonArray(final TestResult result) {
     LOGGER.info(" - asJsonArray() on JsonArray instances");
-    final JsonArray[] values = { createEmptyArray(), createEmptyArrayWithStr(),
-        createEmptyArrayWithInt(), createEmptyArrayWithBool(),
-        createEmptyArrayWithObject(), createSimpleStringArray5(),
-        createSimpleIntArray5(), createSimpleBoolArray5(),
-        createSimpleObjectArray5() };
+    final JsonArray[] values = { SimpleValues.createEmptyArray(), SimpleValues.createEmptyArrayWithStr(),
+        SimpleValues.createEmptyArrayWithInt(), SimpleValues.createEmptyArrayWithBool(),
+        SimpleValues.createEmptyArrayWithObject(), SimpleValues.createSimpleStringArray5(),
+        SimpleValues.createSimpleIntArray5(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createSimpleObjectArray5() };
     for (final JsonArray objValue : values) {
       final JsonValue value = objValue;
       final JsonArray out = objValue.asJsonArray();
       if (operationFailed(objValue, out)) {
-        result.fail("asJsonArray()", "Output " + valueToString(out)
-            + " value shall be " + valueToString(objValue));
+        result.fail("asJsonArray()", "Output " + JsonAssert.valueToString(out)
+            + " value shall be " + JsonAssert.valueToString(objValue));
       }
     }
   }
@@ -143,12 +142,12 @@
    */
   private void testAsJsonArrayOnNonArray(final TestResult result) {
     LOGGER.info(" - asJsonArray() on non JsonArray instances");
-    final JsonValue[] values = { createSimpleObjectStr(),
-        createSimpleObjectInt(), createSimpleObjectBool(),
-        createSimpleObjectObject(), createCompoundObject(),
-        toJsonValue(STR_VALUE), toJsonValue(INT_VALUE), toJsonValue(LNG_VALUE),
-        toJsonValue(DBL_VALUE), toJsonValue(BIN_VALUE), toJsonValue(BDC_VALUE),
-        toJsonValue(BOOL_VALUE), toJsonValue(null) };
+    final JsonValue[] values = { SimpleValues.createSimpleObjectStr(),
+        SimpleValues.createSimpleObjectInt(), SimpleValues.createSimpleObjectBool(),
+        SimpleValues.createSimpleObjectObject(), SimpleValues.createCompoundObject(),
+        SimpleValues.toJsonValue(SimpleValues.STR_VALUE), SimpleValues.toJsonValue(SimpleValues.INT_VALUE), SimpleValues.toJsonValue(SimpleValues.LNG_VALUE),
+        SimpleValues.toJsonValue(SimpleValues.DBL_VALUE), SimpleValues.toJsonValue(SimpleValues.BIN_VALUE), SimpleValues.toJsonValue(SimpleValues.BDC_VALUE),
+        SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE), SimpleValues.toJsonValue(null) };
     for (final JsonValue value : values) {
       try {
         value.asJsonArray();
@@ -176,7 +175,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwriterfactorytests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwriterfactorytests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwriterfactorytests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwriterfactorytests/ClientTests.java
index aa22708..7a8234f 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwriterfactorytests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwriterfactorytests/ClientTests.java
@@ -17,8 +17,9 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.api.jsonwriterfactorytests;
+package ee.jakarta.tck.jsonp.api.jsonwriterfactorytests;
 
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
 import jakarta.json.*;
 import jakarta.json.stream.*;
 
@@ -27,7 +28,6 @@
 import java.util.Map;
 import java.util.logging.Logger;
 
-import jakarta.jsonp.tck.common.*;
 import org.junit.jupiter.api.Test;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwritertests/ClientTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwritertests/ClientTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwritertests/ClientTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwritertests/ClientTests.java
index 227d21f..2d258ce 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwritertests/ClientTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwritertests/ClientTests.java
@@ -14,10 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonwritertests;
+package ee.jakarta.tck.jsonp.api.jsonwritertests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
-import jakarta.jsonp.tck.common.*;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+import ee.jakarta.tck.jsonp.common.JSONP_Util;
+import ee.jakarta.tck.jsonp.common.MyBufferedWriter;
 
 import java.io.*;
 import java.util.*;
@@ -1072,7 +1073,7 @@
    */
   @Test
   public void jsonWriter11Test() {
-    Writer writerTest = new Writer();
+    ee.jakarta.tck.jsonp.api.jsonwritertests.Writer writerTest = new Writer();
     final TestResult result = writerTest.test();
     result.eval();
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwritertests/Writer.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwritertests/Writer.java
similarity index 85%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwritertests/Writer.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwritertests/Writer.java
index 6f35b1d..59cbef0 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/jsonwritertests/Writer.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/jsonwritertests/Writer.java
@@ -14,11 +14,13 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.jsonwritertests;
+package ee.jakarta.tck.jsonp.api.jsonwritertests;
 
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.SimpleValues;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
+
 import java.io.File;
 import java.io.FileWriter;
 import java.io.IOException;
@@ -32,9 +34,6 @@
 import jakarta.json.JsonWriter;
 import jakarta.json.stream.JsonParser;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests for {@link JsonWriter}.
@@ -44,17 +43,17 @@
   private static final Logger LOGGER = Logger.getLogger(Writer.class.getName());
 
   /** Tests input data. */
-  private static final Object[] VALUES = new Object[] { OBJ_VALUE, // write(JsonValue)
+  private static final Object[] VALUES = new Object[] { SimpleValues.OBJ_VALUE, // write(JsonValue)
                                                                    // for
                                                                    // JsonObject
-      createEmptyArrayWithStr(), // write(JsonValue) for simple JsonArray
-      STR_VALUE, // write(JsonValue) for String
-      INT_VALUE, // write(JsonValue) for int
-      LNG_VALUE, // write(JsonValue) for long
-      DBL_VALUE, // write(JsonValue) for double
-      BIN_VALUE, // write(JsonValue) for BigInteger
-      BDC_VALUE, // write(JsonValue) for BigDecimal
-      BOOL_VALUE, // write(JsonValue) for boolean
+      SimpleValues.createEmptyArrayWithStr(), // write(JsonValue) for simple JsonArray
+      SimpleValues.STR_VALUE, // write(JsonValue) for String
+      SimpleValues.INT_VALUE, // write(JsonValue) for int
+      SimpleValues.LNG_VALUE, // write(JsonValue) for long
+      SimpleValues.DBL_VALUE, // write(JsonValue) for double
+      SimpleValues.BIN_VALUE, // write(JsonValue) for BigInteger
+      SimpleValues.BDC_VALUE, // write(JsonValue) for BigDecimal
+      SimpleValues.BOOL_VALUE, // write(JsonValue) for boolean
       null // write(JsonValue) for null
   };
 
@@ -108,8 +107,8 @@
       final JsonValue outValue = parser.getValue();
       if (operationFailed(jsonValue, outValue)) {
         result.fail("write(JsonValue)",
-            "Writer output " + valueToString(outValue) + " value shall be "
-                + valueToString(jsonValue));
+            "Writer output " + JsonAssert.valueToString(outValue) + " value shall be "
+                + JsonAssert.valueToString(jsonValue));
       }
     }
   }
@@ -162,7 +161,7 @@
   @SuppressWarnings("ConvertToTryWithResources")
   private void testIOExceptionOnWriteValue(final TestResult result) {
     LOGGER.info(" - write(JsonValue) into already closed file writer");
-    final JsonValue jsonValue = SimpleValues.toJsonValue(DEF_VALUE);
+    final JsonValue jsonValue = SimpleValues.toJsonValue(SimpleValues.DEF_VALUE);
     File temp = null;
     JsonWriter writer;
     // Close writer before calling write method.
@@ -207,7 +206,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeAddValue.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeAddValue.java
similarity index 73%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeAddValue.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeAddValue.java
index 0c1a21d..cffcd9e 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeAddValue.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeAddValue.java
@@ -14,15 +14,14 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.mergetests;
+package ee.jakarta.tck.jsonp.api.mergetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.JsonObject;
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 7396: JavaScript Object Notation (JSON) Merge Patch compatibility
@@ -71,9 +70,9 @@
    */
   private void testStringOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for String on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject patch = createSimpleObjectStr();
-    final JsonObject check = createSimpleObjectStr();
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createSimpleObjectStr();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -86,9 +85,9 @@
    */
   private void testStringOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject patch = createSimpleObjectStr();
-    final JsonObject check = createSimpleObjectWithStr();
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createSimpleObjectWithStr();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -101,9 +100,9 @@
    */
   private void testIntOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for int on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject patch = createSimpleObjectInt();
-    final JsonObject check = createSimpleObjectInt();
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createSimpleObjectInt();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -116,9 +115,9 @@
    */
   private void testIntOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject patch = createSimpleObjectInt();
-    final JsonObject check = createSimpleObjectWithInt();
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createSimpleObjectWithInt();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -131,9 +130,9 @@
    */
   private void testBoolOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for boolean on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject patch = createSimpleObjectBool();
-    final JsonObject check = createSimpleObjectBool();
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createSimpleObjectBool();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -146,9 +145,9 @@
    */
   private void testBoolOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject patch = createSimpleObjectBool();
-    final JsonObject check = createSimpleObjectWithBool();
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createSimpleObjectWithBool();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -161,9 +160,9 @@
    */
   private void testObjectOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject patch = createSimpleObjectObject();
-    final JsonObject check = createSimpleObjectObject();
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectObject();
+    final JsonObject check = SimpleValues.createSimpleObjectObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -177,9 +176,9 @@
    */
   private void testObjectOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on compound JSON object");
-    final JsonObject in = createCompoundObject();
-    final JsonObject patch = createSimpleObjectObject();
-    final JsonObject check = createCompoundObjectWithObject();
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectObject();
+    final JsonObject check = SimpleValues.createCompoundObjectWithObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeCommon.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeCommon.java
similarity index 92%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeCommon.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeCommon.java
index 1fc3f03..cadd2f8 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeCommon.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeCommon.java
@@ -14,14 +14,13 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.mergetests;
+package ee.jakarta.tck.jsonp.api.mergetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonValue;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests.<br>
@@ -66,7 +65,7 @@
    */
   protected boolean operationFailed(final JsonValue check, final JsonValue out,
       final String message) {
-    return out == null || !assertEquals(check, out, message);
+    return out == null || !JsonAssert.assertEquals(check, out, message);
   }
 
   /**
@@ -83,12 +82,12 @@
    *          Expected modified JSON object (used for operation check).
    */
   protected void simpleMerge(final TestResult result, final JsonValue in,
-      final JsonValue patch, final JsonValue check) {
+                             final JsonValue patch, final JsonValue check) {
     final JsonValue out = Json.createMergePatch(patch).apply(in);
     if (operationFailed(check, out, MERGE_STR + " mismatch")) {
       final String targetClassName = in.getValueType().name().toLowerCase();
       result.fail(testName(MERGE_STR, targetClassName),
-          testMergeMessage(valueToString(in), valueToString(patch)));
+          testMergeMessage(JsonAssert.valueToString(in), JsonAssert.valueToString(patch)));
     }
   }
 
@@ -112,7 +111,7 @@
       final String srcClassName = src.getValueType().name().toLowerCase();
       final String targetClassName = target.getValueType().name().toLowerCase();
       result.fail(testName(DIFF_STR, srcClassName, targetClassName),
-          testDiffMessage(valueToString(src), valueToString(target)));
+          testDiffMessage(JsonAssert.valueToString(src), JsonAssert.valueToString(target)));
     }
   }
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeNonObject.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeNonObject.java
similarity index 71%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeNonObject.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeNonObject.java
index 147658d..e73b621 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeNonObject.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeNonObject.java
@@ -14,9 +14,10 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.mergetests;
+package ee.jakarta.tck.jsonp.api.mergetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonObject;
@@ -24,8 +25,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 7396: JavaScript Object Notation (JSON) Merge Patch compatibility
@@ -77,9 +76,9 @@
    */
   private void testStringOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for String on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonValue patch = Json.createValue(STR_VALUE);
-    final JsonValue check = Json.createValue(STR_VALUE);
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonValue patch = Json.createValue(SimpleValues.STR_VALUE);
+    final JsonValue check = Json.createValue(SimpleValues.STR_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -92,9 +91,9 @@
    */
   private void testStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObjectWithStr();
-    final JsonValue patch = Json.createValue(STR_VALUE);
-    final JsonValue check = Json.createValue(STR_VALUE);
+    final JsonObject in = SimpleValues.createSimpleObjectWithStr();
+    final JsonValue patch = Json.createValue(SimpleValues.STR_VALUE);
+    final JsonValue check = Json.createValue(SimpleValues.STR_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -107,9 +106,9 @@
    */
   private void testStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array");
-    final JsonArray in = createStringArray2();
-    final JsonValue patch = Json.createValue(STR_VALUE);
-    final JsonValue check = Json.createValue(STR_VALUE);
+    final JsonArray in = SimpleValues.createStringArray2();
+    final JsonValue patch = Json.createValue(SimpleValues.STR_VALUE);
+    final JsonValue check = Json.createValue(SimpleValues.STR_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -122,9 +121,9 @@
    */
   private void testIntOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for int on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonValue patch = Json.createValue(INT_VALUE);
-    final JsonValue check = Json.createValue(INT_VALUE);
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonValue patch = Json.createValue(SimpleValues.INT_VALUE);
+    final JsonValue check = Json.createValue(SimpleValues.INT_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -137,9 +136,9 @@
    */
   private void testIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObjectWithInt();
-    final JsonValue patch = Json.createValue(INT_VALUE);
-    final JsonValue check = Json.createValue(INT_VALUE);
+    final JsonObject in = SimpleValues.createSimpleObjectWithInt();
+    final JsonValue patch = Json.createValue(SimpleValues.INT_VALUE);
+    final JsonValue check = Json.createValue(SimpleValues.INT_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -152,9 +151,9 @@
    */
   private void testIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array");
-    final JsonArray in = createIntArray2();
-    final JsonValue patch = Json.createValue(INT_VALUE);
-    final JsonValue check = Json.createValue(INT_VALUE);
+    final JsonArray in = SimpleValues.createIntArray2();
+    final JsonValue patch = Json.createValue(SimpleValues.INT_VALUE);
+    final JsonValue check = Json.createValue(SimpleValues.INT_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -167,9 +166,9 @@
    */
   private void testBoolOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for boolean on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonValue patch = toJsonValue(BOOL_VALUE);
-    final JsonValue check = toJsonValue(BOOL_VALUE);
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonValue patch = SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE);
+    final JsonValue check = SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -182,9 +181,9 @@
    */
   private void testBoolOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObjectWithBool();
-    final JsonValue patch = toJsonValue(BOOL_VALUE);
-    final JsonValue check = toJsonValue(BOOL_VALUE);
+    final JsonObject in = SimpleValues.createSimpleObjectWithBool();
+    final JsonValue patch = SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE);
+    final JsonValue check = SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -197,9 +196,9 @@
    */
   private void testBoolOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array");
-    final JsonArray in = createBoolArray2();
-    final JsonValue patch = toJsonValue(BOOL_VALUE);
-    final JsonValue check = toJsonValue(BOOL_VALUE);
+    final JsonArray in = SimpleValues.createBoolArray2();
+    final JsonValue patch = SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE);
+    final JsonValue check = SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE);
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -212,9 +211,9 @@
    */
   private void testArrayOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for JsonArray on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonArray patch = createStringArray1();
-    final JsonArray check = createStringArray1();
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonArray patch = SimpleValues.createStringArray1();
+    final JsonArray check = SimpleValues.createStringArray1();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -227,9 +226,9 @@
    */
   private void testArrayOnCompoundObject(final TestResult result) {
     LOGGER.info(" - for JsonArray on compound JSON object");
-    final JsonObject in = createCompoundObject();
-    final JsonValue patch = createStringArray2();
-    final JsonValue check = createStringArray2();
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonValue patch = SimpleValues.createStringArray2();
+    final JsonValue check = SimpleValues.createStringArray2();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -242,9 +241,9 @@
    */
   private void testArrayOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonArray on simple JSON array");
-    final JsonArray in = createBoolArray2();
-    final JsonValue patch = createIntArray2();
-    final JsonValue check = createIntArray2();
+    final JsonArray in = SimpleValues.createBoolArray2();
+    final JsonValue patch = SimpleValues.createIntArray2();
+    final JsonValue check = SimpleValues.createIntArray2();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeRFCSample.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeRFCSample.java
similarity index 79%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeRFCSample.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeRFCSample.java
index e8eddd2..4664964 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeRFCSample.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeRFCSample.java
@@ -14,15 +14,14 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.mergetests;
+package ee.jakarta.tck.jsonp.api.mergetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.MergeRFCObject;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.JsonObject;
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.MergeRFCObject.*;
-
 // $Id$
 /**
  * RFC 7396: JavaScript Object Notation (JSON) Merge Patch compatibility
@@ -63,9 +62,9 @@
    */
   private void testMerge(final TestResult result) {
     LOGGER.info(" - merge");
-    final JsonObject in = createRFCSourceObject();
-    final JsonObject patch = createRFCPatchObject();
-    final JsonObject check = createRFCTargetObject();
+    final JsonObject in = MergeRFCObject.createRFCSourceObject();
+    final JsonObject patch = MergeRFCObject.createRFCPatchObject();
+    final JsonObject check = MergeRFCObject.createRFCTargetObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -78,9 +77,9 @@
    */
   private void testDiff(final TestResult result) {
     LOGGER.info(" - diff");
-    final JsonObject in = createRFCSourceObject();
-    final JsonObject diff = createRFCPatchObject();
-    final JsonObject out = createRFCTargetObject();
+    final JsonObject in = MergeRFCObject.createRFCSourceObject();
+    final JsonObject diff = MergeRFCObject.createRFCPatchObject();
+    final JsonObject out = MergeRFCObject.createRFCTargetObject();
     simpleDiff(result, in, out, diff);
   }
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeRemoveValue.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeRemoveValue.java
similarity index 73%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeRemoveValue.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeRemoveValue.java
index af21f31..83d3b27 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeRemoveValue.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeRemoveValue.java
@@ -14,15 +14,14 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.mergetests;
+package ee.jakarta.tck.jsonp.api.mergetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.JsonObject;
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 7396: JavaScript Object Notation (JSON) Merge Patch compatibility
@@ -71,9 +70,9 @@
    */
   private void testStringOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for String to produce empty JSON object");
-    final JsonObject in = createSimpleObjectStr();
-    final JsonObject patch = createPatchRemoveStr();
-    final JsonObject check = createEmptyObject();
+    final JsonObject in = SimpleValues.createSimpleObjectStr();
+    final JsonObject patch = SimpleValues.createPatchRemoveStr();
+    final JsonObject check = SimpleValues.createEmptyObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -86,9 +85,9 @@
    */
   private void testStringOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObjectWithStr();
-    final JsonObject patch = createPatchRemoveStr();
-    final JsonObject check = createSimpleObject();
+    final JsonObject in = SimpleValues.createSimpleObjectWithStr();
+    final JsonObject patch = SimpleValues.createPatchRemoveStr();
+    final JsonObject check = SimpleValues.createSimpleObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -101,9 +100,9 @@
    */
   private void testIntOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for int to produce empty JSON object");
-    final JsonObject in = createSimpleObjectInt();
-    final JsonObject patch = createPatchRemoveInt();
-    final JsonObject check = createEmptyObject();
+    final JsonObject in = SimpleValues.createSimpleObjectInt();
+    final JsonObject patch = SimpleValues.createPatchRemoveInt();
+    final JsonObject check = SimpleValues.createEmptyObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -116,9 +115,9 @@
    */
   private void testIntOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObjectWithInt();
-    final JsonObject patch = createPatchRemoveInt();
-    final JsonObject check = createSimpleObject();
+    final JsonObject in = SimpleValues.createSimpleObjectWithInt();
+    final JsonObject patch = SimpleValues.createPatchRemoveInt();
+    final JsonObject check = SimpleValues.createSimpleObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -131,9 +130,9 @@
    */
   private void testBoolOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for boolean to produce empty JSON object");
-    final JsonObject in = createSimpleObjectBool();
-    final JsonObject patch = createPatchRemoveBool();
-    final JsonObject check = createEmptyObject();
+    final JsonObject in = SimpleValues.createSimpleObjectBool();
+    final JsonObject patch = SimpleValues.createPatchRemoveBool();
+    final JsonObject check = SimpleValues.createEmptyObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -146,9 +145,9 @@
    */
   private void testBoolOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObjectWithBool();
-    final JsonObject patch = createPatchRemoveBool();
-    final JsonObject check = createSimpleObject();
+    final JsonObject in = SimpleValues.createSimpleObjectWithBool();
+    final JsonObject patch = SimpleValues.createPatchRemoveBool();
+    final JsonObject check = SimpleValues.createSimpleObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -161,9 +160,9 @@
    */
   private void testObjectOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for JsonObject to produce empty JSON object");
-    final JsonObject in = createSimpleObjectObject();
-    final JsonObject patch = createPatchRemoveObject();
-    final JsonObject check = createEmptyObject();
+    final JsonObject in = SimpleValues.createSimpleObjectObject();
+    final JsonObject patch = SimpleValues.createPatchRemoveObject();
+    final JsonObject check = SimpleValues.createEmptyObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -176,9 +175,9 @@
    */
   private void testObjectOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on compoubnd JSON object");
-    final JsonObject in = createCompoundObjectWithObject();
-    final JsonObject patch = createPatchRemoveObject();
-    final JsonObject check = createCompoundObject();
+    final JsonObject in = SimpleValues.createCompoundObjectWithObject();
+    final JsonObject patch = SimpleValues.createPatchRemoveObject();
+    final JsonObject check = SimpleValues.createCompoundObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeReplaceValue.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeReplaceValue.java
similarity index 77%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeReplaceValue.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeReplaceValue.java
index ad24a17..5495fcd 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeReplaceValue.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeReplaceValue.java
@@ -14,15 +14,14 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.mergetests;
+package ee.jakarta.tck.jsonp.api.mergetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.JsonObject;
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 7396: JavaScript Object Notation (JSON) Merge Patch compatibility
@@ -67,9 +66,9 @@
    */
   private void testStringOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject patch = createSimpleObjectMoveStr();
-    final JsonObject check = createSimpleObjectMoveStr();
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectMoveStr();
+    final JsonObject check = SimpleValues.createSimpleObjectMoveStr();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -82,9 +81,9 @@
    */
   private void testIntOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject patch = createSimpleObjectMoveInt();
-    final JsonObject check = createSimpleObjectMoveInt();
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectMoveInt();
+    final JsonObject check = SimpleValues.createSimpleObjectMoveInt();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -97,9 +96,9 @@
    */
   private void testBoolOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject patch = createSimpleObjectMoveBool();
-    final JsonObject check = createSimpleObjectMoveBool();
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectMoveBool();
+    final JsonObject check = SimpleValues.createSimpleObjectMoveBool();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
@@ -113,9 +112,9 @@
    */
   private void testObjectOnsimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject patch = createSimpleObjectMoveObject();
-    final JsonObject check = createSimpleObjectMoveObject();
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject patch = SimpleValues.createSimpleObjectMoveObject();
+    final JsonObject check = SimpleValues.createSimpleObjectMoveObject();
     simpleMerge(result, in, patch, check);
     simpleDiff(result, in, check, patch);
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeTests.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeTests.java
index 510456d..453dcfc 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/mergetests/MergeTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/mergetests/MergeTests.java
@@ -14,9 +14,9 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.mergetests;
+package ee.jakarta.tck.jsonp.api.mergetests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import org.junit.jupiter.api.Test;
 import org.opentest4j.AssertionFailedError;
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/CommonOperation.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/CommonOperation.java
similarity index 90%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/CommonOperation.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/CommonOperation.java
index ed233ef..019b281 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/CommonOperation.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/CommonOperation.java
@@ -14,9 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
@@ -26,9 +28,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests.
@@ -125,24 +124,24 @@
    *          JSON value used in patch operation.
    */
   protected void simpleOperation(final TestResult result, final JsonValue in,
-      final JsonValue check, final String path, final Object value) {
+                                 final JsonValue check, final String path, final Object value) {
     final JsonPatchBuilder builder = createOperationBuilder(path, value);
     final JsonPatch patch = builder.build();
     JsonValue out;
     try {
-      out = patchApply(patch, in);
+      out = SimpleValues.patchApply(patch, in);
     } catch (JsonException e) {
       out = null;
       LOGGER.info(
-          "   Exception for path \"" + path + "\" on " + valueToString(in));
+          "   Exception for path \"" + path + "\" on " + JsonAssert.valueToString(in));
       LOGGER.info("     " + e.getMessage());
     }
     if (operationFailed(check, out)) {
       final String targetClassName = in.getValueType().name().toLowerCase();
-      final String operation = valueToString(patch.toJsonArray());
+      final String operation = JsonAssert.valueToString(patch.toJsonArray());
       LOGGER.info("     " + operation);
       result.fail(testName(path, targetClassName),
-          testMessage(operation, path, valueToString(in)));
+          testMessage(operation, path, JsonAssert.valueToString(in)));
     }
   }
 
@@ -197,13 +196,13 @@
     }
     final JsonPatchBuilder builder = prepareComplexBuilder(paths, values);
     final JsonPatch patch = builder.build();
-    final JsonValue out = patchApply(patch, in);
+    final JsonValue out = SimpleValues.patchApply(patch, in);
     if (operationFailed(check, out)) {
-      final String operations = valueToString(patch.toJsonArray());
+      final String operations = JsonAssert.valueToString(patch.toJsonArray());
       final String targetClassName = in.getValueType().name().toLowerCase();
       LOGGER.info("     " + operations);
       result.fail(testName(paths, targetClassName),
-          testMessage(operations, paths, valueToString(in)));
+          testMessage(operations, paths, JsonAssert.valueToString(in)));
     }
   }
 
@@ -219,7 +218,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
   /**
@@ -258,14 +257,14 @@
       final JsonValue in, final String path, final Object value) {
     try {
       final JsonPatch patch = createOperationBuilder(path, value).build();
-      patchApply(patch, in);
+      SimpleValues.patchApply(patch, in);
       final String targetClassName = in.getValueType().name().toLowerCase();
-      final String operation = valueToString(patch.toJsonArray());
+      final String operation = JsonAssert.valueToString(patch.toJsonArray());
       LOGGER.info(
-          "   Failed for path \"" + path + "\" on " + valueToString(in));
+          "   Failed for path \"" + path + "\" on " + JsonAssert.valueToString(in));
       LOGGER.info("     " + operation);
       result.fail(testName(path, targetClassName),
-          testMessage(operation, path, valueToString(in)));
+          testMessage(operation, path, JsonAssert.valueToString(in)));
     } catch (JsonException e) {
       // There are too many combinations to log them.
       // LOGGER.info(" - Expected exception: "+e.getMessage());
@@ -342,7 +341,7 @@
     final int pathsLen = paths != null ? paths.length : 0;
     int pathsSize = 0;
     for (int i = 0; i < pathsLen; i++) {
-      pathsSize += paths[i] != null ? paths[i].length() : NULL.length();
+      pathsSize += paths[i] != null ? paths[i].length() : SimpleValues.NULL.length();
       if (i > 0) {
         pathsSize += 1;
       }
@@ -361,7 +360,7 @@
       if (i > 0) {
         sb.append(',');
       }
-      sb.append(paths[i] != null ? paths[i] : NULL);
+      sb.append(paths[i] != null ? paths[i] : SimpleValues.NULL);
     }
     if (pathsLen > 1) {
       sb.append(']');
@@ -422,7 +421,7 @@
     final int pathsLen = paths != null ? paths.length : 0;
     int pathsSize = 0;
     for (int i = 0; i < pathsLen; i++) {
-      pathsSize += paths[i] != null ? paths[i].length() : NULL.length();
+      pathsSize += paths[i] != null ? paths[i].length() : SimpleValues.NULL.length();
       if (i > 0) {
         pathsSize += 1;
       }
@@ -443,7 +442,7 @@
       if (i > 0) {
         sb.append(',');
       }
-      sb.append(paths[i] != null ? paths[i] : NULL);
+      sb.append(paths[i] != null ? paths[i] : SimpleValues.NULL);
     }
     if (pathsLen > 1) {
       sb.append(']');
@@ -473,7 +472,7 @@
         : 0;
     int pathsLen = 0;
     for (int i = 0; i < paths.length; i++) {
-      pathsLen += paths[i] != null ? paths[i].length() : NULL.length();
+      pathsLen += paths[i] != null ? paths[i].length() : SimpleValues.NULL.length();
       if (i > 0) {
         pathsLen += 1;
       }
@@ -494,7 +493,7 @@
       if (i > 0) {
         sb.append(',');
       }
-      sb.append(paths[i] != null ? paths[i] : NULL);
+      sb.append(paths[i] != null ? paths[i] : SimpleValues.NULL);
     }
     if (paths.length > 1) {
       sb.append(']');
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchCreate.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchCreate.java
similarity index 78%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchCreate.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchCreate.java
index 3d64b8e..5b7931f 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchCreate.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchCreate.java
@@ -14,16 +14,15 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.*;
-import jakarta.jsonp.tck.api.common.TestResult;
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * JavaScript Object Notation (JSON) compatibility tests: {@link JsonPatch} API
@@ -64,13 +63,13 @@
    */
   private void testCreateDiff(final TestResult result) {
     LOGGER.info(" - Json#createDiff(JsonStructure,JsonStructure)");
-    final JsonObject src = createSimpleObject();
-    final JsonObject trg = createSimpleObjectWithStr();
+    final JsonObject src = SimpleValues.createSimpleObject();
+    final JsonObject trg = SimpleValues.createSimpleObjectWithStr();
     final JsonPatch patch = Json.createDiff(src, trg);
     final JsonObject out = patch.apply(src);
     if (operationFailed(trg, out)) {
       result.fail("createDiff(JsonStructure,JsonStructure)", "Builder output "
-          + valueToString(out) + " value shall be " + valueToString(trg));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(trg));
     }
   }
 
@@ -82,14 +81,14 @@
    */
   private void testCreatePatch(final TestResult result) {
     LOGGER.info(" - Json#createPatch(JsonArray)");
-    final JsonObject src = createSimpleObject();
-    final JsonObject trg = createSimpleObjectWithStr();
+    final JsonObject src = SimpleValues.createSimpleObject();
+    final JsonObject trg = SimpleValues.createSimpleObjectWithStr();
     final JsonArray patchArray = Json.createDiff(src, trg).toJsonArray();
     final JsonPatch patch = Json.createPatch(patchArray);
     final JsonObject out = patch.apply(src);
     if (operationFailed(trg, out)) {
       result.fail("createPatch(JsonArray)", "Builder output "
-          + valueToString(out) + " value shall be " + valueToString(trg));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(trg));
     }
   }
 
@@ -101,14 +100,14 @@
    */
   private void testCreatePatchBuilder(final TestResult result) {
     LOGGER.info(" - Json#createPatchBuilder(JsonArray)");
-    final JsonObject src = createSimpleObject();
-    final JsonObject trg = createSimpleObjectWithStr();
+    final JsonObject src = SimpleValues.createSimpleObject();
+    final JsonObject trg = SimpleValues.createSimpleObjectWithStr();
     final JsonArray patchArray = Json.createDiff(src, trg).toJsonArray();
     final JsonPatchBuilder patchBuilder = Json.createPatchBuilder(patchArray);
     final JsonObject out = patchBuilder.build().apply(src);
     if (operationFailed(trg, out)) {
       result.fail("createPatchBuilder(JsonArray)", "Builder output "
-          + valueToString(out) + " value shall be " + valueToString(trg));
+          + JsonAssert.valueToString(out) + " value shall be " + JsonAssert.valueToString(trg));
     }
   }
 
@@ -124,7 +123,7 @@
    */
   protected boolean operationFailed(final JsonValue check,
       final JsonValue out) {
-    return out == null || !assertEquals(check, out);
+    return out == null || !JsonAssert.assertEquals(check, out);
   }
 
 }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationAdd.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationAdd.java
similarity index 71%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationAdd.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationAdd.java
index 9f0c94d..571cff0 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationAdd.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationAdd.java
@@ -14,10 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonObject;
 import jakarta.json.JsonPatch;
@@ -29,9 +31,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 6902: JavaScript Object Notation (JSON) Patch compatibility tests.<br>
@@ -98,9 +97,9 @@
    */
   private void testAddStringOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for String on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject check = createSimpleObjectStr();
-    simpleOperation(result, in, check, STR_PATH, STR_VALUE);
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject check = SimpleValues.createSimpleObjectStr();
+    simpleOperation(result, in, check, SimpleValues.STR_PATH, SimpleValues.STR_VALUE);
   }
 
   /**
@@ -112,9 +111,9 @@
    */
   private void testAddStringOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for String on empty JSON array");
-    final JsonArray in = createEmptyArray();
-    final JsonArray check = createEmptyArrayWithStr();
-    simpleOperation(result, in, check, "/0", STR_VALUE);
+    final JsonArray in = SimpleValues.createEmptyArray();
+    final JsonArray check = SimpleValues.createEmptyArrayWithStr();
+    simpleOperation(result, in, check, "/0", SimpleValues.STR_VALUE);
   }
 
   /**
@@ -125,9 +124,9 @@
    */
   private void testAddStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject check = createSimpleObjectWithStr();
-    simpleOperation(result, in, check, STR_PATH, STR_VALUE);
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject check = SimpleValues.createSimpleObjectWithStr();
+    simpleOperation(result, in, check, SimpleValues.STR_PATH, SimpleValues.STR_VALUE);
   }
 
   /**
@@ -140,13 +139,13 @@
    */
   private void testAddStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 1");
-    final JsonArray in = createStringArray1();
-    final JsonArray checkBefore = createSimpleStringArrayWithStrBefore();
-    final JsonArray checkAfter = createSimpleStringArrayWithStrAfter();
+    final JsonArray in = SimpleValues.createStringArray1();
+    final JsonArray checkBefore = SimpleValues.createSimpleStringArrayWithStrBefore();
+    final JsonArray checkAfter = SimpleValues.createSimpleStringArrayWithStrAfter();
     // Add before.
-    simpleOperation(result, in, checkBefore, "/0", STR_VALUE);
+    simpleOperation(result, in, checkBefore, "/0", SimpleValues.STR_VALUE);
     // Add after.
-    simpleOperation(result, in, checkAfter, "/1", STR_VALUE);
+    simpleOperation(result, in, checkAfter, "/1", SimpleValues.STR_VALUE);
   }
 
   /**
@@ -164,12 +163,12 @@
    */
   private void testAddStringOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 2");
-    final JsonArray in = createStringArray2();
-    final JsonArray check = createSimpleStringArray5();
+    final JsonArray in = SimpleValues.createStringArray2();
+    final JsonArray check = SimpleValues.createSimpleStringArray5();
     complexOperation(result, in, check, new String[] { "/2", "/1", "/0" },
-        new String[] { STR_VALUE_5, STR_VALUE_3, STR_VALUE_1 });
+        new String[] { SimpleValues.STR_VALUE_5, SimpleValues.STR_VALUE_3, SimpleValues.STR_VALUE_1 });
     complexOperation(result, in, check, new String[] { "/0", "/2", "/4" },
-        new String[] { STR_VALUE_1, STR_VALUE_3, STR_VALUE_5 });
+        new String[] { SimpleValues.STR_VALUE_1, SimpleValues.STR_VALUE_3, SimpleValues.STR_VALUE_5 });
   }
 
   /**
@@ -180,9 +179,9 @@
    */
   private void testAddIntOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for int on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject check = createSimpleObjectInt();
-    simpleOperation(result, in, check, INT_PATH, INT_VALUE);
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject check = SimpleValues.createSimpleObjectInt();
+    simpleOperation(result, in, check, SimpleValues.INT_PATH, SimpleValues.INT_VALUE);
   }
 
   /**
@@ -194,9 +193,9 @@
    */
   private void testAddIntOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for int on empty JSON array");
-    final JsonArray in = createEmptyArray();
-    final JsonArray check = createEmptyArrayWithInt();
-    simpleOperation(result, in, check, "/0", INT_VALUE);
+    final JsonArray in = SimpleValues.createEmptyArray();
+    final JsonArray check = SimpleValues.createEmptyArrayWithInt();
+    simpleOperation(result, in, check, "/0", SimpleValues.INT_VALUE);
   }
 
   /**
@@ -207,9 +206,9 @@
    */
   private void testAddIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject check = createSimpleObjectWithInt();
-    simpleOperation(result, in, check, INT_PATH, INT_VALUE);
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject check = SimpleValues.createSimpleObjectWithInt();
+    simpleOperation(result, in, check, SimpleValues.INT_PATH, SimpleValues.INT_VALUE);
   }
 
   /**
@@ -222,13 +221,13 @@
    */
   private void testAddIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 1");
-    final JsonArray in = createIntArray1();
-    final JsonArray checkBefore = createSimpleIntArrayWithIntBefore();
-    final JsonArray checkAfter = createSimpleIntArrayWithIntAfter();
+    final JsonArray in = SimpleValues.createIntArray1();
+    final JsonArray checkBefore = SimpleValues.createSimpleIntArrayWithIntBefore();
+    final JsonArray checkAfter = SimpleValues.createSimpleIntArrayWithIntAfter();
     // Add before.
-    simpleOperation(result, in, checkBefore, "/0", INT_VALUE);
+    simpleOperation(result, in, checkBefore, "/0", SimpleValues.INT_VALUE);
     // Add after.
-    simpleOperation(result, in, checkAfter, "/1", INT_VALUE);
+    simpleOperation(result, in, checkAfter, "/1", SimpleValues.INT_VALUE);
   }
 
   /**
@@ -246,12 +245,12 @@
    */
   private void testAddIntOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 2");
-    final JsonArray in = createIntArray2();
-    final JsonArray check = createSimpleIntArray5();
+    final JsonArray in = SimpleValues.createIntArray2();
+    final JsonArray check = SimpleValues.createSimpleIntArray5();
     complexOperation(result, in, check, new String[] { "/2", "/1", "/0" },
-        new Integer[] { INT_VALUE_5, INT_VALUE_3, INT_VALUE_1 });
+        new Integer[] { SimpleValues.INT_VALUE_5, SimpleValues.INT_VALUE_3, SimpleValues.INT_VALUE_1 });
     complexOperation(result, in, check, new String[] { "/0", "/2", "/4" },
-        new Integer[] { INT_VALUE_1, INT_VALUE_3, INT_VALUE_5 });
+        new Integer[] { SimpleValues.INT_VALUE_1, SimpleValues.INT_VALUE_3, SimpleValues.INT_VALUE_5 });
   }
 
   /**
@@ -262,9 +261,9 @@
    */
   private void testAddBooleanOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for boolean on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject check = createSimpleObjectBool();
-    simpleOperation(result, in, check, BOOL_PATH, BOOL_VALUE);
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject check = SimpleValues.createSimpleObjectBool();
+    simpleOperation(result, in, check, SimpleValues.BOOL_PATH, SimpleValues.BOOL_VALUE);
   }
 
   /**
@@ -276,9 +275,9 @@
    */
   private void testAddBooleanOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for boolean on empty JSON array");
-    final JsonArray in = createEmptyArray();
-    final JsonArray check = createEmptyArrayWithBool();
-    simpleOperation(result, in, check, "/0", BOOL_VALUE);
+    final JsonArray in = SimpleValues.createEmptyArray();
+    final JsonArray check = SimpleValues.createEmptyArrayWithBool();
+    simpleOperation(result, in, check, "/0", SimpleValues.BOOL_VALUE);
   }
 
   /**
@@ -289,9 +288,9 @@
    */
   private void testAddBooleanOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject check = createSimpleObjectWithBool();
-    simpleOperation(result, in, check, BOOL_PATH, BOOL_VALUE);
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject check = SimpleValues.createSimpleObjectWithBool();
+    simpleOperation(result, in, check, SimpleValues.BOOL_PATH, SimpleValues.BOOL_VALUE);
   }
 
   /**
@@ -304,13 +303,13 @@
    */
   private void testAddBooleanOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 1");
-    final JsonArray in = createBoolArray1();
-    final JsonArray checkBefore = createSimpleBoolArrayWithBoolBefore();
-    final JsonArray checkAfter = createSimpleBoolArrayWithBoolAfter();
+    final JsonArray in = SimpleValues.createBoolArray1();
+    final JsonArray checkBefore = SimpleValues.createSimpleBoolArrayWithBoolBefore();
+    final JsonArray checkAfter = SimpleValues.createSimpleBoolArrayWithBoolAfter();
     // Add before.
-    simpleOperation(result, in, checkBefore, "/0", BOOL_FALSE);
+    simpleOperation(result, in, checkBefore, "/0", SimpleValues.BOOL_FALSE);
     // Add after.
-    simpleOperation(result, in, checkAfter, "/1", BOOL_FALSE);
+    simpleOperation(result, in, checkAfter, "/1", SimpleValues.BOOL_FALSE);
   }
 
   /**
@@ -328,12 +327,12 @@
    */
   private void testAddBooleanOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 2");
-    final JsonArray in = createBoolArray2();
-    final JsonArray check = createSimpleBoolArray5();
+    final JsonArray in = SimpleValues.createBoolArray2();
+    final JsonArray check = SimpleValues.createSimpleBoolArray5();
     complexOperation(result, in, check, new String[] { "/2", "/1", "/0" },
-        new Boolean[] { BOOL_TRUE, BOOL_TRUE, BOOL_FALSE });
+        new Boolean[] { SimpleValues.BOOL_TRUE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE });
     complexOperation(result, in, check, new String[] { "/0", "/2", "/4" },
-        new Boolean[] { BOOL_FALSE, BOOL_TRUE, BOOL_TRUE });
+        new Boolean[] { SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_TRUE });
   }
 
   /**
@@ -344,9 +343,9 @@
    */
   private void testAddObjectOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject check = createSimpleObjectObject();
-    simpleOperation(result, in, check, OBJ_PATH, OBJ_VALUE);
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject check = SimpleValues.createSimpleObjectObject();
+    simpleOperation(result, in, check, SimpleValues.OBJ_PATH, SimpleValues.OBJ_VALUE);
   }
 
   /**
@@ -358,9 +357,9 @@
    */
   private void testAddObjectOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on empty JSON array");
-    final JsonArray in = createEmptyArray();
-    final JsonArray check = createEmptyArrayWithObject();
-    simpleOperation(result, in, check, "/0", OBJ_VALUE);
+    final JsonArray in = SimpleValues.createEmptyArray();
+    final JsonArray check = SimpleValues.createEmptyArrayWithObject();
+    simpleOperation(result, in, check, "/0", SimpleValues.OBJ_VALUE);
   }
 
   /**
@@ -371,9 +370,9 @@
    */
   private void testAddObjectOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createCompoundObject();
-    final JsonObject check = createCompoundObjectWithObject();
-    simpleOperation(result, in, check, OBJ_PATH, OBJ_VALUE);
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonObject check = SimpleValues.createCompoundObjectWithObject();
+    simpleOperation(result, in, check, SimpleValues.OBJ_PATH, SimpleValues.OBJ_VALUE);
   }
 
   /**
@@ -387,13 +386,13 @@
    */
   private void testAddObjectOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 1");
-    final JsonArray in = createObjectArray1();
-    final JsonArray checkBefore = createSimpleObjectArrayWithObjectBefore();
-    final JsonArray checkAfter = createSimpleObjectArrayWithObjectAfter();
+    final JsonArray in = SimpleValues.createObjectArray1();
+    final JsonArray checkBefore = SimpleValues.createSimpleObjectArrayWithObjectBefore();
+    final JsonArray checkAfter = SimpleValues.createSimpleObjectArrayWithObjectAfter();
     // Add before.
-    simpleOperation(result, in, checkBefore, "/0", OBJ_VALUE);
+    simpleOperation(result, in, checkBefore, "/0", SimpleValues.OBJ_VALUE);
     // Add after.
-    simpleOperation(result, in, checkAfter, "/1", OBJ_VALUE);
+    simpleOperation(result, in, checkAfter, "/1", SimpleValues.OBJ_VALUE);
   }
 
   /**
@@ -411,12 +410,12 @@
    */
   private void testAddObjectOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 2");
-    final JsonArray in = createObjectArray2();
-    final JsonArray check = createSimpleObjectArray5();
+    final JsonArray in = SimpleValues.createObjectArray2();
+    final JsonArray check = SimpleValues.createSimpleObjectArray5();
     complexOperation(result, in, check, new String[] { "/2", "/1", "/0" },
-        new JsonObject[] { OBJ_VALUE_5, OBJ_VALUE_3, OBJ_VALUE_1 });
+        new JsonObject[] { SimpleValues.OBJ_VALUE_5, SimpleValues.OBJ_VALUE_3, SimpleValues.OBJ_VALUE_1 });
     complexOperation(result, in, check, new String[] { "/0", "/2", "/4" },
-        new JsonObject[] { OBJ_VALUE_1, OBJ_VALUE_3, OBJ_VALUE_5 });
+        new JsonObject[] { SimpleValues.OBJ_VALUE_1, SimpleValues.OBJ_VALUE_3, SimpleValues.OBJ_VALUE_5 });
   }
 
   // Tests based on RFC 6902 definitions and examples.
@@ -436,10 +435,10 @@
    */
   private void testAddArrayToReplaceObject(final TestResult result) {
     LOGGER.info(" - for JsonArray to replace JsonObject");
-    final JsonObject in = createCompoundObject();
-    final JsonObject check = createCompoundObjectWithObjectReplaced();
-    final JsonArray value = createSimpleStringArray5();
-    simpleOperation(result, in, check, DEF_OBJ_PATH, value);
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonObject check = SimpleValues.createCompoundObjectWithObjectReplaced();
+    final JsonArray value = SimpleValues.createSimpleStringArray5();
+    simpleOperation(result, in, check, SimpleValues.DEF_OBJ_PATH, value);
   }
 
   /**
@@ -456,9 +455,9 @@
    */
   private void testAddArrayToReplaceDocument(final TestResult result) {
     LOGGER.info(" - for JsonArray to replace whole document");
-    final JsonObject in = createCompoundObject();
-    final JsonArray check = createSimpleStringArray5();
-    final JsonArray value = createSimpleStringArray5();
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonArray check = SimpleValues.createSimpleStringArray5();
+    final JsonArray value = SimpleValues.createSimpleStringArray5();
     // Instance being replaced is JsonObject, instance being added is JsonArray.
     // The only API method allowing
     // this is the one working with JsonStructure. New builder instance is used
@@ -466,7 +465,7 @@
     final JsonPatch patch1 = builderAdd(Json.createPatchBuilder(), "", value)
         .build();
     final JsonValue out1 = patch1.apply((JsonStructure) in);
-    if (!assertEquals(check, out1)) {
+    if (!JsonAssert.assertEquals(check, out1)) {
       final String className = value.getClass().getSimpleName();
       result.fail("ADD " + className + " to compound object",
           "ADD operation for " + className + " failed on compound value");
@@ -491,9 +490,9 @@
    */
   private void testAddStringArrayToStringArray(final TestResult result) {
     LOGGER.info(" - for String array to be added to existing String array");
-    final JsonArray in = createStringArray2();
-    final JsonArray check = createStringArray2WithStringArrayInTheMiddle();
-    final JsonArray value = createStringInnerArray2();
+    final JsonArray in = SimpleValues.createStringArray2();
+    final JsonArray check = SimpleValues.createStringArray2WithStringArrayInTheMiddle();
+    final JsonArray value = SimpleValues.createStringInnerArray2();
     simpleOperation(result, in, check, "/1", value);
   }
 
@@ -508,9 +507,9 @@
    */
   private void testAddStringToNonExistingObject(final TestResult result) {
     LOGGER.info(" - for String to be added to non existing JsonObject");
-    final JsonObject in = createSimpleObject();
-    final JsonValue value = Json.createValue(STR_VALUE);
-    final String path = DEF_OBJ_PATH + STR_PATH;
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonValue value = Json.createValue(SimpleValues.STR_VALUE);
+    final String path = SimpleValues.DEF_OBJ_PATH + SimpleValues.STR_PATH;
     final JsonPointer ptr = Json.createPointer(path);
     simpleOperationFail(result, in, path, value);
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationCopy.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationCopy.java
similarity index 71%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationCopy.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationCopy.java
index 43a7360..7aa72f9 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationCopy.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationCopy.java
@@ -14,9 +14,10 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonObject;
@@ -24,8 +25,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 6902: JavaScript Object Notation (JSON) Patch compatibility tests.<br>
@@ -80,9 +79,9 @@
    */
   private void testCopyStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObjectStr();
-    final JsonObject check = createSimpleObjectCopyStr();
-    simpleOperation(result, in, check, STR_PATH, DEF_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createSimpleObjectCopyStr();
+    simpleOperation(result, in, check, SimpleValues.STR_PATH, SimpleValues.DEF_PATH);
   }
 
   /**
@@ -93,10 +92,10 @@
    */
   private void testCopyStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 2");
-    final JsonArray in = createStringArray2();
-    simpleOperation(result, in, createStringArray2Copy1to0(), "/1", "/0");
-    simpleOperation(result, in, createStringArray2Copy0to2(), "/0", "/2");
-    simpleOperation(result, in, createStringArray2Copy0to1(), "/0", "/1");
+    final JsonArray in = SimpleValues.createStringArray2();
+    simpleOperation(result, in, SimpleValues.createStringArray2Copy1to0(), "/1", "/0");
+    simpleOperation(result, in, SimpleValues.createStringArray2Copy0to2(), "/0", "/2");
+    simpleOperation(result, in, SimpleValues.createStringArray2Copy0to1(), "/0", "/1");
   }
 
   /**
@@ -107,9 +106,9 @@
    */
   private void testCopyIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObjectInt();
-    final JsonObject check = createSimpleObjectCopyInt();
-    simpleOperation(result, in, check, INT_PATH, DEF_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createSimpleObjectCopyInt();
+    simpleOperation(result, in, check, SimpleValues.INT_PATH, SimpleValues.DEF_PATH);
   }
 
   /**
@@ -120,10 +119,10 @@
    */
   private void testCopyIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 2");
-    final JsonArray in = createIntArray2();
-    simpleOperation(result, in, createIntArray2Copy1to0(), "/1", "/0");
-    simpleOperation(result, in, createIntArray2Copy0to2(), "/0", "/2");
-    simpleOperation(result, in, createIntArray2Copy0to1(), "/0", "/1");
+    final JsonArray in = SimpleValues.createIntArray2();
+    simpleOperation(result, in, SimpleValues.createIntArray2Copy1to0(), "/1", "/0");
+    simpleOperation(result, in, SimpleValues.createIntArray2Copy0to2(), "/0", "/2");
+    simpleOperation(result, in, SimpleValues.createIntArray2Copy0to1(), "/0", "/1");
   }
 
   /**
@@ -134,9 +133,9 @@
    */
   private void testCopyBoolOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObjectBool();
-    final JsonObject check = createSimpleObjectCopyBool();
-    simpleOperation(result, in, check, BOOL_PATH, DEF_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createSimpleObjectCopyBool();
+    simpleOperation(result, in, check, SimpleValues.BOOL_PATH, SimpleValues.DEF_PATH);
   }
 
   /**
@@ -147,10 +146,10 @@
    */
   private void testCopyBoolOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 2");
-    final JsonArray in = createBoolArray2();
-    simpleOperation(result, in, createBoolArray2Copy1to0(), "/1", "/0");
-    simpleOperation(result, in, createBoolArray2Copy0to2(), "/0", "/2");
-    simpleOperation(result, in, createBoolArray2Copy0to1(), "/0", "/1");
+    final JsonArray in = SimpleValues.createBoolArray2();
+    simpleOperation(result, in, SimpleValues.createBoolArray2Copy1to0(), "/1", "/0");
+    simpleOperation(result, in, SimpleValues.createBoolArray2Copy0to2(), "/0", "/2");
+    simpleOperation(result, in, SimpleValues.createBoolArray2Copy0to1(), "/0", "/1");
   }
 
   /**
@@ -161,9 +160,9 @@
    */
   private void testCopyObjectOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createSimpleObjectObject();
-    final JsonObject check = createSimpleObjectCopyObject();
-    simpleOperation(result, in, check, OBJ_PATH, DEF_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectObject();
+    final JsonObject check = SimpleValues.createSimpleObjectCopyObject();
+    simpleOperation(result, in, check, SimpleValues.OBJ_PATH, SimpleValues.DEF_PATH);
   }
 
   /**
@@ -174,10 +173,10 @@
    */
   private void testCopyObjectOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 2");
-    final JsonArray in = createObjectArray2();
-    simpleOperation(result, in, createObjectArray2Copy1to0(), "/1", "/0");
-    simpleOperation(result, in, createObjectArray2Copy0to2(), "/0", "/2");
-    simpleOperation(result, in, createObjectArray2Copy0to1(), "/0", "/1");
+    final JsonArray in = SimpleValues.createObjectArray2();
+    simpleOperation(result, in, SimpleValues.createObjectArray2Copy1to0(), "/1", "/0");
+    simpleOperation(result, in, SimpleValues.createObjectArray2Copy0to2(), "/0", "/2");
+    simpleOperation(result, in, SimpleValues.createObjectArray2Copy0to1(), "/0", "/1");
   }
 
   /**
@@ -189,9 +188,9 @@
    */
   private void testCopyStringOnCompoundObject(final TestResult result) {
     LOGGER.info(" - for String on compound JSON object");
-    final JsonObject in = createCompoundObject();
-    final JsonObject check = createCompoundObjectCopyValue();
-    simpleOperation(result, in, check, DEF_PATH, DEF_OBJ_PATH + DEF_PATH);
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonObject check = SimpleValues.createCompoundObjectCopyValue();
+    simpleOperation(result, in, check, SimpleValues.DEF_PATH, SimpleValues.DEF_OBJ_PATH + SimpleValues.DEF_PATH);
   }
 
   // Tests based on RFC 6902 definitions and examples.
@@ -204,12 +203,12 @@
    */
   private void testCopyOfNonExistingLocationInObject(final TestResult result) {
     LOGGER.info(" - for non existing location in JsonObject");
-    final JsonObject[] objsIn = new JsonObject[] { createEmptyObject(),
-        createSimpleObject(), createCompoundObject() };
-    final String[] paths = new String[] { STR_PATH, INT_PATH, BOOL_PATH,
-        OBJ_PATH };
-    final Object[] values = new Object[] { OBJ_PATH, BOOL_PATH, INT_PATH,
-        STR_PATH };
+    final JsonObject[] objsIn = new JsonObject[] { SimpleValues.createEmptyObject(),
+        SimpleValues.createSimpleObject(), SimpleValues.createCompoundObject() };
+    final String[] paths = new String[] { SimpleValues.STR_PATH, SimpleValues.INT_PATH, SimpleValues.BOOL_PATH,
+        SimpleValues.OBJ_PATH };
+    final Object[] values = new Object[] { SimpleValues.OBJ_PATH, SimpleValues.BOOL_PATH, SimpleValues.INT_PATH,
+        SimpleValues.STR_PATH };
     // Go trough all objects
     for (int i = 0; i < objsIn.length; i++) {
       // Go trough all paths
@@ -227,11 +226,11 @@
    */
   private void testCopyOfNonExistingLocationInArray(final TestResult result) {
     LOGGER.info(" - for non existing location in JsonArray");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray1(), createIntArray2(), createSimpleBoolArray5(),
-        createObjectArray2() };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray1(), SimpleValues.createIntArray2(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createObjectArray2() };
     final String[] paths = new String[] { "/", "/-1", "/-", "/5", "/0a", "/42",
-        STR_PATH + "/0" };
+        SimpleValues.STR_PATH + "/0" };
     final Object[] values = new Object[] { "/0", "/1", "/2", "/5", "/1" };
     // Go trough all arrays
     for (int i = 0; i < arraysIn.length; i++) {
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationEnum.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationEnum.java
similarity index 96%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationEnum.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationEnum.java
index 3ae293d..d5b17dc 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationEnum.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationEnum.java
@@ -14,9 +14,9 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.JsonPatch;
 
 import java.util.logging.Logger;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationMove.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationMove.java
similarity index 80%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationMove.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationMove.java
index 7136d4e..4131d83 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationMove.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationMove.java
@@ -14,9 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
@@ -28,9 +30,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 6902: JavaScript Object Notation (JSON) Patch compatibility tests.<br>
@@ -89,9 +88,9 @@
    */
   private void testMoveStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObjectStr();
-    final JsonObject check = createSimpleObjectMoveStr();
-    simpleOperation(result, in, check, STR_PATH, DEF_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createSimpleObjectMoveStr();
+    simpleOperation(result, in, check, SimpleValues.STR_PATH, SimpleValues.DEF_PATH);
   }
 
   /**
@@ -102,8 +101,8 @@
    */
   private void testMoveStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 2");
-    final JsonArray in = createStringArray2();
-    final JsonArray check = createStringArray2R();
+    final JsonArray in = SimpleValues.createStringArray2();
+    final JsonArray check = SimpleValues.createStringArray2R();
     simpleOperation(result, in, in, "/0", "/0");
     simpleOperation(result, in, check, "/1", "/0");
     simpleOperation(result, in, check, "/0", "/1");
@@ -118,8 +117,8 @@
    */
   private void testMoveStringOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 5");
-    final JsonArray in = createSimpleStringArray5();
-    final JsonArray check = createSimpleStringArray5R();
+    final JsonArray in = SimpleValues.createSimpleStringArray5();
+    final JsonArray check = SimpleValues.createSimpleStringArray5R();
     complexOperation(result, in, check, new String[] { "/3", "/0", "/3", "/4" },
         new String[] { "/1", "/2", "/1", "/0" });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/0", "/2" },
@@ -134,9 +133,9 @@
    */
   private void testMoveIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObjectInt();
-    final JsonObject check = createSimpleObjectMoveInt();
-    simpleOperation(result, in, check, INT_PATH, DEF_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createSimpleObjectMoveInt();
+    simpleOperation(result, in, check, SimpleValues.INT_PATH, SimpleValues.DEF_PATH);
   }
 
   /**
@@ -147,8 +146,8 @@
    */
   private void testMoveIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 2");
-    final JsonArray in = createIntArray2();
-    final JsonArray check = createIntArray2R();
+    final JsonArray in = SimpleValues.createIntArray2();
+    final JsonArray check = SimpleValues.createIntArray2R();
     simpleOperation(result, in, in, "/0", "/0");
     simpleOperation(result, in, check, "/1", "/0");
     simpleOperation(result, in, check, "/0", "/1");
@@ -163,8 +162,8 @@
    */
   private void testMoveIntOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 5");
-    final JsonArray in = createSimpleIntArray5();
-    final JsonArray check = createSimpleIntArray5R();
+    final JsonArray in = SimpleValues.createSimpleIntArray5();
+    final JsonArray check = SimpleValues.createSimpleIntArray5R();
     complexOperation(result, in, check, new String[] { "/3", "/0", "/3", "/4" },
         new String[] { "/1", "/2", "/1", "/0" });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/0", "/2" },
@@ -179,9 +178,9 @@
    */
   private void testMoveBoolOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObjectBool();
-    final JsonObject check = createSimpleObjectMoveBool();
-    simpleOperation(result, in, check, BOOL_PATH, DEF_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createSimpleObjectMoveBool();
+    simpleOperation(result, in, check, SimpleValues.BOOL_PATH, SimpleValues.DEF_PATH);
   }
 
   /**
@@ -192,8 +191,8 @@
    */
   private void testMoveBoolOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 2");
-    final JsonArray in = createBoolArray2();
-    final JsonArray check = createBoolArray2R();
+    final JsonArray in = SimpleValues.createBoolArray2();
+    final JsonArray check = SimpleValues.createBoolArray2R();
     simpleOperation(result, in, in, "/0", "/0");
     simpleOperation(result, in, check, "/1", "/0");
     simpleOperation(result, in, check, "/0", "/1");
@@ -208,8 +207,8 @@
    */
   private void testMoveBoolOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 5");
-    final JsonArray in = createSimpleBoolArray5();
-    final JsonArray check = createSimpleBoolArray5R();
+    final JsonArray in = SimpleValues.createSimpleBoolArray5();
+    final JsonArray check = SimpleValues.createSimpleBoolArray5R();
     complexOperation(result, in, check, new String[] { "/3", "/0", "/3", "/4" },
         new String[] { "/1", "/2", "/1", "/0" });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/0", "/2" },
@@ -224,9 +223,9 @@
    */
   private void testMoveObjectOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createSimpleObjectObject();
-    final JsonObject check = createSimpleObjectMoveObject();
-    simpleOperation(result, in, check, OBJ_PATH, DEF_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectObject();
+    final JsonObject check = SimpleValues.createSimpleObjectMoveObject();
+    simpleOperation(result, in, check, SimpleValues.OBJ_PATH, SimpleValues.DEF_PATH);
   }
 
   /**
@@ -237,8 +236,8 @@
    */
   private void testMoveObjectOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 2");
-    final JsonArray in = createObjectArray2();
-    final JsonArray check = createObjectArray2R();
+    final JsonArray in = SimpleValues.createObjectArray2();
+    final JsonArray check = SimpleValues.createObjectArray2R();
     simpleOperation(result, in, in, "/0", "/0");
     simpleOperation(result, in, check, "/1", "/0");
     simpleOperation(result, in, check, "/0", "/1");
@@ -253,8 +252,8 @@
    */
   private void testMoveObjectOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 5");
-    final JsonArray in = createSimpleObjectArray5();
-    final JsonArray check = createSimpleObjectArray5R();
+    final JsonArray in = SimpleValues.createSimpleObjectArray5();
+    final JsonArray check = SimpleValues.createSimpleObjectArray5R();
     complexOperation(result, in, check, new String[] { "/3", "/0", "/3", "/4" },
         new String[] { "/1", "/2", "/1", "/0" });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/0", "/2" },
@@ -270,9 +269,9 @@
    */
   private void testMoveStringOnCompoundObject(final TestResult result) {
     LOGGER.info(" - for String on compound JSON object");
-    final JsonObject in = createCompoundObject();
-    final JsonObject check = createCompoundObjectMoveValue();
-    simpleOperation(result, in, check, DEF_PATH, DEF_OBJ_PATH + DEF_PATH);
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonObject check = SimpleValues.createCompoundObjectMoveValue();
+    simpleOperation(result, in, check, SimpleValues.DEF_PATH, SimpleValues.DEF_OBJ_PATH + SimpleValues.DEF_PATH);
   }
 
   // Tests based on RFC 6902 definitions and examples.
@@ -285,12 +284,12 @@
    */
   private void testMoveOfNonExistingLocationInObject(final TestResult result) {
     LOGGER.info(" - for non existing location in JsonObject");
-    final JsonObject[] objsIn = new JsonObject[] { createEmptyObject(),
-        createSimpleObject(), createCompoundObject() };
-    final String[] paths = new String[] { STR_PATH, INT_PATH, BOOL_PATH,
-        OBJ_PATH };
-    final Object[] values = new Object[] { OBJ_PATH, BOOL_PATH, INT_PATH,
-        STR_PATH };
+    final JsonObject[] objsIn = new JsonObject[] { SimpleValues.createEmptyObject(),
+        SimpleValues.createSimpleObject(), SimpleValues.createCompoundObject() };
+    final String[] paths = new String[] { SimpleValues.STR_PATH, SimpleValues.INT_PATH, SimpleValues.BOOL_PATH,
+        SimpleValues.OBJ_PATH };
+    final Object[] values = new Object[] { SimpleValues.OBJ_PATH, SimpleValues.BOOL_PATH, SimpleValues.INT_PATH,
+        SimpleValues.STR_PATH };
     // Go trough all objects
     for (int i = 0; i < objsIn.length; i++) {
       // Go trough all paths
@@ -308,11 +307,11 @@
    */
   private void testMoveOfNonExistingLocationInArray(final TestResult result) {
     LOGGER.info(" - for non existing location in JsonArray");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray1(), createIntArray2(), createSimpleBoolArray5(),
-        createObjectArray2() };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray1(), SimpleValues.createIntArray2(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createObjectArray2() };
     final String[] paths = new String[] { "/", "/-1", "/-", "/5", "/0a", "/42",
-        STR_PATH + "/0" };
+        SimpleValues.STR_PATH + "/0" };
     final Object[] values = new Object[] { "/0", "/1", "/2", "/5", "/1" };
     // Go trough all arrays
     for (int i = 0; i < arraysIn.length; i++) {
@@ -346,14 +345,14 @@
    */
   private void testMoveVsRemoveAddOnSelfContainedPath(final TestResult result) {
     LOGGER.info(" - for moving JsonObject under itself");
-    final JsonObject in = createCompoundObject();
-    final String targetPath = DEF_OBJ_PATH + DEF_PATH;
-    final JsonPointer ptr = Json.createPointer(DEF_OBJ_PATH);
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final String targetPath = SimpleValues.DEF_OBJ_PATH + SimpleValues.DEF_PATH;
+    final JsonPointer ptr = Json.createPointer(SimpleValues.DEF_OBJ_PATH);
     final JsonValue value = ptr.getValue(in);
     final JsonPatchBuilder moveBuilder = Json.createPatchBuilder()
-        .move(targetPath, DEF_OBJ_PATH);
+        .move(targetPath, SimpleValues.DEF_OBJ_PATH);
     final JsonPatchBuilder remAddBuilder = Json.createPatchBuilder()
-        .remove(DEF_OBJ_PATH).add(targetPath, value);
+        .remove(SimpleValues.DEF_OBJ_PATH).add(targetPath, value);
     final JsonPatch movePatch = moveBuilder.build();
     final JsonPatch remAddPatch = remAddBuilder.build();
     // Check REMOVE and ADD sequence first.
@@ -379,7 +378,7 @@
     if (remAddOut != null) {
       // Both output values are not null: Compare them
       if (moveOut != null) {
-        if (!assertEquals(remAddOut, moveOut)) {
+        if (!JsonAssert.assertEquals(remAddOut, moveOut)) {
           result.fail("MOVE vs REMOVE and ADD",
               "Returned values are not equal");
         }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationRemove.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationRemove.java
similarity index 77%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationRemove.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationRemove.java
index 90bc5b3..69e7a61 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationRemove.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationRemove.java
@@ -14,9 +14,10 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonObject;
@@ -24,8 +25,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /*
  * RFC 6902: JavaScript Object Notation (JSON) Patch compatibility tests.<br>
@@ -90,9 +89,9 @@
    */
   private void testRemoveStringOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for String to produce empty JSON object");
-    final JsonObject in = createSimpleObjectStr();
-    final JsonObject check = createEmptyObject();
-    simpleOperation(result, in, check, STR_PATH, null);
+    final JsonObject in = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createEmptyObject();
+    simpleOperation(result, in, check, SimpleValues.STR_PATH, null);
   }
 
   /**
@@ -104,8 +103,8 @@
    */
   private void testRemoveStringOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for String to produce empty JSON array");
-    final JsonArray in = createEmptyArrayWithStr();
-    final JsonArray check = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArrayWithStr();
+    final JsonArray check = SimpleValues.createEmptyArray();
     simpleOperation(result, in, check, "/0", null);
   }
 
@@ -117,9 +116,9 @@
    */
   private void testRemoveStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObjectWithStr();
-    final JsonObject check = createSimpleObject();
-    simpleOperation(result, in, check, STR_PATH, null);
+    final JsonObject in = SimpleValues.createSimpleObjectWithStr();
+    final JsonObject check = SimpleValues.createSimpleObject();
+    simpleOperation(result, in, check, SimpleValues.STR_PATH, null);
   }
 
   /**
@@ -133,9 +132,9 @@
    */
   private void testRemoveStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 2");
-    final JsonArray inBefore = createSimpleStringArrayWithStrBefore();
-    final JsonArray inAfter = createSimpleStringArrayWithStrAfter();
-    final JsonArray check = createStringArray1();
+    final JsonArray inBefore = SimpleValues.createSimpleStringArrayWithStrBefore();
+    final JsonArray inAfter = SimpleValues.createSimpleStringArrayWithStrAfter();
+    final JsonArray check = SimpleValues.createStringArray1();
     simpleOperation(result, inBefore, check, "/0", null);
     simpleOperation(result, inAfter, check, "/1", null);
   }
@@ -155,8 +154,8 @@
    */
   private void testRemoveStringOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 5");
-    final JsonArray in = createSimpleStringArray5();
-    final JsonArray check = createStringArray2();
+    final JsonArray in = SimpleValues.createSimpleStringArray5();
+    final JsonArray check = SimpleValues.createStringArray2();
     complexOperation(result, in, check, new String[] { "/4", "/2", "/0" });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/2" });
   }
@@ -169,9 +168,9 @@
    */
   private void testRemoveIntOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for int to produce empty JSON object");
-    final JsonObject in = createSimpleObjectInt();
-    final JsonObject check = createEmptyObject();
-    simpleOperation(result, in, check, INT_PATH, null);
+    final JsonObject in = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createEmptyObject();
+    simpleOperation(result, in, check, SimpleValues.INT_PATH, null);
   }
 
   /**
@@ -183,8 +182,8 @@
    */
   private void testRemoveIntOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for int to produce empty JSON array");
-    final JsonArray in = createEmptyArrayWithInt();
-    final JsonArray check = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArrayWithInt();
+    final JsonArray check = SimpleValues.createEmptyArray();
     simpleOperation(result, in, check, "/0", null);
   }
 
@@ -196,9 +195,9 @@
    */
   private void testRemoveIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObjectWithInt();
-    final JsonObject check = createSimpleObject();
-    simpleOperation(result, in, check, INT_PATH, null);
+    final JsonObject in = SimpleValues.createSimpleObjectWithInt();
+    final JsonObject check = SimpleValues.createSimpleObject();
+    simpleOperation(result, in, check, SimpleValues.INT_PATH, null);
   }
 
   /**
@@ -212,9 +211,9 @@
    */
   private void testRemoveIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 2");
-    final JsonArray inBefore = createSimpleIntArrayWithIntBefore();
-    final JsonArray inAfter = createSimpleIntArrayWithIntAfter();
-    final JsonArray check = createIntArray1();
+    final JsonArray inBefore = SimpleValues.createSimpleIntArrayWithIntBefore();
+    final JsonArray inAfter = SimpleValues.createSimpleIntArrayWithIntAfter();
+    final JsonArray check = SimpleValues.createIntArray1();
     simpleOperation(result, inBefore, check, "/0", null);
     simpleOperation(result, inAfter, check, "/1", null);
   }
@@ -234,8 +233,8 @@
    */
   private void testRemoveIntOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 5");
-    final JsonArray in = createSimpleIntArray5();
-    final JsonArray check = createIntArray2();
+    final JsonArray in = SimpleValues.createSimpleIntArray5();
+    final JsonArray check = SimpleValues.createIntArray2();
     complexOperation(result, in, check, new String[] { "/4", "/2", "/0" });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/2" });
   }
@@ -249,9 +248,9 @@
    */
   private void testRemoveBoolOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for boolean to produce empty JSON object");
-    final JsonObject in = createSimpleObjectBool();
-    final JsonObject check = createEmptyObject();
-    simpleOperation(result, in, check, BOOL_PATH, null);
+    final JsonObject in = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createEmptyObject();
+    simpleOperation(result, in, check, SimpleValues.BOOL_PATH, null);
   }
 
   /**
@@ -263,8 +262,8 @@
    */
   private void testRemoveBoolOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for boolean to produce empty JSON array");
-    final JsonArray in = createEmptyArrayWithBool();
-    final JsonArray check = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArrayWithBool();
+    final JsonArray check = SimpleValues.createEmptyArray();
     simpleOperation(result, in, check, "/0", null);
   }
 
@@ -276,9 +275,9 @@
    */
   private void testRemoveBoolOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObjectWithBool();
-    final JsonObject check = createSimpleObject();
-    simpleOperation(result, in, check, BOOL_PATH, null);
+    final JsonObject in = SimpleValues.createSimpleObjectWithBool();
+    final JsonObject check = SimpleValues.createSimpleObject();
+    simpleOperation(result, in, check, SimpleValues.BOOL_PATH, null);
   }
 
   /**
@@ -292,9 +291,9 @@
    */
   private void testRemoveBoolOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 2");
-    final JsonArray inBefore = createSimpleBoolArrayWithBoolBefore();
-    final JsonArray inAfter = createSimpleBoolArrayWithBoolAfter();
-    final JsonArray check = createBoolArray1();
+    final JsonArray inBefore = SimpleValues.createSimpleBoolArrayWithBoolBefore();
+    final JsonArray inAfter = SimpleValues.createSimpleBoolArrayWithBoolAfter();
+    final JsonArray check = SimpleValues.createBoolArray1();
     simpleOperation(result, inBefore, check, "/0", null);
     simpleOperation(result, inAfter, check, "/1", null);
   }
@@ -314,8 +313,8 @@
    */
   private void testRemoveBoolOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 5");
-    final JsonArray in = createSimpleBoolArray5();
-    final JsonArray check = createBoolArray2();
+    final JsonArray in = SimpleValues.createSimpleBoolArray5();
+    final JsonArray check = SimpleValues.createBoolArray2();
     complexOperation(result, in, check, new String[] { "/4", "/2", "/0" });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/2" });
   }
@@ -329,9 +328,9 @@
    */
   private void testRemoveObjectOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for JsonObject to produce empty JSON object");
-    final JsonObject in = createSimpleObjectObject();
-    final JsonObject check = createEmptyObject();
-    simpleOperation(result, in, check, OBJ_PATH, null);
+    final JsonObject in = SimpleValues.createSimpleObjectObject();
+    final JsonObject check = SimpleValues.createEmptyObject();
+    simpleOperation(result, in, check, SimpleValues.OBJ_PATH, null);
   }
 
   /**
@@ -343,8 +342,8 @@
    */
   private void testRemoveObjectOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for JsonObject to produce empty JSON array");
-    final JsonArray in = createEmptyArrayWithObject();
-    final JsonArray check = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArrayWithObject();
+    final JsonArray check = SimpleValues.createEmptyArray();
     simpleOperation(result, in, check, "/0", null);
   }
 
@@ -356,9 +355,9 @@
    */
   private void testRemoveObjectOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createCompoundObjectWithObject();
-    final JsonObject check = createCompoundObject();
-    simpleOperation(result, in, check, OBJ_PATH, null);
+    final JsonObject in = SimpleValues.createCompoundObjectWithObject();
+    final JsonObject check = SimpleValues.createCompoundObject();
+    simpleOperation(result, in, check, SimpleValues.OBJ_PATH, null);
   }
 
   /**
@@ -372,9 +371,9 @@
    */
   private void testRemoveObjectOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 2");
-    final JsonArray inBefore = createSimpleObjectArrayWithObjectBefore();
-    final JsonArray inAfter = createSimpleObjectArrayWithObjectAfter();
-    final JsonArray check = createObjectArray1();
+    final JsonArray inBefore = SimpleValues.createSimpleObjectArrayWithObjectBefore();
+    final JsonArray inAfter = SimpleValues.createSimpleObjectArrayWithObjectAfter();
+    final JsonArray check = SimpleValues.createObjectArray1();
     simpleOperation(result, inBefore, check, "/0", null);
     simpleOperation(result, inAfter, check, "/1", null);
   }
@@ -394,8 +393,8 @@
    */
   private void testRemoveObjectOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 5");
-    final JsonArray in = createSimpleObjectArray5();
-    final JsonArray check = createObjectArray2();
+    final JsonArray in = SimpleValues.createSimpleObjectArray5();
+    final JsonArray check = SimpleValues.createObjectArray2();
     complexOperation(result, in, check, new String[] { "/4", "/2", "/0" });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/2" });
   }
@@ -411,10 +410,10 @@
   private void testRemoveFromNonExistingLocationInObject(
       final TestResult result) {
     LOGGER.info(" - for non existing location in JsonObject");
-    final JsonObject[] objsIn = new JsonObject[] { createEmptyObject(),
-        createSimpleObject(), createCompoundObject() };
-    final String[] paths = new String[] { STR_PATH, INT_PATH, BOOL_PATH,
-        OBJ_PATH };
+    final JsonObject[] objsIn = new JsonObject[] { SimpleValues.createEmptyObject(),
+        SimpleValues.createSimpleObject(), SimpleValues.createCompoundObject() };
+    final String[] paths = new String[] { SimpleValues.STR_PATH, SimpleValues.INT_PATH, SimpleValues.BOOL_PATH,
+        SimpleValues.OBJ_PATH };
     // Go trough all objects
     for (int i = 0; i < objsIn.length; i++) {
       // Go trough all paths
@@ -433,13 +432,13 @@
   private void testRemoveFromNonExistingLocationInArray(
       final TestResult result) {
     LOGGER.info(" - for non existing location in JsonArray");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray1(), createIntArray2(), createSimpleBoolArray5(),
-        createObjectArray2()
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray1(), SimpleValues.createIntArray2(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createObjectArray2()
 
     };
     final String[] paths = new String[] { "/", "/-1", "/-", "/5", "/0a", "/42",
-        STR_PATH + "/0" };
+        SimpleValues.STR_PATH + "/0" };
     // Go trough all arrays
     for (int i = 0; i < arraysIn.length; i++) {
       // Go trough all paths
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationReplace.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationReplace.java
similarity index 71%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationReplace.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationReplace.java
index afec8dd..41036af 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationReplace.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationReplace.java
@@ -14,10 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonObject;
@@ -26,8 +27,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 6902: JavaScript Object Notation (JSON) Patch compatibility tests.<br>
@@ -84,9 +83,9 @@
    */
   private void testReplaceStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObjectStr();
-    final JsonObject check = createSimpleObjectReplaceStr();
-    simpleOperation(result, in, check, STR_PATH, STR_VALUE2);
+    final JsonObject in = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createSimpleObjectReplaceStr();
+    simpleOperation(result, in, check, SimpleValues.STR_PATH, SimpleValues.STR_VALUE2);
   }
 
   /**
@@ -97,9 +96,9 @@
    */
   private void testReplaceStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 1");
-    final JsonArray in = createStringArray1();
-    final JsonArray check = createSimpleStringArrayReplaceStr();
-    simpleOperation(result, in, check, "/0", STR_VALUE);
+    final JsonArray in = SimpleValues.createStringArray1();
+    final JsonArray check = SimpleValues.createSimpleStringArrayReplaceStr();
+    simpleOperation(result, in, check, "/0", SimpleValues.STR_VALUE);
   }
 
   /**
@@ -116,12 +115,12 @@
    */
   private void testReplaceStringOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 5");
-    final JsonArray in = createSimpleStringArray5();
-    final JsonArray check = createSimpleStringArray5R();
+    final JsonArray in = SimpleValues.createSimpleStringArray5();
+    final JsonArray check = SimpleValues.createSimpleStringArray5R();
     complexOperation(result, in, check, new String[] { "/4", "/3", "/1", "/0" },
-        new String[] { STR_VALUE_1, STR_VALUE_2, STR_VALUE_4, STR_VALUE_5 });
+        new String[] { SimpleValues.STR_VALUE_1, SimpleValues.STR_VALUE_2, SimpleValues.STR_VALUE_4, SimpleValues.STR_VALUE_5 });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/3", "/4" },
-        new String[] { STR_VALUE_5, STR_VALUE_4, STR_VALUE_2, STR_VALUE_1 });
+        new String[] { SimpleValues.STR_VALUE_5, SimpleValues.STR_VALUE_4, SimpleValues.STR_VALUE_2, SimpleValues.STR_VALUE_1 });
   }
 
   /**
@@ -132,9 +131,9 @@
    */
   private void testReplaceIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObjectInt();
-    final JsonObject check = createSimpleObjectReplaceInt();
-    simpleOperation(result, in, check, INT_PATH, INT_VALUE2);
+    final JsonObject in = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createSimpleObjectReplaceInt();
+    simpleOperation(result, in, check, SimpleValues.INT_PATH, SimpleValues.INT_VALUE2);
   }
 
   /**
@@ -145,9 +144,9 @@
    */
   private void testReplaceIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 1");
-    final JsonArray in = createIntArray1();
-    final JsonArray check = createSimpleIntArrayReplaceInt();
-    simpleOperation(result, in, check, "/0", INT_VALUE);
+    final JsonArray in = SimpleValues.createIntArray1();
+    final JsonArray check = SimpleValues.createSimpleIntArrayReplaceInt();
+    simpleOperation(result, in, check, "/0", SimpleValues.INT_VALUE);
   }
 
   /**
@@ -164,12 +163,12 @@
    */
   private void testReplaceIntOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 5");
-    final JsonArray in = createSimpleIntArray5();
-    final JsonArray check = createSimpleIntArray5R();
+    final JsonArray in = SimpleValues.createSimpleIntArray5();
+    final JsonArray check = SimpleValues.createSimpleIntArray5R();
     complexOperation(result, in, check, new String[] { "/4", "/3", "/1", "/0" },
-        new Integer[] { INT_VALUE_1, INT_VALUE_2, INT_VALUE_4, INT_VALUE_5 });
+        new Integer[] { SimpleValues.INT_VALUE_1, SimpleValues.INT_VALUE_2, SimpleValues.INT_VALUE_4, SimpleValues.INT_VALUE_5 });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/3", "/4" },
-        new Integer[] { INT_VALUE_5, INT_VALUE_4, INT_VALUE_2, INT_VALUE_1 });
+        new Integer[] { SimpleValues.INT_VALUE_5, SimpleValues.INT_VALUE_4, SimpleValues.INT_VALUE_2, SimpleValues.INT_VALUE_1 });
   }
 
   /**
@@ -180,9 +179,9 @@
    */
   private void testReplaceBoolOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObjectBool();
-    final JsonObject check = createSimpleObjectReplaceBool();
-    simpleOperation(result, in, check, BOOL_PATH, BOOL_VALUE2);
+    final JsonObject in = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createSimpleObjectReplaceBool();
+    simpleOperation(result, in, check, SimpleValues.BOOL_PATH, SimpleValues.BOOL_VALUE2);
   }
 
   /**
@@ -193,9 +192,9 @@
    */
   private void testReplaceBoolOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 1");
-    final JsonArray in = createBoolArray1();
-    final JsonArray check = createSimpleBoolArrayReplaceBool();
-    simpleOperation(result, in, check, "/0", BOOL_FALSE);
+    final JsonArray in = SimpleValues.createBoolArray1();
+    final JsonArray check = SimpleValues.createSimpleBoolArrayReplaceBool();
+    simpleOperation(result, in, check, "/0", SimpleValues.BOOL_FALSE);
   }
 
   /**
@@ -212,12 +211,12 @@
    */
   private void testReplaceBoolOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 5");
-    final JsonArray in = createSimpleBoolArray5();
-    final JsonArray check = createSimpleBoolArray5R();
+    final JsonArray in = SimpleValues.createSimpleBoolArray5();
+    final JsonArray check = SimpleValues.createSimpleBoolArray5R();
     complexOperation(result, in, check, new String[] { "/4", "/3", "/1", "/0" },
-        new Boolean[] { BOOL_FALSE, BOOL_TRUE, BOOL_FALSE, BOOL_TRUE });
+        new Boolean[] { SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/3", "/4" },
-        new Boolean[] { BOOL_TRUE, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE });
+        new Boolean[] { SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE });
   }
 
   /**
@@ -229,9 +228,9 @@
    */
   private void testReplaceObjectOnCompoundObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createCompoundObjectWithObject();
-    final JsonObject check = createCompoundObjectReplaceObject();
-    simpleOperation(result, in, check, OBJ_PATH, OBJ_VALUE2);
+    final JsonObject in = SimpleValues.createCompoundObjectWithObject();
+    final JsonObject check = SimpleValues.createCompoundObjectReplaceObject();
+    simpleOperation(result, in, check, SimpleValues.OBJ_PATH, SimpleValues.OBJ_VALUE2);
   }
 
   /**
@@ -242,9 +241,9 @@
    */
   private void testReplaceObjectOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 1");
-    final JsonArray in = createObjectArray1();
-    final JsonArray check = createSimpleObjectArrayReplaceObject();
-    simpleOperation(result, in, check, "/0", OBJ_VALUE);
+    final JsonArray in = SimpleValues.createObjectArray1();
+    final JsonArray check = SimpleValues.createSimpleObjectArrayReplaceObject();
+    simpleOperation(result, in, check, "/0", SimpleValues.OBJ_VALUE);
   }
 
   /**
@@ -262,14 +261,14 @@
    */
   private void testReplaceObjectOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 5");
-    final JsonArray in = createSimpleObjectArray5();
-    final JsonArray check = createSimpleObjectArray5R();
+    final JsonArray in = SimpleValues.createSimpleObjectArray5();
+    final JsonArray check = SimpleValues.createSimpleObjectArray5R();
     complexOperation(result, in, check, new String[] { "/4", "/3", "/1", "/0" },
-        new JsonObject[] { OBJ_VALUE_1, OBJ_VALUE_2, OBJ_VALUE_4,
-            OBJ_VALUE_5 });
+        new JsonObject[] { SimpleValues.OBJ_VALUE_1, SimpleValues.OBJ_VALUE_2, SimpleValues.OBJ_VALUE_4,
+            SimpleValues.OBJ_VALUE_5 });
     complexOperation(result, in, check, new String[] { "/0", "/1", "/3", "/4" },
-        new JsonObject[] { OBJ_VALUE_5, OBJ_VALUE_4, OBJ_VALUE_2,
-            OBJ_VALUE_1 });
+        new JsonObject[] { SimpleValues.OBJ_VALUE_5, SimpleValues.OBJ_VALUE_4, SimpleValues.OBJ_VALUE_2,
+            SimpleValues.OBJ_VALUE_1 });
   }
 
   // Tests based on RFC 6902 definitions and examples.
@@ -283,12 +282,12 @@
   private void testReplaceOfNonExistingLocationInObject(
       final TestResult result) {
     LOGGER.info(" - for non existing location in JsonObject");
-    final JsonObject[] objsIn = new JsonObject[] { createEmptyObject(),
-        createSimpleObject(), createCompoundObject() };
-    final String[] paths = new String[] { STR_PATH, INT_PATH, BOOL_PATH,
-        OBJ_PATH };
-    final Object[] values = new Object[] { STR_VALUE, INT_VALUE, BOOL_VALUE,
-        OBJ_VALUE };
+    final JsonObject[] objsIn = new JsonObject[] { SimpleValues.createEmptyObject(),
+        SimpleValues.createSimpleObject(), SimpleValues.createCompoundObject() };
+    final String[] paths = new String[] { SimpleValues.STR_PATH, SimpleValues.INT_PATH, SimpleValues.BOOL_PATH,
+        SimpleValues.OBJ_PATH };
+    final Object[] values = new Object[] { SimpleValues.STR_VALUE, SimpleValues.INT_VALUE, SimpleValues.BOOL_VALUE,
+        SimpleValues.OBJ_VALUE };
     // Go trough all objects
     for (int i = 0; i < objsIn.length; i++) {
       // Go trough all paths
@@ -307,13 +306,13 @@
   private void testReplaceOfNonExistingLocationInArray(
       final TestResult result) {
     LOGGER.info(" - for non existing location in JsonArray");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray1(), createIntArray2(), createSimpleBoolArray5(),
-        createObjectArray2() };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray1(), SimpleValues.createIntArray2(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createObjectArray2() };
     final String[] paths = new String[] { "/", "/-1", "/-", "/5", "/0a", "/42",
-        STR_PATH + "/0" };
-    final Object[] values = new Object[] { STR_VALUE, STR_VALUE, INT_VALUE,
-        BOOL_VALUE, OBJ_VALUE };
+        SimpleValues.STR_PATH + "/0" };
+    final Object[] values = new Object[] { SimpleValues.STR_VALUE, SimpleValues.STR_VALUE, SimpleValues.INT_VALUE,
+        SimpleValues.BOOL_VALUE, SimpleValues.OBJ_VALUE };
     // Go trough all arrays
     for (int i = 0; i < arraysIn.length; i++) {
       // Go trough all paths
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationTest.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationTest.java
similarity index 82%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationTest.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationTest.java
index 3bbd346..1ae23c3 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchOperationTest.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchOperationTest.java
@@ -14,10 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
-import jakarta.jsonp.tck.api.common.JsonValueType;
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonValueType;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonObject;
@@ -26,8 +27,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * RFC 6902: JavaScript Object Notation (JSON) Patch compatibility tests.<br>
@@ -77,11 +76,11 @@
    */
   private void testOnEmptyObject(final TestResult result) {
     LOGGER.info(" - on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final String[] paths = new String[] { STR_PATH, INT_PATH, BOOL_PATH,
-        OBJ_PATH };
-    final Object[] values = new Object[] { STR_VALUE, INT_VALUE, BOOL_VALUE,
-        OBJ_VALUE };
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final String[] paths = new String[] { SimpleValues.STR_PATH, SimpleValues.INT_PATH, SimpleValues.BOOL_PATH,
+        SimpleValues.OBJ_PATH };
+    final Object[] values = new Object[] { SimpleValues.STR_VALUE, SimpleValues.INT_VALUE, SimpleValues.BOOL_VALUE,
+        SimpleValues.OBJ_VALUE };
     // Go trough all values.
     for (int i = 0; i < values.length; i++) {
       // Go trough all paths.
@@ -102,11 +101,11 @@
    */
   private void testOnEmptyArray(final TestResult result) {
     LOGGER.info(" - on empty JSON array");
-    final JsonArray in = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArray();
     final String[] paths = new String[] { "/-1", "/0", "/1", "/2", "/3", "/4",
         "/5", "/-" };
-    final Object[] values = new Object[] { STR_VALUE, INT_VALUE, BOOL_VALUE,
-        OBJ_VALUE };
+    final Object[] values = new Object[] { SimpleValues.STR_VALUE, SimpleValues.INT_VALUE, SimpleValues.BOOL_VALUE,
+        SimpleValues.OBJ_VALUE };
     // Go trough all values.
     for (int i = 0; i < values.length; i++) {
       // Go trough all paths.
@@ -127,13 +126,13 @@
    */
   private void testOnSimpleObject(final TestResult result) {
     LOGGER.info(" - on simple JSON object");
-    final JsonObject[] in = new JsonObject[] { createSimpleObjectStr(),
-        createSimpleObjectInt(), createSimpleObjectBool(),
-        createSimpleObjectObject() };
-    final String[] paths = new String[] { STR_PATH, INT_PATH, BOOL_PATH,
-        OBJ_PATH };
-    final Object[] values = new Object[] { STR_VALUE, INT_VALUE, BOOL_VALUE,
-        OBJ_VALUE };
+    final JsonObject[] in = new JsonObject[] { SimpleValues.createSimpleObjectStr(),
+        SimpleValues.createSimpleObjectInt(), SimpleValues.createSimpleObjectBool(),
+        SimpleValues.createSimpleObjectObject() };
+    final String[] paths = new String[] { SimpleValues.STR_PATH, SimpleValues.INT_PATH, SimpleValues.BOOL_PATH,
+        SimpleValues.OBJ_PATH };
+    final Object[] values = new Object[] { SimpleValues.STR_VALUE, SimpleValues.INT_VALUE, SimpleValues.BOOL_VALUE,
+        SimpleValues.OBJ_VALUE };
     // go trough all source objects.
     for (int o = 0; o < in.length; o++) {
       // Go trough all values.
@@ -162,10 +161,10 @@
    */
   private void testOnSimpleStringArray(final TestResult result) {
     LOGGER.info(" - on simple JSON String array of size 5");
-    final JsonArray in = createSimpleStringArray5();
-    final String[] indexes = new String[] { "/-1", "/-", STR_PATH };
-    final String[] values = new String[] { STR_VALUE_1, STR_VALUE_2,
-        STR_VALUE_3, STR_VALUE_4, STR_VALUE_5 };
+    final JsonArray in = SimpleValues.createSimpleStringArray5();
+    final String[] indexes = new String[] { "/-1", "/-", SimpleValues.STR_PATH };
+    final String[] values = new String[] { SimpleValues.STR_VALUE_1, SimpleValues.STR_VALUE_2,
+        SimpleValues.STR_VALUE_3, SimpleValues.STR_VALUE_4, SimpleValues.STR_VALUE_5 };
     // Go trough all array indexes.
     for (int i = 0; i <= 5; i++) {
       final String path = arrayPtr("/", i);
@@ -200,10 +199,10 @@
    */
   private void testOnSimpleIntArray(final TestResult result) {
     LOGGER.info(" - on simple JSON int array of size 5");
-    final JsonArray in = createSimpleIntArray5();
-    final String[] indexes = new String[] { "/-1", "/-", INT_PATH };
-    final int[] values = new int[] { INT_VALUE_1, INT_VALUE_2, INT_VALUE_3,
-        INT_VALUE_4, INT_VALUE_5 };
+    final JsonArray in = SimpleValues.createSimpleIntArray5();
+    final String[] indexes = new String[] { "/-1", "/-", SimpleValues.INT_PATH };
+    final int[] values = new int[] { SimpleValues.INT_VALUE_1, SimpleValues.INT_VALUE_2, SimpleValues.INT_VALUE_3,
+        SimpleValues.INT_VALUE_4, SimpleValues.INT_VALUE_5 };
     // Go trough all array indexes.
     for (int i = 0; i <= 5; i++) {
       final String path = arrayPtr("/", i);
@@ -238,9 +237,9 @@
    */
   private void testOnSimpleBoolArray(final TestResult result) {
     LOGGER.info(" - on simple JSON boolean array of size 2");
-    final JsonArray in = createBoolArray2();
-    final String[] indexes = new String[] { "/-1", "/-", BOOL_PATH };
-    final boolean[] values = new boolean[] { BOOL_TRUE, BOOL_FALSE };
+    final JsonArray in = SimpleValues.createBoolArray2();
+    final String[] indexes = new String[] { "/-1", "/-", SimpleValues.BOOL_PATH };
+    final boolean[] values = new boolean[] { SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE };
     // Go trough all array indexes.
     for (int i = 0; i <= 2; i++) {
       final String path = arrayPtr("/", i);
@@ -275,10 +274,10 @@
    */
   private void testOnSimpleObjectArray(final TestResult result) {
     LOGGER.info(" - on simple JSON JsonObject array of size 5");
-    final JsonArray in = createSimpleObjectArray5();
-    final String[] indexes = new String[] { "/-1", "/-", OBJ_PATH };
-    final JsonObject[] values = new JsonObject[] { OBJ_VALUE_1, OBJ_VALUE_2,
-        OBJ_VALUE_3, OBJ_VALUE_4, OBJ_VALUE_5 };
+    final JsonArray in = SimpleValues.createSimpleObjectArray5();
+    final String[] indexes = new String[] { "/-1", "/-", SimpleValues.OBJ_PATH };
+    final JsonObject[] values = new JsonObject[] { SimpleValues.OBJ_VALUE_1, SimpleValues.OBJ_VALUE_2,
+        SimpleValues.OBJ_VALUE_3, SimpleValues.OBJ_VALUE_4, SimpleValues.OBJ_VALUE_5 };
     // Go trough all array indexes.
     for (int i = 0; i <= 5; i++) {
       final String path = arrayPtr("/", i);
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchTests.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchTests.java
index bf2e551..b5cb0f6 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/patchtests/PatchTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/patchtests/PatchTests.java
@@ -14,10 +14,10 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.patchtests;
+package ee.jakarta.tck.jsonp.api.patchtests;
 
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.JsonPatch;
-import jakarta.jsonp.tck.api.common.TestResult;
 import org.junit.jupiter.api.Test;
 import org.opentest4j.AssertionFailedError;
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerAdd.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerAdd.java
similarity index 66%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerAdd.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerAdd.java
index ed4f8df..bbdb18b 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerAdd.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerAdd.java
@@ -14,9 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.pointertests;
+package ee.jakarta.tck.jsonp.api.pointertests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
@@ -26,9 +28,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * {@see <a href="https://tools.ietf.org/html/rfc6901">RFC 6901</a>}: pointer
@@ -92,13 +91,13 @@
    */
   private void testAddStringOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for String on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject check = createSimpleObjectStr();
-    final JsonPointer ptr = Json.createPointer(STR_PATH);
-    final JsonObject out = ptr.add(in, Json.createValue(STR_VALUE));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + STR_PATH + "\" ADD \""
-          + STR_VALUE + "\" failed on empty JSON object");
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject check = SimpleValues.createSimpleObjectStr();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.STR_PATH);
+    final JsonObject out = ptr.add(in, Json.createValue(SimpleValues.STR_VALUE));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.STR_PATH + "\" ADD \""
+          + SimpleValues.STR_VALUE + "\" failed on empty JSON object");
     }
   }
 
@@ -111,15 +110,15 @@
    */
   private void testAddStringOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for String on empty JSON array");
-    final JsonArray in = createEmptyArray();
-    final JsonArray check = createEmptyArrayWithStr();
+    final JsonArray in = SimpleValues.createEmptyArray();
+    final JsonArray check = SimpleValues.createEmptyArrayWithStr();
     final JsonPointer[] ptrs = new JsonPointer[] { Json.createPointer("/0"),
         Json.createPointer("/-") };
     for (final JsonPointer ptr : ptrs) {
-      final JsonArray out = ptr.add(in, Json.createValue(STR_VALUE));
-      if (!assertEquals(check, out)) {
+      final JsonArray out = ptr.add(in, Json.createValue(SimpleValues.STR_VALUE));
+      if (!JsonAssert.assertEquals(check, out)) {
         result.fail("Pointer ADD operation", "Pointer \"" + ptr + "\" ADD \""
-            + STR_VALUE + "\" failed on empty JSON array");
+            + SimpleValues.STR_VALUE + "\" failed on empty JSON array");
       }
     }
   }
@@ -132,13 +131,13 @@
    */
   private void testAddStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject check = createSimpleObjectWithStr();
-    final JsonPointer ptr = Json.createPointer(STR_PATH);
-    final JsonObject out = ptr.add(in, Json.createValue(STR_VALUE));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + STR_PATH + "\" ADD \""
-          + STR_VALUE + "\" failed on simple JSON object");
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject check = SimpleValues.createSimpleObjectWithStr();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.STR_PATH);
+    final JsonObject out = ptr.add(in, Json.createValue(SimpleValues.STR_VALUE));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.STR_PATH + "\" ADD \""
+          + SimpleValues.STR_VALUE + "\" failed on simple JSON object");
     }
   }
 
@@ -153,21 +152,21 @@
    */
   private void testAddStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 1");
-    final JsonArray in = createStringArray1();
-    final JsonArray checkBefore = createSimpleStringArrayWithStrBefore();
-    final JsonArray checkAfter = createSimpleStringArrayWithStrAfter();
+    final JsonArray in = SimpleValues.createStringArray1();
+    final JsonArray checkBefore = SimpleValues.createSimpleStringArrayWithStrBefore();
+    final JsonArray checkAfter = SimpleValues.createSimpleStringArrayWithStrAfter();
     final JsonPointer ptrBefore = Json.createPointer("/0");
     final JsonPointer[] ptrsAfter = new JsonPointer[] {
         Json.createPointer("/1"), Json.createPointer("/-") };
-    final JsonArray outBefore = ptrBefore.add(in, Json.createValue(STR_VALUE));
-    if (!assertEquals(checkBefore, outBefore)) {
-      result.fail("Pointer ADD operation", "Pointer \"/0\" ADD \"" + STR_VALUE
+    final JsonArray outBefore = ptrBefore.add(in, Json.createValue(SimpleValues.STR_VALUE));
+    if (!JsonAssert.assertEquals(checkBefore, outBefore)) {
+      result.fail("Pointer ADD operation", "Pointer \"/0\" ADD \"" + SimpleValues.STR_VALUE
           + "\" failed on simple JSON array");
     }
     for (final JsonPointer ptrAfter : ptrsAfter) {
-      final JsonArray outAfter = ptrAfter.add(in, Json.createValue(STR_VALUE));
-      if (!assertEquals(checkAfter, outAfter)) {
-        result.fail("Pointer ADD operation", "Pointer \"/1\" ADD \"" + STR_VALUE
+      final JsonArray outAfter = ptrAfter.add(in, Json.createValue(SimpleValues.STR_VALUE));
+      if (!JsonAssert.assertEquals(checkAfter, outAfter)) {
+        result.fail("Pointer ADD operation", "Pointer \"/1\" ADD \"" + SimpleValues.STR_VALUE
             + "\" failed on simple JSON array");
       }
     }
@@ -188,14 +187,14 @@
    */
   private void testAddStringOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 2");
-    final JsonArray in = createStringArray2();
-    final JsonArray check = createSimpleStringArray5();
+    final JsonArray in = SimpleValues.createStringArray2();
+    final JsonArray check = SimpleValues.createSimpleStringArray5();
     verifyAddValues(result, in, check, new String[] { "/2", "/1", "/0" },
-        new String[] { STR_VALUE_5, STR_VALUE_3, STR_VALUE_1 },
+        new String[] { SimpleValues.STR_VALUE_5, SimpleValues.STR_VALUE_3, SimpleValues.STR_VALUE_1 },
         "Pointer ADD operation",
         "Pointers \"/2\", \"/1\", \"/0\" ADD sequence failed on simple JSON array");
     verifyAddValues(result, in, check, new String[] { "/0", "/2", "/4" },
-        new String[] { STR_VALUE_1, STR_VALUE_3, STR_VALUE_5 },
+        new String[] { SimpleValues.STR_VALUE_1, SimpleValues.STR_VALUE_3, SimpleValues.STR_VALUE_5 },
         "Pointer ADD operation",
         "Pointers \"/0\", \"/2\", \"/4\" ADD sequence failed on simple JSON array");
   }
@@ -208,13 +207,13 @@
    */
   private void testAddIntOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for int on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject check = createSimpleObjectInt();
-    final JsonPointer ptr = Json.createPointer(INT_PATH);
-    final JsonObject out = ptr.add(in, Json.createValue(INT_VALUE));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + INT_PATH + "\" ADD \""
-          + INT_VALUE + "\" failed on empty JSON object");
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject check = SimpleValues.createSimpleObjectInt();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.INT_PATH);
+    final JsonObject out = ptr.add(in, Json.createValue(SimpleValues.INT_VALUE));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.INT_PATH + "\" ADD \""
+          + SimpleValues.INT_VALUE + "\" failed on empty JSON object");
     }
   }
 
@@ -227,15 +226,15 @@
    */
   private void testAddIntOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for int on empty JSON array");
-    final JsonArray in = createEmptyArray();
-    final JsonArray check = createEmptyArrayWithInt();
+    final JsonArray in = SimpleValues.createEmptyArray();
+    final JsonArray check = SimpleValues.createEmptyArrayWithInt();
     final JsonPointer[] ptrs = new JsonPointer[] { Json.createPointer("/0"),
         Json.createPointer("/-") };
     for (final JsonPointer ptr : ptrs) {
-      final JsonArray out = ptr.add(in, Json.createValue(INT_VALUE));
-      if (!assertEquals(check, out)) {
+      final JsonArray out = ptr.add(in, Json.createValue(SimpleValues.INT_VALUE));
+      if (!JsonAssert.assertEquals(check, out)) {
         result.fail("Pointer ADD operation", "Pointer \"" + ptr + "\" ADD \""
-            + INT_VALUE + "\" failed on empty JSON array");
+            + SimpleValues.INT_VALUE + "\" failed on empty JSON array");
       }
     }
   }
@@ -248,13 +247,13 @@
    */
   private void testAddIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject check = createSimpleObjectWithInt();
-    final JsonPointer ptr = Json.createPointer(INT_PATH);
-    final JsonObject out = ptr.add(in, Json.createValue(INT_VALUE));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + INT_PATH + "\" ADD \""
-          + INT_VALUE + "\" failed on simple JSON object");
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject check = SimpleValues.createSimpleObjectWithInt();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.INT_PATH);
+    final JsonObject out = ptr.add(in, Json.createValue(SimpleValues.INT_VALUE));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.INT_PATH + "\" ADD \""
+          + SimpleValues.INT_VALUE + "\" failed on simple JSON object");
     }
   }
 
@@ -269,21 +268,21 @@
    */
   private void testAddIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 1");
-    final JsonArray in = createIntArray1();
-    final JsonArray checkBefore = createSimpleIntArrayWithIntBefore();
-    final JsonArray checkAfter = createSimpleIntArrayWithIntAfter();
+    final JsonArray in = SimpleValues.createIntArray1();
+    final JsonArray checkBefore = SimpleValues.createSimpleIntArrayWithIntBefore();
+    final JsonArray checkAfter = SimpleValues.createSimpleIntArrayWithIntAfter();
     final JsonPointer ptrBefore = Json.createPointer("/0");
     final JsonPointer[] ptrsAfter = new JsonPointer[] {
         Json.createPointer("/1"), Json.createPointer("/-") };
-    final JsonArray outBefore = ptrBefore.add(in, Json.createValue(INT_VALUE));
-    if (!assertEquals(checkBefore, outBefore)) {
-      result.fail("Pointer ADD operation", "Pointer \"/0\" ADD \"" + INT_VALUE
+    final JsonArray outBefore = ptrBefore.add(in, Json.createValue(SimpleValues.INT_VALUE));
+    if (!JsonAssert.assertEquals(checkBefore, outBefore)) {
+      result.fail("Pointer ADD operation", "Pointer \"/0\" ADD \"" + SimpleValues.INT_VALUE
           + "\" failed on simple JSON array");
     }
     for (final JsonPointer ptrAfter : ptrsAfter) {
-      final JsonArray outAfter = ptrAfter.add(in, Json.createValue(INT_VALUE));
-      if (!assertEquals(checkAfter, outAfter)) {
-        result.fail("Pointer ADD operation", "Pointer \"/1\" ADD \"" + INT_VALUE
+      final JsonArray outAfter = ptrAfter.add(in, Json.createValue(SimpleValues.INT_VALUE));
+      if (!JsonAssert.assertEquals(checkAfter, outAfter)) {
+        result.fail("Pointer ADD operation", "Pointer \"/1\" ADD \"" + SimpleValues.INT_VALUE
             + "\" failed on simple JSON array");
       }
     }
@@ -304,14 +303,14 @@
    */
   private void testAddIntOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 2");
-    final JsonArray in = createIntArray2();
-    final JsonArray check = createSimpleIntArray5();
+    final JsonArray in = SimpleValues.createIntArray2();
+    final JsonArray check = SimpleValues.createSimpleIntArray5();
     verifyAddValues(result, in, check, new String[] { "/2", "/1", "/0" },
-        new Integer[] { INT_VALUE_5, INT_VALUE_3, INT_VALUE_1 },
+        new Integer[] { SimpleValues.INT_VALUE_5, SimpleValues.INT_VALUE_3, SimpleValues.INT_VALUE_1 },
         "Pointer ADD operation",
         "Pointers \"/2\", \"/1\", \"/0\" ADD sequence failed on simple JSON array");
     verifyAddValues(result, in, check, new String[] { "/0", "/2", "/4" },
-        new Integer[] { INT_VALUE_1, INT_VALUE_3, INT_VALUE_5 },
+        new Integer[] { SimpleValues.INT_VALUE_1, SimpleValues.INT_VALUE_3, SimpleValues.INT_VALUE_5 },
         "Pointer ADD operation",
         "Pointers \"/0\", \"/2\", \"/4\" ADD sequence failed on simple JSON array");
   }
@@ -324,13 +323,13 @@
    */
   private void testAddBoolOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for boolean on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject check = createSimpleObjectBool();
-    final JsonPointer ptr = Json.createPointer(BOOL_PATH);
-    final JsonObject out = ptr.add(in, toJsonValue(BOOL_VALUE));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + BOOL_PATH
-          + "\" ADD \"" + BOOL_VALUE + "\" failed on empty JSON object");
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject check = SimpleValues.createSimpleObjectBool();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.BOOL_PATH);
+    final JsonObject out = ptr.add(in, SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.BOOL_PATH
+          + "\" ADD \"" + SimpleValues.BOOL_VALUE + "\" failed on empty JSON object");
     }
   }
 
@@ -343,15 +342,15 @@
    */
   private void testAddBoolOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for boolean on empty JSON array");
-    final JsonArray in = createEmptyArray();
-    final JsonArray check = createEmptyArrayWithBool();
+    final JsonArray in = SimpleValues.createEmptyArray();
+    final JsonArray check = SimpleValues.createEmptyArrayWithBool();
     final JsonPointer[] ptrs = new JsonPointer[] { Json.createPointer("/0"),
         Json.createPointer("/-") };
     for (final JsonPointer ptr : ptrs) {
-      final JsonArray out = ptr.add(in, toJsonValue(BOOL_VALUE));
-      if (!assertEquals(check, out)) {
+      final JsonArray out = ptr.add(in, SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE));
+      if (!JsonAssert.assertEquals(check, out)) {
         result.fail("Pointer ADD operation", "Pointer \"" + ptr + "\" ADD \""
-            + BOOL_VALUE + "\" failed on empty JSON array");
+            + SimpleValues.BOOL_VALUE + "\" failed on empty JSON array");
       }
     }
   }
@@ -364,13 +363,13 @@
    */
   private void testAddBoolOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObject();
-    final JsonObject check = createSimpleObjectWithBool();
-    final JsonPointer ptr = Json.createPointer(BOOL_PATH);
-    final JsonObject out = ptr.add(in, toJsonValue(BOOL_VALUE));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + BOOL_PATH
-          + "\" ADD \"" + BOOL_VALUE + "\" failed on simple JSON object");
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonObject check = SimpleValues.createSimpleObjectWithBool();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.BOOL_PATH);
+    final JsonObject out = ptr.add(in, SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.BOOL_PATH
+          + "\" ADD \"" + SimpleValues.BOOL_VALUE + "\" failed on simple JSON object");
     }
   }
 
@@ -385,22 +384,22 @@
    */
   private void testAddBoolOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 1");
-    final JsonArray in = createBoolArray1();
-    final JsonArray checkBefore = createSimpleBoolArrayWithBoolBefore();
-    final JsonArray checkAfter = createSimpleBoolArrayWithBoolAfter();
+    final JsonArray in = SimpleValues.createBoolArray1();
+    final JsonArray checkBefore = SimpleValues.createSimpleBoolArrayWithBoolBefore();
+    final JsonArray checkAfter = SimpleValues.createSimpleBoolArrayWithBoolAfter();
     final JsonPointer ptrBefore = Json.createPointer("/0");
     final JsonPointer[] ptrsAfter = new JsonPointer[] {
         Json.createPointer("/1"), Json.createPointer("/-") };
-    final JsonArray outBefore = ptrBefore.add(in, toJsonValue(BOOL_FALSE));
-    if (!assertEquals(checkBefore, outBefore)) {
-      result.fail("Pointer ADD operation", "Pointer \"/0\" ADD \"" + BOOL_FALSE
+    final JsonArray outBefore = ptrBefore.add(in, SimpleValues.toJsonValue(SimpleValues.BOOL_FALSE));
+    if (!JsonAssert.assertEquals(checkBefore, outBefore)) {
+      result.fail("Pointer ADD operation", "Pointer \"/0\" ADD \"" + SimpleValues.BOOL_FALSE
           + "\" failed on simple JSON array");
     }
     for (final JsonPointer ptrAfter : ptrsAfter) {
-      final JsonArray outAfter = ptrAfter.add(in, toJsonValue(BOOL_FALSE));
-      if (!assertEquals(checkAfter, outAfter)) {
+      final JsonArray outAfter = ptrAfter.add(in, SimpleValues.toJsonValue(SimpleValues.BOOL_FALSE));
+      if (!JsonAssert.assertEquals(checkAfter, outAfter)) {
         result.fail("Pointer ADD operation", "Pointer \"/1\" ADD \""
-            + BOOL_FALSE + "\" failed on simple JSON array");
+            + SimpleValues.BOOL_FALSE + "\" failed on simple JSON array");
       }
     }
   }
@@ -420,14 +419,14 @@
    */
   private void testAddBoolOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 2");
-    final JsonArray in = createBoolArray2();
-    final JsonArray check = createSimpleBoolArray5();
+    final JsonArray in = SimpleValues.createBoolArray2();
+    final JsonArray check = SimpleValues.createSimpleBoolArray5();
     verifyAddValues(result, in, check, new String[] { "/2", "/1", "/0" },
-        new Boolean[] { BOOL_TRUE, BOOL_TRUE, BOOL_FALSE },
+        new Boolean[] { SimpleValues.BOOL_TRUE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE },
         "Pointer ADD operation",
         "Pointers \"/2\", \"/1\", \"/0\" ADD sequence failed on simple JSON array");
     verifyAddValues(result, in, check, new String[] { "/0", "/2", "/4" },
-        new Boolean[] { BOOL_FALSE, BOOL_TRUE, BOOL_TRUE },
+        new Boolean[] { SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_TRUE },
         "Pointer ADD operation",
         "Pointers \"/0\", \"/2\", \"/4\" ADD sequence failed on simple JSON array");
   }
@@ -440,13 +439,13 @@
    */
   private void testAddObjectOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on empty JSON object");
-    final JsonObject in = createEmptyObject();
-    final JsonObject check = createSimpleObjectObject();
-    final JsonPointer ptr = Json.createPointer(OBJ_PATH);
-    final JsonObject out = ptr.add(in, OBJ_VALUE);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + OBJ_PATH + "\" ADD \""
-          + OBJ_VALUE + "\" failed on empty JSON object");
+    final JsonObject in = SimpleValues.createEmptyObject();
+    final JsonObject check = SimpleValues.createSimpleObjectObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.OBJ_PATH);
+    final JsonObject out = ptr.add(in, SimpleValues.OBJ_VALUE);
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.OBJ_PATH + "\" ADD \""
+          + SimpleValues.OBJ_VALUE + "\" failed on empty JSON object");
     }
   }
 
@@ -459,15 +458,15 @@
    */
   private void testAddObjectOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on empty JSON array");
-    final JsonArray in = createEmptyArray();
-    final JsonArray check = createEmptyArrayWithObject();
+    final JsonArray in = SimpleValues.createEmptyArray();
+    final JsonArray check = SimpleValues.createEmptyArrayWithObject();
     final JsonPointer[] ptrs = new JsonPointer[] { Json.createPointer("/0"),
         Json.createPointer("/-") };
     for (final JsonPointer ptr : ptrs) {
-      final JsonArray out = ptr.add(in, OBJ_VALUE);
-      if (!assertEquals(check, out)) {
+      final JsonArray out = ptr.add(in, SimpleValues.OBJ_VALUE);
+      if (!JsonAssert.assertEquals(check, out)) {
         result.fail("Pointer ADD operation", "Pointer \"" + ptr + "\" ADD \""
-            + OBJ_VALUE + "\" failed on empty JSON array");
+            + SimpleValues.OBJ_VALUE + "\" failed on empty JSON array");
       }
     }
   }
@@ -480,13 +479,13 @@
    */
   private void testAddObjectOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createCompoundObject();
-    final JsonObject check = createCompoundObjectWithObject();
-    final JsonPointer ptr = Json.createPointer(OBJ_PATH);
-    final JsonObject out = ptr.add(in, OBJ_VALUE);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + OBJ_PATH + "\" ADD \""
-          + OBJ_VALUE + "\" failed on simple JSON object");
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonObject check = SimpleValues.createCompoundObjectWithObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.OBJ_PATH);
+    final JsonObject out = ptr.add(in, SimpleValues.OBJ_VALUE);
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.OBJ_PATH + "\" ADD \""
+          + SimpleValues.OBJ_VALUE + "\" failed on simple JSON object");
     }
   }
 
@@ -501,21 +500,21 @@
    */
   private void testAddObjectOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 1");
-    final JsonArray in = createObjectArray1();
-    final JsonArray checkBefore = createSimpleObjectArrayWithObjectBefore();
-    final JsonArray checkAfter = createSimpleObjectArrayWithObjectAfter();
+    final JsonArray in = SimpleValues.createObjectArray1();
+    final JsonArray checkBefore = SimpleValues.createSimpleObjectArrayWithObjectBefore();
+    final JsonArray checkAfter = SimpleValues.createSimpleObjectArrayWithObjectAfter();
     final JsonPointer ptrBefore = Json.createPointer("/0");
     final JsonPointer[] ptrsAfter = new JsonPointer[] {
         Json.createPointer("/1"), Json.createPointer("/-") };
-    final JsonArray outBefore = ptrBefore.add(in, OBJ_VALUE);
-    if (!assertEquals(checkBefore, outBefore)) {
-      result.fail("Pointer ADD operation", "Pointer \"/0\" ADD \"" + OBJ_VALUE
+    final JsonArray outBefore = ptrBefore.add(in, SimpleValues.OBJ_VALUE);
+    if (!JsonAssert.assertEquals(checkBefore, outBefore)) {
+      result.fail("Pointer ADD operation", "Pointer \"/0\" ADD \"" + SimpleValues.OBJ_VALUE
           + "\" failed on simple JSON array");
     }
     for (final JsonPointer ptrAfter : ptrsAfter) {
-      final JsonArray outAfter = ptrAfter.add(in, OBJ_VALUE);
-      if (!assertEquals(checkAfter, outAfter)) {
-        result.fail("Pointer ADD operation", "Pointer \"/1\" ADD \"" + OBJ_VALUE
+      final JsonArray outAfter = ptrAfter.add(in, SimpleValues.OBJ_VALUE);
+      if (!JsonAssert.assertEquals(checkAfter, outAfter)) {
+        result.fail("Pointer ADD operation", "Pointer \"/1\" ADD \"" + SimpleValues.OBJ_VALUE
             + "\" failed on simple JSON array");
       }
     }
@@ -536,14 +535,14 @@
    */
   private void testAddObjectOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 2");
-    final JsonArray in = createObjectArray2();
-    final JsonArray check = createSimpleObjectArray5();
+    final JsonArray in = SimpleValues.createObjectArray2();
+    final JsonArray check = SimpleValues.createSimpleObjectArray5();
     verifyAddValues(result, in, check, new String[] { "/2", "/1", "/0" },
-        new JsonObject[] { OBJ_VALUE_5, OBJ_VALUE_3, OBJ_VALUE_1 },
+        new JsonObject[] { SimpleValues.OBJ_VALUE_5, SimpleValues.OBJ_VALUE_3, SimpleValues.OBJ_VALUE_1 },
         "Pointer ADD operation",
         "Pointers \"/2\", \"/1\", \"/0\" ADD sequence failed on simple JSON array");
     verifyAddValues(result, in, check, new String[] { "/0", "/2", "/4" },
-        new JsonObject[] { OBJ_VALUE_1, OBJ_VALUE_3, OBJ_VALUE_5 },
+        new JsonObject[] { SimpleValues.OBJ_VALUE_1, SimpleValues.OBJ_VALUE_3, SimpleValues.OBJ_VALUE_5 },
         "Pointer ADD operation",
         "Pointers \"/0\", \"/2\", \"/4\" ADD sequence failed on simple JSON array");
   }
@@ -565,13 +564,13 @@
    */
   private void testAddArrayToReplaceObject(final TestResult result) {
     LOGGER.info(" - for JsonArray to replace JsonObject");
-    final JsonObject in = createCompoundObject();
-    final JsonObject check = createCompoundObjectWithObjectReplaced();
-    final JsonPointer ptr = Json.createPointer(DEF_OBJ_PATH);
-    final JsonArray replace = createSimpleStringArray5();
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonObject check = SimpleValues.createCompoundObjectWithObjectReplaced();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.DEF_OBJ_PATH);
+    final JsonArray replace = SimpleValues.createSimpleStringArray5();
     final JsonObject out = ptr.add(in, replace);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + DEF_OBJ_PATH
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.DEF_OBJ_PATH
           + "\" ADD array to replace existing object failed on compound JSON object");
     }
   }
@@ -590,14 +589,14 @@
    */
   private void testAddArrayToReplaceDocument(final TestResult result) {
     LOGGER.info(" - for JsonArray to replace whole document");
-    final JsonObject in = createCompoundObject();
-    final JsonArray check = createSimpleStringArray5();
+    final JsonObject in = SimpleValues.createCompoundObject();
+    final JsonArray check = SimpleValues.createSimpleStringArray5();
     final JsonPointer ptr = Json.createPointer("");
-    final JsonArray replace = createSimpleStringArray5();
+    final JsonArray replace = SimpleValues.createSimpleStringArray5();
     // Instance being replaced is JsonObject, instance being added is JsonArray
     final JsonStructure out = ptr.add((JsonStructure) in, replace);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer ADD operation", "Pointer \"" + DEF_OBJ_PATH
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer ADD operation", "Pointer \"" + SimpleValues.DEF_OBJ_PATH
           + "\" ADD array to replace existing object failed on compound JSON object");
     }
   }
@@ -620,12 +619,12 @@
    */
   private void testAddStringArrayToStringArray(final TestResult result) {
     LOGGER.info(" - for String array to be added to existing String array");
-    final JsonArray in = createStringArray2();
-    final JsonArray check = createStringArray2WithStringArrayInTheMiddle();
-    final JsonArray arrayToAdd = createStringInnerArray2();
+    final JsonArray in = SimpleValues.createStringArray2();
+    final JsonArray check = SimpleValues.createStringArray2WithStringArrayInTheMiddle();
+    final JsonArray arrayToAdd = SimpleValues.createStringInnerArray2();
     final JsonPointer ptr = Json.createPointer("/1");
     final JsonArray out = ptr.add(in, arrayToAdd);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer ADD operation",
           "Pointer \"/1\" ADD array failed on JSON array");
     }
@@ -642,18 +641,18 @@
    */
   private void testAddStringToNonExistingObject(final TestResult result) {
     LOGGER.info(" - for String to be added to non existing JsonObject");
-    final JsonObject in = createSimpleObject();
-    final JsonPointer ptr = Json.createPointer(DEF_OBJ_PATH + STR_PATH);
+    final JsonObject in = SimpleValues.createSimpleObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.DEF_OBJ_PATH + SimpleValues.STR_PATH);
     boolean exception = false;
     try {
-      ptr.add(in, Json.createValue(STR_VALUE));
+      ptr.add(in, Json.createValue(SimpleValues.STR_VALUE));
     } catch (JsonException e) {
       exception = true;
       LOGGER.info("    - Expected exception: " + e.getMessage());
     }
     if (!exception) {
       result.fail("Pointer ADD operation",
-          "ADD operation on non existing JsonObject \"" + DEF_OBJ_PATH
+          "ADD operation on non existing JsonObject \"" + SimpleValues.DEF_OBJ_PATH
               + "\" passed");
     }
   }
@@ -689,9 +688,9 @@
     JsonArray out = in;
     for (int i = 0; i < paths.length; i++) {
       final JsonPointer ptr = Json.createPointer(paths[i]);
-      out = ptr.add(out, toJsonValue(values[i]));
+      out = ptr.add(out, SimpleValues.toJsonValue(values[i]));
     }
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail(testName, errorMessage);
     }
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerRemove.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerRemove.java
similarity index 75%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerRemove.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerRemove.java
index 68fc528..4e28f77 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerRemove.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerRemove.java
@@ -14,9 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.pointertests;
+package ee.jakarta.tck.jsonp.api.pointertests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
@@ -25,9 +27,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * {@see <a href="https://tools.ietf.org/html/rfc6901">RFC 6901</a>}: pointer
@@ -90,12 +89,12 @@
    */
   private void testRemoveStringOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for String to produce empty JSON object");
-    final JsonObject in = createSimpleObjectStr();
-    final JsonObject check = createEmptyObject();
-    final JsonPointer ptr = Json.createPointer(STR_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createEmptyObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.STR_PATH);
     final JsonObject out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer REMOVE operation", "Pointer \"" + STR_PATH
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer REMOVE operation", "Pointer \"" + SimpleValues.STR_PATH
           + "\" REMOVE failed when producing empty JSON object");
     }
   }
@@ -109,11 +108,11 @@
    */
   private void testRemoveStringOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for String to produce empty JSON array");
-    final JsonArray in = createEmptyArrayWithStr();
-    final JsonArray check = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArrayWithStr();
+    final JsonArray check = SimpleValues.createEmptyArray();
     final JsonPointer ptr = Json.createPointer("/0");
     final JsonArray out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/0\" REMOVE failed when producing empty JSON array");
     }
@@ -127,13 +126,13 @@
    */
   private void testRemoveStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObjectWithStr();
-    final JsonObject check = createSimpleObject();
-    final JsonPointer ptr = Json.createPointer(STR_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectWithStr();
+    final JsonObject check = SimpleValues.createSimpleObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.STR_PATH);
     final JsonObject out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REMOVE operation",
-          "Pointer \"" + STR_PATH + "\" REMOVE failed on simple JSON object");
+          "Pointer \"" + SimpleValues.STR_PATH + "\" REMOVE failed on simple JSON object");
     }
   }
 
@@ -148,18 +147,18 @@
    */
   private void testRemoveStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 2");
-    final JsonArray inBefore = createSimpleStringArrayWithStrBefore();
-    final JsonArray inAfter = createSimpleStringArrayWithStrAfter();
-    final JsonArray check = createStringArray1();
+    final JsonArray inBefore = SimpleValues.createSimpleStringArrayWithStrBefore();
+    final JsonArray inAfter = SimpleValues.createSimpleStringArrayWithStrAfter();
+    final JsonArray check = SimpleValues.createStringArray1();
     final JsonPointer ptrBefore = Json.createPointer("/0");
     final JsonPointer ptrAfter = Json.createPointer("/1");
     final JsonArray outBefore = ptrBefore.remove(inBefore);
     final JsonArray outAfter = ptrAfter.remove(inAfter);
-    if (!assertEquals(check, outBefore)) {
+    if (!JsonAssert.assertEquals(check, outBefore)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/0\" REMOVE failed on simple JSON array");
     }
-    if (!assertEquals(check, outAfter)) {
+    if (!JsonAssert.assertEquals(check, outAfter)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/1\" REMOVE failed on simple JSON array");
     }
@@ -180,8 +179,8 @@
    */
   private void testRemoveStringOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 5");
-    final JsonArray in = createSimpleStringArray5();
-    final JsonArray check = createStringArray2();
+    final JsonArray in = SimpleValues.createSimpleStringArray5();
+    final JsonArray check = SimpleValues.createStringArray2();
     verifyRemoveValues(result, in, check, new String[] { "/4", "/2", "/0" },
         "Pointer REMOVE operation",
         "Pointers \"/4\", \"/2\", \"/0\" REMOVE sequence failed on simple JSON array");
@@ -198,12 +197,12 @@
    */
   private void testRemoveIntOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for int to produce empty JSON object");
-    final JsonObject in = createSimpleObjectInt();
-    final JsonObject check = createEmptyObject();
-    final JsonPointer ptr = Json.createPointer(INT_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createEmptyObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.INT_PATH);
     final JsonObject out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer REMOVE operation", "Pointer \"" + INT_PATH
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer REMOVE operation", "Pointer \"" + SimpleValues.INT_PATH
           + "\" REMOVE failed when producing empty JSON object");
     }
   }
@@ -217,11 +216,11 @@
    */
   private void testRemoveIntOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for int to produce empty JSON array");
-    final JsonArray in = createEmptyArrayWithInt();
-    final JsonArray check = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArrayWithInt();
+    final JsonArray check = SimpleValues.createEmptyArray();
     final JsonPointer ptr = Json.createPointer("/0");
     final JsonArray out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/0\" REMOVE failed when producing empty JSON array");
     }
@@ -235,13 +234,13 @@
    */
   private void testRemoveIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObjectWithInt();
-    final JsonObject check = createSimpleObject();
-    final JsonPointer ptr = Json.createPointer(INT_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectWithInt();
+    final JsonObject check = SimpleValues.createSimpleObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.INT_PATH);
     final JsonObject out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REMOVE operation",
-          "Pointer \"" + INT_PATH + "\" REMOVE failed on simple JSON object");
+          "Pointer \"" + SimpleValues.INT_PATH + "\" REMOVE failed on simple JSON object");
     }
   }
 
@@ -256,18 +255,18 @@
    */
   private void testRemoveIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 2");
-    final JsonArray inBefore = createSimpleIntArrayWithIntBefore();
-    final JsonArray inAfter = createSimpleIntArrayWithIntAfter();
-    final JsonArray check = createIntArray1();
+    final JsonArray inBefore = SimpleValues.createSimpleIntArrayWithIntBefore();
+    final JsonArray inAfter = SimpleValues.createSimpleIntArrayWithIntAfter();
+    final JsonArray check = SimpleValues.createIntArray1();
     final JsonPointer ptrBefore = Json.createPointer("/0");
     final JsonPointer ptrAfter = Json.createPointer("/1");
     final JsonArray outBefore = ptrBefore.remove(inBefore);
     final JsonArray outAfter = ptrAfter.remove(inAfter);
-    if (!assertEquals(check, outBefore)) {
+    if (!JsonAssert.assertEquals(check, outBefore)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/0\" REMOVE failed on simple JSON array");
     }
-    if (!assertEquals(check, outAfter)) {
+    if (!JsonAssert.assertEquals(check, outAfter)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/1\" REMOVE failed on simple JSON array");
     }
@@ -288,8 +287,8 @@
    */
   private void testRemoveIntOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 5");
-    final JsonArray in = createSimpleIntArray5();
-    final JsonArray check = createIntArray2();
+    final JsonArray in = SimpleValues.createSimpleIntArray5();
+    final JsonArray check = SimpleValues.createIntArray2();
     verifyRemoveValues(result, in, check, new String[] { "/4", "/2", "/0" },
         "Pointer REMOVE operation",
         "Pointers \"/4\", \"/2\", \"/0\" REMOVE sequence failed on simple JSON array");
@@ -307,12 +306,12 @@
    */
   private void testRemoveBoolOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for boolean to produce empty JSON object");
-    final JsonObject in = createSimpleObjectBool();
-    final JsonObject check = createEmptyObject();
-    final JsonPointer ptr = Json.createPointer(BOOL_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createEmptyObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.BOOL_PATH);
     final JsonObject out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer REMOVE operation", "Pointer \"" + BOOL_PATH
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer REMOVE operation", "Pointer \"" + SimpleValues.BOOL_PATH
           + "\" REMOVE failed when producing empty JSON object");
     }
   }
@@ -326,11 +325,11 @@
    */
   private void testRemoveBoolOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for boolean to produce empty JSON array");
-    final JsonArray in = createEmptyArrayWithBool();
-    final JsonArray check = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArrayWithBool();
+    final JsonArray check = SimpleValues.createEmptyArray();
     final JsonPointer ptr = Json.createPointer("/0");
     final JsonArray out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/0\" REMOVE failed when producing empty JSON array");
     }
@@ -344,13 +343,13 @@
    */
   private void testRemoveBoolOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObjectWithBool();
-    final JsonObject check = createSimpleObject();
-    final JsonPointer ptr = Json.createPointer(BOOL_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectWithBool();
+    final JsonObject check = SimpleValues.createSimpleObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.BOOL_PATH);
     final JsonObject out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REMOVE operation",
-          "Pointer \"" + BOOL_PATH + "\" REMOVE failed on simple JSON object");
+          "Pointer \"" + SimpleValues.BOOL_PATH + "\" REMOVE failed on simple JSON object");
     }
   }
 
@@ -365,18 +364,18 @@
    */
   private void testRemoveBoolOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 2");
-    final JsonArray inBefore = createSimpleBoolArrayWithBoolBefore();
-    final JsonArray inAfter = createSimpleBoolArrayWithBoolAfter();
-    final JsonArray check = createBoolArray1();
+    final JsonArray inBefore = SimpleValues.createSimpleBoolArrayWithBoolBefore();
+    final JsonArray inAfter = SimpleValues.createSimpleBoolArrayWithBoolAfter();
+    final JsonArray check = SimpleValues.createBoolArray1();
     final JsonPointer ptrBefore = Json.createPointer("/0");
     final JsonPointer ptrAfter = Json.createPointer("/1");
     final JsonArray outBefore = ptrBefore.remove(inBefore);
     final JsonArray outAfter = ptrAfter.remove(inAfter);
-    if (!assertEquals(check, outBefore)) {
+    if (!JsonAssert.assertEquals(check, outBefore)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/0\" REMOVE failed on simple JSON array");
     }
-    if (!assertEquals(check, outAfter)) {
+    if (!JsonAssert.assertEquals(check, outAfter)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/1\" REMOVE failed on simple JSON array");
     }
@@ -397,8 +396,8 @@
    */
   private void testRemoveBoolOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 5");
-    final JsonArray in = createSimpleBoolArray5();
-    final JsonArray check = createBoolArray2();
+    final JsonArray in = SimpleValues.createSimpleBoolArray5();
+    final JsonArray check = SimpleValues.createBoolArray2();
     verifyRemoveValues(result, in, check, new String[] { "/4", "/2", "/0" },
         "Pointer REMOVE operation",
         "Pointers \"/4\", \"/2\", \"/0\" REMOVE sequence failed on simple JSON array");
@@ -416,12 +415,12 @@
    */
   private void testRemoveObjectOnEmptyObject(final TestResult result) {
     LOGGER.info(" - for JsonObject to produce empty JSON object");
-    final JsonObject in = createSimpleObjectObject();
-    final JsonObject check = createEmptyObject();
-    final JsonPointer ptr = Json.createPointer(OBJ_PATH);
+    final JsonObject in = SimpleValues.createSimpleObjectObject();
+    final JsonObject check = SimpleValues.createEmptyObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.OBJ_PATH);
     final JsonObject out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer REMOVE operation", "Pointer \"" + OBJ_PATH
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer REMOVE operation", "Pointer \"" + SimpleValues.OBJ_PATH
           + "\" REMOVE failed when producing empty JSON object");
     }
   }
@@ -435,11 +434,11 @@
    */
   private void testRemoveObjectOnEmptyArray(final TestResult result) {
     LOGGER.info(" - for JsonObject to produce empty JSON array");
-    final JsonArray in = createEmptyArrayWithObject();
-    final JsonArray check = createEmptyArray();
+    final JsonArray in = SimpleValues.createEmptyArrayWithObject();
+    final JsonArray check = SimpleValues.createEmptyArray();
     final JsonPointer ptr = Json.createPointer("/0");
     final JsonArray out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/0\" REMOVE failed when producing empty JSON array");
     }
@@ -453,13 +452,13 @@
    */
   private void testRemoveObjectOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createCompoundObjectWithObject();
-    final JsonObject check = createCompoundObject();
-    final JsonPointer ptr = Json.createPointer(OBJ_PATH);
+    final JsonObject in = SimpleValues.createCompoundObjectWithObject();
+    final JsonObject check = SimpleValues.createCompoundObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.OBJ_PATH);
     final JsonObject out = ptr.remove(in);
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REMOVE operation",
-          "Pointer \"" + OBJ_PATH + "\" REMOVE failed on simple JSON object");
+          "Pointer \"" + SimpleValues.OBJ_PATH + "\" REMOVE failed on simple JSON object");
     }
   }
 
@@ -474,18 +473,18 @@
    */
   private void testRemoveObjectOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 2");
-    final JsonArray inBefore = createSimpleObjectArrayWithObjectBefore();
-    final JsonArray inAfter = createSimpleObjectArrayWithObjectAfter();
-    final JsonArray check = createObjectArray1();
+    final JsonArray inBefore = SimpleValues.createSimpleObjectArrayWithObjectBefore();
+    final JsonArray inAfter = SimpleValues.createSimpleObjectArrayWithObjectAfter();
+    final JsonArray check = SimpleValues.createObjectArray1();
     final JsonPointer ptrBefore = Json.createPointer("/0");
     final JsonPointer ptrAfter = Json.createPointer("/1");
     final JsonArray outBefore = ptrBefore.remove(inBefore);
     final JsonArray outAfter = ptrAfter.remove(inAfter);
-    if (!assertEquals(check, outBefore)) {
+    if (!JsonAssert.assertEquals(check, outBefore)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/0\" REMOVE failed on simple JSON array");
     }
-    if (!assertEquals(check, outAfter)) {
+    if (!JsonAssert.assertEquals(check, outAfter)) {
       result.fail("Pointer REMOVE operation",
           "Pointer \"/1\" REMOVE failed on simple JSON array");
     }
@@ -506,8 +505,8 @@
    */
   private void testRemoveObjectOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 5");
-    final JsonArray in = createSimpleObjectArray5();
-    final JsonArray check = createObjectArray2();
+    final JsonArray in = SimpleValues.createSimpleObjectArray5();
+    final JsonArray check = SimpleValues.createObjectArray2();
     verifyRemoveValues(result, in, check, new String[] { "/4", "/2", "/0" },
         "Pointer REMOVE operation",
         "Pointers \"/4\", \"/2\", \"/0\" REMOVE sequence failed on simple JSON array");
@@ -527,10 +526,10 @@
   private void testRemoveFromNonExistingLocationInObject(
       final TestResult result) {
     LOGGER.info(" - for non existing location in JsonObject");
-    final JsonObject[] objsIn = new JsonObject[] { createEmptyObject(),
-        createSimpleObject(), createCompoundObject() };
-    final String[] paths = new String[] { STR_PATH, INT_PATH, BOOL_PATH,
-        OBJ_PATH };
+    final JsonObject[] objsIn = new JsonObject[] { SimpleValues.createEmptyObject(),
+        SimpleValues.createSimpleObject(), SimpleValues.createCompoundObject() };
+    final String[] paths = new String[] { SimpleValues.STR_PATH, SimpleValues.INT_PATH, SimpleValues.BOOL_PATH,
+        SimpleValues.OBJ_PATH };
     // Go trough all objects
     for (int i = 0; i < objsIn.length; i++) {
       // Go trough all paths
@@ -556,13 +555,13 @@
   private void testRemoveFromNonExistingLocationInArray(
       final TestResult result) {
     LOGGER.info(" - for non existing location in JsonArray");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray1(), createIntArray2(), createSimpleBoolArray5(),
-        createObjectArray2()
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray1(), SimpleValues.createIntArray2(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createObjectArray2()
 
     };
     final String[] paths = new String[] { "/", "/-1", "/-", "/5", "/0a", "/42",
-        STR_PATH + "/0" };
+        SimpleValues.STR_PATH + "/0" };
     // Go trough all arrays
     for (int i = 0; i < arraysIn.length; i++) {
       // Go trough all paths
@@ -606,7 +605,7 @@
       final JsonPointer ptr = Json.createPointer(paths[i]);
       out = ptr.remove(out);
     }
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail(testName, errorMessage);
     }
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerReplace.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerReplace.java
similarity index 67%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerReplace.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerReplace.java
index cd4391f..fd654e7 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerReplace.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerReplace.java
@@ -14,9 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.pointertests;
+package ee.jakarta.tck.jsonp.api.pointertests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
@@ -26,9 +28,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * {@see <a href="https://tools.ietf.org/html/rfc6901">RFC 6901</a>}: pointer
@@ -83,13 +82,13 @@
    */
   private void testReplaceStringOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for String on simple JSON object");
-    final JsonObject in = createSimpleObjectStr();
-    final JsonObject check = createSimpleObjectReplaceStr();
-    final JsonPointer ptr = Json.createPointer(STR_PATH);
-    final JsonObject out = ptr.replace(in, Json.createValue(STR_VALUE2));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer REPLACE operation", "Pointer \"" + STR_PATH
-          + "\" REPLACE \"" + STR_VALUE2 + "\" failed on simple JSON object");
+    final JsonObject in = SimpleValues.createSimpleObjectStr();
+    final JsonObject check = SimpleValues.createSimpleObjectReplaceStr();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.STR_PATH);
+    final JsonObject out = ptr.replace(in, Json.createValue(SimpleValues.STR_VALUE2));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer REPLACE operation", "Pointer \"" + SimpleValues.STR_PATH
+          + "\" REPLACE \"" + SimpleValues.STR_VALUE2 + "\" failed on simple JSON object");
     }
   }
 
@@ -101,13 +100,13 @@
    */
   private void testReplaceStringOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 1");
-    final JsonArray in = createStringArray1();
-    final JsonArray check = createSimpleStringArrayReplaceStr();
+    final JsonArray in = SimpleValues.createStringArray1();
+    final JsonArray check = SimpleValues.createSimpleStringArrayReplaceStr();
     final JsonPointer ptr = Json.createPointer("/0");
-    final JsonArray out = ptr.replace(in, Json.createValue(STR_VALUE));
-    if (!assertEquals(check, out)) {
+    final JsonArray out = ptr.replace(in, Json.createValue(SimpleValues.STR_VALUE));
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REPLACE operation", "Pointer \"/0\" REPLACE \""
-          + STR_VALUE + "\" failed on simple JSON array");
+          + SimpleValues.STR_VALUE + "\" failed on simple JSON array");
     }
   }
 
@@ -125,16 +124,16 @@
    */
   private void testReplaceStringOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for String on simple JSON array of size 5");
-    final JsonArray in = createSimpleStringArray5();
-    final JsonArray check = createSimpleStringArray5R();
+    final JsonArray in = SimpleValues.createSimpleStringArray5();
+    final JsonArray check = SimpleValues.createSimpleStringArray5R();
     verifyReplaceValues(result, in, check,
         new String[] { "/4", "/3", "/1", "/0" },
-        new String[] { STR_VALUE_1, STR_VALUE_2, STR_VALUE_4, STR_VALUE_5 },
+        new String[] { SimpleValues.STR_VALUE_1, SimpleValues.STR_VALUE_2, SimpleValues.STR_VALUE_4, SimpleValues.STR_VALUE_5 },
         "Pointer REPLACE operation",
         "Pointers \"/4\", \"/3\", \"/1\", \"/0\" REPLACE sequence failed on simple JSON array");
     verifyReplaceValues(result, in, check,
         new String[] { "/0", "/1", "/3", "/4" },
-        new String[] { STR_VALUE_5, STR_VALUE_4, STR_VALUE_2, STR_VALUE_1 },
+        new String[] { SimpleValues.STR_VALUE_5, SimpleValues.STR_VALUE_4, SimpleValues.STR_VALUE_2, SimpleValues.STR_VALUE_1 },
         "Pointer REPLACE operation",
         "Pointers \"/0\", \"/1\", \"/3\", \"/4\" REPLACE sequence failed on simple JSON array");
   }
@@ -147,13 +146,13 @@
    */
   private void testReplaceIntOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for int on simple JSON object");
-    final JsonObject in = createSimpleObjectInt();
-    final JsonObject check = createSimpleObjectReplaceInt();
-    final JsonPointer ptr = Json.createPointer(INT_PATH);
-    final JsonObject out = ptr.replace(in, Json.createValue(INT_VALUE2));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer REPLACE operation", "Pointer \"" + INT_PATH
-          + "\" REPLACE \"" + INT_VALUE2 + "\" failed on simple JSON object");
+    final JsonObject in = SimpleValues.createSimpleObjectInt();
+    final JsonObject check = SimpleValues.createSimpleObjectReplaceInt();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.INT_PATH);
+    final JsonObject out = ptr.replace(in, Json.createValue(SimpleValues.INT_VALUE2));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer REPLACE operation", "Pointer \"" + SimpleValues.INT_PATH
+          + "\" REPLACE \"" + SimpleValues.INT_VALUE2 + "\" failed on simple JSON object");
     }
   }
 
@@ -165,13 +164,13 @@
    */
   private void testReplaceIntOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 1");
-    final JsonArray in = createIntArray1();
-    final JsonArray check = createSimpleIntArrayReplaceInt();
+    final JsonArray in = SimpleValues.createIntArray1();
+    final JsonArray check = SimpleValues.createSimpleIntArrayReplaceInt();
     final JsonPointer ptr = Json.createPointer("/0");
-    final JsonArray out = ptr.replace(in, Json.createValue(INT_VALUE));
-    if (!assertEquals(check, out)) {
+    final JsonArray out = ptr.replace(in, Json.createValue(SimpleValues.INT_VALUE));
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REPLACE operation", "Pointer \"/0\" REPLACE \""
-          + INT_VALUE + "\" failed on simple JSON array");
+          + SimpleValues.INT_VALUE + "\" failed on simple JSON array");
     }
   }
 
@@ -189,16 +188,16 @@
    */
   private void testReplaceIntOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for int on simple JSON array of size 5");
-    final JsonArray in = createSimpleIntArray5();
-    final JsonArray check = createSimpleIntArray5R();
+    final JsonArray in = SimpleValues.createSimpleIntArray5();
+    final JsonArray check = SimpleValues.createSimpleIntArray5R();
     verifyReplaceValues(result, in, check,
         new String[] { "/4", "/3", "/1", "/0" },
-        new Integer[] { INT_VALUE_1, INT_VALUE_2, INT_VALUE_4, INT_VALUE_5 },
+        new Integer[] { SimpleValues.INT_VALUE_1, SimpleValues.INT_VALUE_2, SimpleValues.INT_VALUE_4, SimpleValues.INT_VALUE_5 },
         "Pointer REPLACE operation",
         "Pointers \"/4\", \"/3\", \"/1\", \"/0\" REPLACE sequence failed on simple JSON array");
     verifyReplaceValues(result, in, check,
         new String[] { "/0", "/1", "/3", "/4" },
-        new Integer[] { INT_VALUE_5, INT_VALUE_4, INT_VALUE_2, INT_VALUE_1 },
+        new Integer[] { SimpleValues.INT_VALUE_5, SimpleValues.INT_VALUE_4, SimpleValues.INT_VALUE_2, SimpleValues.INT_VALUE_1 },
         "Pointer REPLACE operation",
         "Pointers \"/0\", \"/1\", \"/3\", \"/4\" REPLACE sequence failed on simple JSON array");
   }
@@ -211,13 +210,13 @@
    */
   private void testReplaceBoolOnSimpleObject(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON object");
-    final JsonObject in = createSimpleObjectBool();
-    final JsonObject check = createSimpleObjectReplaceBool();
-    final JsonPointer ptr = Json.createPointer(BOOL_PATH);
-    final JsonObject out = ptr.replace(in, toJsonValue(BOOL_VALUE2));
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer REPLACE operation", "Pointer \"" + BOOL_PATH
-          + "\" REPLACE \"" + BOOL_VALUE2 + "\" failed on simple JSON object");
+    final JsonObject in = SimpleValues.createSimpleObjectBool();
+    final JsonObject check = SimpleValues.createSimpleObjectReplaceBool();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.BOOL_PATH);
+    final JsonObject out = ptr.replace(in, SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE2));
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer REPLACE operation", "Pointer \"" + SimpleValues.BOOL_PATH
+          + "\" REPLACE \"" + SimpleValues.BOOL_VALUE2 + "\" failed on simple JSON object");
     }
   }
 
@@ -229,13 +228,13 @@
    */
   private void testReplaceBoolOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 1");
-    final JsonArray in = createBoolArray1();
-    final JsonArray check = createSimpleBoolArrayReplaceBool();
+    final JsonArray in = SimpleValues.createBoolArray1();
+    final JsonArray check = SimpleValues.createSimpleBoolArrayReplaceBool();
     final JsonPointer ptr = Json.createPointer("/0");
-    final JsonArray out = ptr.replace(in, toJsonValue(BOOL_FALSE));
-    if (!assertEquals(check, out)) {
+    final JsonArray out = ptr.replace(in, SimpleValues.toJsonValue(SimpleValues.BOOL_FALSE));
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REPLACE operation", "Pointer \"/0\" REPLACE \""
-          + BOOL_FALSE + "\" failed on simple JSON array");
+          + SimpleValues.BOOL_FALSE + "\" failed on simple JSON array");
     }
   }
 
@@ -253,16 +252,16 @@
    */
   private void testReplaceBoolOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for boolean on simple JSON array of size 5");
-    final JsonArray in = createSimpleBoolArray5();
-    final JsonArray check = createSimpleBoolArray5R();
+    final JsonArray in = SimpleValues.createSimpleBoolArray5();
+    final JsonArray check = SimpleValues.createSimpleBoolArray5R();
     verifyReplaceValues(result, in, check,
         new String[] { "/4", "/3", "/1", "/0" },
-        new Boolean[] { BOOL_FALSE, BOOL_TRUE, BOOL_FALSE, BOOL_TRUE },
+        new Boolean[] { SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE },
         "Pointer REPLACE operation",
         "Pointers \"/4\", \"/3\", \"/1\", \"/0\" REPLACE sequence failed on simple JSON array");
     verifyReplaceValues(result, in, check,
         new String[] { "/0", "/1", "/3", "/4" },
-        new Boolean[] { BOOL_TRUE, BOOL_FALSE, BOOL_TRUE, BOOL_FALSE },
+        new Boolean[] { SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE, SimpleValues.BOOL_TRUE, SimpleValues.BOOL_FALSE },
         "Pointer REPLACE operation",
         "Pointers \"/0\", \"/1\", \"/3\", \"/4\" REPLACE sequence failed on simple JSON array");
   }
@@ -276,13 +275,13 @@
    */
   private void testReplaceObjectOnCompoundObject(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON object");
-    final JsonObject in = createCompoundObjectWithObject();
-    final JsonObject check = createCompoundObjectReplaceObject();
-    final JsonPointer ptr = Json.createPointer(OBJ_PATH);
-    final JsonObject out = ptr.replace(in, OBJ_VALUE2);
-    if (!assertEquals(check, out)) {
-      result.fail("Pointer REPLACE operation", "Pointer \"" + OBJ_PATH
-          + "\" REPLACE \"" + OBJ_VALUE2 + "\" failed on simple JSON object");
+    final JsonObject in = SimpleValues.createCompoundObjectWithObject();
+    final JsonObject check = SimpleValues.createCompoundObjectReplaceObject();
+    final JsonPointer ptr = Json.createPointer(SimpleValues.OBJ_PATH);
+    final JsonObject out = ptr.replace(in, SimpleValues.OBJ_VALUE2);
+    if (!JsonAssert.assertEquals(check, out)) {
+      result.fail("Pointer REPLACE operation", "Pointer \"" + SimpleValues.OBJ_PATH
+          + "\" REPLACE \"" + SimpleValues.OBJ_VALUE2 + "\" failed on simple JSON object");
     }
   }
 
@@ -294,13 +293,13 @@
    */
   private void testReplaceObjectOnSimpleArray(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 1");
-    final JsonArray in = createObjectArray1();
-    final JsonArray check = createSimpleObjectArrayReplaceObject();
+    final JsonArray in = SimpleValues.createObjectArray1();
+    final JsonArray check = SimpleValues.createSimpleObjectArrayReplaceObject();
     final JsonPointer ptr = Json.createPointer("/0");
-    final JsonArray out = ptr.replace(in, OBJ_VALUE);
-    if (!assertEquals(check, out)) {
+    final JsonArray out = ptr.replace(in, SimpleValues.OBJ_VALUE);
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail("Pointer REPLACE operation", "Pointer \"/0\" REPLACE \""
-          + OBJ_VALUE + "\" failed on simple JSON array");
+          + SimpleValues.OBJ_VALUE + "\" failed on simple JSON array");
     }
   }
 
@@ -319,16 +318,16 @@
    */
   private void testReplaceObjectOnSimpleArray2(final TestResult result) {
     LOGGER.info(" - for JsonObject on simple JSON array of size 5");
-    final JsonArray in = createSimpleObjectArray5();
-    final JsonArray check = createSimpleObjectArray5R();
+    final JsonArray in = SimpleValues.createSimpleObjectArray5();
+    final JsonArray check = SimpleValues.createSimpleObjectArray5R();
     verifyReplaceValues(result, in, check,
         new String[] { "/4", "/3", "/1", "/0" },
-        new JsonObject[] { OBJ_VALUE_1, OBJ_VALUE_2, OBJ_VALUE_4, OBJ_VALUE_5 },
+        new JsonObject[] { SimpleValues.OBJ_VALUE_1, SimpleValues.OBJ_VALUE_2, SimpleValues.OBJ_VALUE_4, SimpleValues.OBJ_VALUE_5 },
         "Pointer REPLACE operation",
         "Pointers \"/4\", \"/3\", \"/1\", \"/0\" REPLACE sequence failed on simple JSON array");
     verifyReplaceValues(result, in, check,
         new String[] { "/0", "/1", "/3", "/4" },
-        new JsonObject[] { OBJ_VALUE_5, OBJ_VALUE_4, OBJ_VALUE_2, OBJ_VALUE_1 },
+        new JsonObject[] { SimpleValues.OBJ_VALUE_5, SimpleValues.OBJ_VALUE_4, SimpleValues.OBJ_VALUE_2, SimpleValues.OBJ_VALUE_1 },
         "Pointer REPLACE operation",
         "Pointers \"/0\", \"/1\", \"/3\", \"/4\" REPLACE sequence failed on simple JSON array");
   }
@@ -344,12 +343,12 @@
   private void testReplaceOfNonExistingLocationInObject(
       final TestResult result) {
     LOGGER.info(" - for non existing location in JsonObject");
-    final JsonObject[] objsIn = new JsonObject[] { createEmptyObject(),
-        createSimpleObject(), createCompoundObject() };
-    final String[] paths = new String[] { STR_PATH, INT_PATH, BOOL_PATH,
-        OBJ_PATH };
-    final JsonValue[] values = new JsonValue[] { Json.createValue(STR_VALUE),
-        Json.createValue(INT_VALUE), toJsonValue(BOOL_VALUE), OBJ_VALUE };
+    final JsonObject[] objsIn = new JsonObject[] { SimpleValues.createEmptyObject(),
+        SimpleValues.createSimpleObject(), SimpleValues.createCompoundObject() };
+    final String[] paths = new String[] { SimpleValues.STR_PATH, SimpleValues.INT_PATH, SimpleValues.BOOL_PATH,
+        SimpleValues.OBJ_PATH };
+    final JsonValue[] values = new JsonValue[] { Json.createValue(SimpleValues.STR_VALUE),
+        Json.createValue(SimpleValues.INT_VALUE), SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE), SimpleValues.OBJ_VALUE };
     // Go trough all objects
     for (int i = 0; i < objsIn.length; i++) {
       // Go trough all paths
@@ -375,16 +374,16 @@
   private void testReplaceOfNonExistingLocationInArray(
       final TestResult result) {
     LOGGER.info(" - for non existing location in JsonArray");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray1(), createIntArray2(), createSimpleBoolArray5(),
-        createObjectArray2()
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray1(), SimpleValues.createIntArray2(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createObjectArray2()
 
     };
     final String[] paths = new String[] { "/", "/-1", "/-", "/5", "/0a", "/42",
-        STR_PATH + "/0" };
-    final JsonValue[] values = new JsonValue[] { Json.createValue(STR_VALUE),
-        Json.createValue(STR_VALUE), Json.createValue(INT_VALUE),
-        toJsonValue(BOOL_VALUE), OBJ_VALUE };
+        SimpleValues.STR_PATH + "/0" };
+    final JsonValue[] values = new JsonValue[] { Json.createValue(SimpleValues.STR_VALUE),
+        Json.createValue(SimpleValues.STR_VALUE), Json.createValue(SimpleValues.INT_VALUE),
+        SimpleValues.toJsonValue(SimpleValues.BOOL_VALUE), SimpleValues.OBJ_VALUE };
     // Go trough all arrays
     for (int i = 0; i < arraysIn.length; i++) {
       // Go trough all paths
@@ -432,9 +431,9 @@
     JsonArray out = in;
     for (int i = 0; i < paths.length; i++) {
       final JsonPointer ptr = Json.createPointer(paths[i]);
-      out = ptr.replace(out, toJsonValue(values[i]));
+      out = ptr.replace(out, SimpleValues.toJsonValue(values[i]));
     }
-    if (!assertEquals(check, out)) {
+    if (!JsonAssert.assertEquals(check, out)) {
       result.fail(testName, errorMessage);
     }
   }
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerResolve.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerResolve.java
similarity index 61%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerResolve.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerResolve.java
index c82d4fa..01d5561 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerResolve.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerResolve.java
@@ -14,9 +14,12 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.pointertests;
+package ee.jakarta.tck.jsonp.api.pointertests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.JsonAssert;
+import ee.jakarta.tck.jsonp.api.common.PointerRFCObject;
+import ee.jakarta.tck.jsonp.api.common.SimpleValues;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import jakarta.json.Json;
 import jakarta.json.JsonArray;
 import jakarta.json.JsonException;
@@ -26,10 +29,6 @@
 
 import java.util.logging.Logger;
 
-import static jakarta.jsonp.tck.api.common.JsonAssert.*;
-import static jakarta.jsonp.tck.api.common.PointerRFCObject.*;
-import static jakarta.jsonp.tck.api.common.SimpleValues.*;
-
 // $Id$
 /**
  * {@see <a href="https://tools.ietf.org/html/rfc6901">RFC 6901</a>}: JavaScript
@@ -83,18 +82,18 @@
    *          Tests result record.
    */
   private void testResolveWholeDocument(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_KEY_WHOLE + "\" pointer");
-    final JsonObject in = createRFC6901Object();
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_KEY_WHOLE + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
     final JsonValue check = in;
-    final JsonPointer ptr = Json.createPointer(RFC_KEY_WHOLE);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_KEY_WHOLE);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_KEY_WHOLE + "\"",
-            "GET operation failed for \"" + RFC_KEY_WHOLE + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_KEY_WHOLE + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_KEY_WHOLE + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_KEY_WHOLE + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_KEY_WHOLE + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -106,18 +105,18 @@
    *          Tests result record.
    */
   private void testResolveEmptyName(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR2 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL2);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR2);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR2 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL2);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR2);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR2 + "\"",
-            "GET operation failed for \"" + RFC_PTR2 + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR2 + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR2 + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR2 + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR2 + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -129,18 +128,18 @@
    *          Tests result record.
    */
   private void testResolveSimpleArray(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR1 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = RFC_VAL1;
-    final JsonPointer ptr = Json.createPointer(RFC_PTR1);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR1 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = PointerRFCObject.RFC_VAL1;
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR1);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR1 + "\"",
-            "GET operation failed for \"" + RFC_PTR1 + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR1 + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR1 + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR1 + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR1 + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -153,16 +152,16 @@
    *          Tests result record.
    */
   private void testResolveSimpleArrayItems(final TestResult result) {
-    final String[] itemPtrs = new String[] { RFC_PTR1_ITEM1, RFC_PTR1_ITEM2 };
-    final String[] itemVals = new String[] { RFC_VAL1_ITEM1, RFC_VAL1_ITEM2 };
-    final JsonObject in = createRFC6901Object();
+    final String[] itemPtrs = new String[] { PointerRFCObject.RFC_PTR1_ITEM1, PointerRFCObject.RFC_PTR1_ITEM2 };
+    final String[] itemVals = new String[] { PointerRFCObject.RFC_VAL1_ITEM1, PointerRFCObject.RFC_VAL1_ITEM2 };
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
     for (int i = 0; i < itemPtrs.length; i++) {
       LOGGER.info(" - resolving of \"" + itemPtrs[i] + "\" pointer");
       final JsonValue check = Json.createValue(itemVals[i]);
       final JsonPointer ptr = Json.createPointer(itemPtrs[i]);
       try {
         final JsonValue out = ptr.getValue(in);
-        if (!assertEquals(out, check)) {
+        if (!JsonAssert.assertEquals(out, check)) {
           result.fail("GET \"" + itemPtrs[i] + "\"",
               "GET operation failed for \"" + itemPtrs[i] + "\" path");
         }
@@ -181,19 +180,19 @@
    *          Tests result record.
    */
   private void testResolvePathWithEncodedSlash(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR3_ENC + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL3);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR3_ENC);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR3_ENC + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL3);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR3_ENC);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR3_ENC + "\"",
-            "GET operation failed for \"" + RFC_PTR3_ENC + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR3_ENC + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR3_ENC + "\" path");
       }
     } catch (JsonException e) {
       LOGGER.info("    ! Exception: " + e.getMessage());
-      result.fail("GET \"" + RFC_PTR3_ENC + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR3_ENC + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -207,13 +206,13 @@
    *          Tests result record.
    */
   private void testResolvePathWithSlash(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR3 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonPointer ptr = Json.createPointer(RFC_PTR3);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR3 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR3);
     try {
       final JsonValue out = ptr.getValue(in);
-      result.fail("GET \"" + RFC_PTR3 + "\"",
-          "GET operation succeeded for \"" + RFC_PTR3 + "\" path");
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR3 + "\"",
+          "GET operation succeeded for \"" + PointerRFCObject.RFC_PTR3 + "\" path");
     } catch (JsonException e) {
       LOGGER.info("    - Expected exception: " + e.getMessage());
     }
@@ -226,18 +225,18 @@
    *          Tests result record.
    */
   private void testResolvePathWithPercent(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR4 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL4);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR4);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR4 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL4);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR4);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR4 + "\"",
-            "GET operation failed for \"" + RFC_PTR4 + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR4 + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR4 + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR4 + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR4 + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -249,18 +248,18 @@
    *          Tests result record.
    */
   private void testResolvePathWithCaret(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR5 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL5);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR5);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR5 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL5);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR5);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR5 + "\"",
-            "GET operation failed for \"" + RFC_PTR5 + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR5 + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR5 + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR5 + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR5 + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -272,18 +271,18 @@
    *          Tests result record.
    */
   private void testResolvePathWithVerticalBar(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR6 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL6);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR6);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR6 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL6);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR6);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR6 + "\"",
-            "GET operation failed for \"" + RFC_PTR6 + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR6 + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR6 + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR6 + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR6 + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -295,18 +294,18 @@
    *          Tests result record.
    */
   private void testResolvePathWithBackSlash(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR7 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL7);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR7);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR7 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL7);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR7);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR7 + "\"",
-            "GET operation failed for \"" + RFC_PTR7 + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR7 + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR7 + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR7 + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR7 + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -318,18 +317,18 @@
    *          Tests result record.
    */
   private void testResolvePathWithDoubleQuotes(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR8 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL8);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR8);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR8 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL8);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR8);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR8 + "\"",
-            "GET operation failed for \"" + RFC_PTR8 + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR8 + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR8 + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR8 + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR8 + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -341,18 +340,18 @@
    *          Tests result record.
    */
   private void testResolvePathWithSpace(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR9 + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL9);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR9);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR9 + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL9);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR9);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR9 + "\"",
-            "GET operation failed for \"" + RFC_PTR9 + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR9 + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR9 + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR9 + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR9 + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -373,16 +372,16 @@
    *          Tests result record.
    */
   private void testResolvePathWithTilde(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR10 + "\" pointer (optional)");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL10);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR10);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR10 + "\" pointer (optional)");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL10);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR10);
     boolean noError = true;
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
+      if (!JsonAssert.assertEquals(out, check)) {
         noError = false;
-        LOGGER.info("    - Pointer \"" + RFC_KEY10
+        LOGGER.info("    - Pointer \"" + PointerRFCObject.RFC_KEY10
             + "\" did not return expected value");
       }
     } catch (JsonException e) {
@@ -403,18 +402,18 @@
    *          Tests result record.
    */
   private void testResolvePathWithEncodedTilde(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_KEY10_ENC + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL10);
-    final JsonPointer ptr = Json.createPointer(RFC_KEY10_ENC);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_KEY10_ENC + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL10);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_KEY10_ENC);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_KEY10_ENC + "\"",
-            "GET operation failed for \"" + RFC_KEY10_ENC + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_KEY10_ENC + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_KEY10_ENC + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_KEY10_ENC + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_KEY10_ENC + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -431,18 +430,18 @@
    *          Tests result record.
    */
   private void testResolvePathWithEncodedTildeOne(final TestResult result) {
-    LOGGER.info(" - resolving of \"" + RFC_PTR11_ENC + "\" pointer");
-    final JsonObject in = createRFC6901Object();
-    final JsonValue check = Json.createValue(RFC_VAL11);
-    final JsonPointer ptr = Json.createPointer(RFC_PTR11_ENC);
+    LOGGER.info(" - resolving of \"" + PointerRFCObject.RFC_PTR11_ENC + "\" pointer");
+    final JsonObject in = PointerRFCObject.createRFC6901Object();
+    final JsonValue check = Json.createValue(PointerRFCObject.RFC_VAL11);
+    final JsonPointer ptr = Json.createPointer(PointerRFCObject.RFC_PTR11_ENC);
     try {
       final JsonValue out = ptr.getValue(in);
-      if (!assertEquals(out, check)) {
-        result.fail("GET \"" + RFC_PTR11_ENC + "\"",
-            "GET operation failed for \"" + RFC_PTR11_ENC + "\" path");
+      if (!JsonAssert.assertEquals(out, check)) {
+        result.fail("GET \"" + PointerRFCObject.RFC_PTR11_ENC + "\"",
+            "GET operation failed for \"" + PointerRFCObject.RFC_PTR11_ENC + "\" path");
       }
     } catch (JsonException e) {
-      result.fail("GET \"" + RFC_PTR11_ENC + "\"",
+      result.fail("GET \"" + PointerRFCObject.RFC_PTR11_ENC + "\"",
           "GET operation exception: " + e.getMessage());
     }
   }
@@ -463,20 +462,20 @@
   private void testResolveValidNumericIndexInArray(final TestResult result) {
     LOGGER.info(
         " - resolving of pointer containing existing numeric array index");
-    final JsonArray[] arraysIn = new JsonArray[] { createSimpleStringArray5(),
-        createSimpleIntArray5(), createSimpleBoolArray5(),
-        createSimpleObjectArray5() };
-    final JsonValue[] strings = new JsonValue[] { toJsonValue(STR_VALUE_1),
-        toJsonValue(STR_VALUE_2), toJsonValue(STR_VALUE_3),
-        toJsonValue(STR_VALUE_4), toJsonValue(STR_VALUE_5) };
-    final JsonValue[] ints = new JsonValue[] { toJsonValue(INT_VALUE_1),
-        toJsonValue(INT_VALUE_2), toJsonValue(INT_VALUE_3),
-        toJsonValue(INT_VALUE_4), toJsonValue(INT_VALUE_5) };
-    final JsonValue[] bools = new JsonValue[] { toJsonValue(BOOL_FALSE),
-        toJsonValue(BOOL_TRUE), toJsonValue(BOOL_TRUE), toJsonValue(BOOL_FALSE),
-        toJsonValue(BOOL_TRUE) };
-    final JsonValue[] objs = new JsonValue[] { OBJ_VALUE_1, OBJ_VALUE_2,
-        OBJ_VALUE_3, OBJ_VALUE_4, OBJ_VALUE_5 };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createSimpleStringArray5(),
+        SimpleValues.createSimpleIntArray5(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createSimpleObjectArray5() };
+    final JsonValue[] strings = new JsonValue[] { SimpleValues.toJsonValue(SimpleValues.STR_VALUE_1),
+        SimpleValues.toJsonValue(SimpleValues.STR_VALUE_2), SimpleValues.toJsonValue(SimpleValues.STR_VALUE_3),
+        SimpleValues.toJsonValue(SimpleValues.STR_VALUE_4), SimpleValues.toJsonValue(SimpleValues.STR_VALUE_5) };
+    final JsonValue[] ints = new JsonValue[] { SimpleValues.toJsonValue(SimpleValues.INT_VALUE_1),
+        SimpleValues.toJsonValue(SimpleValues.INT_VALUE_2), SimpleValues.toJsonValue(SimpleValues.INT_VALUE_3),
+        SimpleValues.toJsonValue(SimpleValues.INT_VALUE_4), SimpleValues.toJsonValue(SimpleValues.INT_VALUE_5) };
+    final JsonValue[] bools = new JsonValue[] { SimpleValues.toJsonValue(SimpleValues.BOOL_FALSE),
+        SimpleValues.toJsonValue(SimpleValues.BOOL_TRUE), SimpleValues.toJsonValue(SimpleValues.BOOL_TRUE), SimpleValues.toJsonValue(SimpleValues.BOOL_FALSE),
+        SimpleValues.toJsonValue(SimpleValues.BOOL_TRUE) };
+    final JsonValue[] objs = new JsonValue[] { SimpleValues.OBJ_VALUE_1, SimpleValues.OBJ_VALUE_2,
+        SimpleValues.OBJ_VALUE_3, SimpleValues.OBJ_VALUE_4, SimpleValues.OBJ_VALUE_5 };
     final JsonValue[][] checks = new JsonValue[][] { strings, ints, bools,
         objs };
     // Go trough all array types
@@ -486,7 +485,7 @@
         final String path = "/" + Integer.toString(j);
         final JsonPointer ptr = Json.createPointer(path);
         final JsonValue out = ptr.getValue(arraysIn[i]);
-        if (!assertEquals(out, checks[i][j])) {
+        if (!JsonAssert.assertEquals(out, checks[i][j])) {
           JsonValue.ValueType type = checks[i][j].getValueType();
           String typeName = type == JsonValue.ValueType.TRUE
               || type == JsonValue.ValueType.FALSE ? "boolean"
@@ -516,9 +515,9 @@
    */
   private void testResolveMemberAfterLastInArray(final TestResult result) {
     LOGGER.info(" - resolving of array \"/-\" pointer");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray(), createSimpleIntArray5(), createBoolArray2(),
-        createSimpleObjectArray5() };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray(), SimpleValues.createSimpleIntArray5(), SimpleValues.createBoolArray2(),
+        SimpleValues.createSimpleObjectArray5() };
     final String[] typeNames = new String[] { "empty", "String", "int",
         "boolean", "JsonObject" };
     // Go trough all array types
@@ -550,9 +549,9 @@
       final TestResult result) {
     LOGGER.info(
         " - resolving of pointer containing numeric array index with leading '0' (optional)");
-    final JsonArray[] arraysIn = new JsonArray[] { createSimpleStringArray5(),
-        createSimpleIntArray5(), createSimpleBoolArray5(),
-        createSimpleObjectArray5() };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createSimpleStringArray5(),
+        SimpleValues.createSimpleIntArray5(), SimpleValues.createSimpleBoolArray5(),
+        SimpleValues.createSimpleObjectArray5() };
     final String[] typeNames = new String[] { "String", "int", "boolean",
         "JsonObject" };
     // Go trough all array types
@@ -587,9 +586,9 @@
    */
   private void testResolvenonNumericIndexInArray(final TestResult result) {
     LOGGER.info(" - resolving of pointer containing non numeric array index");
-    final JsonArray[] arraysIn = new JsonArray[] { createEmptyArray(),
-        createStringArray(), createSimpleIntArray5(), createBoolArray2(),
-        createSimpleObjectArray5() };
+    final JsonArray[] arraysIn = new JsonArray[] { SimpleValues.createEmptyArray(),
+        SimpleValues.createStringArray(), SimpleValues.createSimpleIntArray5(), SimpleValues.createBoolArray2(),
+        SimpleValues.createSimpleObjectArray5() };
     final String[] typeNames = new String[] { "empty", "String", "int",
         "boolean", "JsonObject" };
     final String wholeDocument = "";
@@ -599,7 +598,7 @@
       final JsonPointer wholeDocPtr = Json.createPointer(wholeDocument);
       try {
         final JsonValue wholeOut = wholeDocPtr.getValue(arraysIn[i]);
-        if (!assertEquals(wholeOut, arraysIn[i])) {
+        if (!JsonAssert.assertEquals(wholeOut, arraysIn[i])) {
           result.fail("GET \"" + wholeDocument + "\"",
               "GET operation failed for \"" + wholeDocument + "\" path on "
                   + typeNames[i] + " array");
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerTests.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerTests.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerTests.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerTests.java
index 7013aa0..8f38c33 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/pointertests/PointerTests.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/pointertests/PointerTests.java
@@ -14,9 +14,9 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.pointertests;
+package ee.jakarta.tck.jsonp.api.pointertests;
 
-import jakarta.jsonp.tck.api.common.TestResult;
+import ee.jakarta.tck.jsonp.api.common.TestResult;
 import org.junit.jupiter.api.Test;
 import org.opentest4j.AssertionFailedError;
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/provider/JsonProviderTest.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/provider/JsonProviderTest.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/provider/JsonProviderTest.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/provider/JsonProviderTest.java
index 573458b..a99ce5f 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/api/provider/JsonProviderTest.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/api/provider/JsonProviderTest.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.api.provider;
+package ee.jakarta.tck.jsonp.api.provider;
 
 import java.io.InputStream;
 import java.io.OutputStream;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/ApiCheckDriver.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/ApiCheckDriver.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/ApiCheckDriver.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/ApiCheckDriver.java
index bcc1ed2..a1e858b 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/ApiCheckDriver.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/ApiCheckDriver.java
@@ -17,7 +17,7 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/ApiCheckRecorder.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/ApiCheckRecorder.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/ApiCheckRecorder.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/ApiCheckRecorder.java
index 0ebcc91..866a1c1 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/ApiCheckRecorder.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/ApiCheckRecorder.java
@@ -18,7 +18,7 @@
  * @(#)SigTestRecorder.java	1.1 03/03/05
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.lang.reflect.Method;
 import java.util.ArrayList;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/PackageList.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/PackageList.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/PackageList.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/PackageList.java
index 6706713..adadb2b 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/PackageList.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/PackageList.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.io.BufferedReader;
 import java.io.BufferedWriter;
@@ -27,7 +27,6 @@
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/README b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/README
similarity index 96%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/README
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/README
index 9c061a9..9c43d52 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/README
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/README
@@ -47,4 +47,4 @@
 
   2. The signature test alone can be run using below command within impl-tck/ directory.
 
-    mvn clean test -Dtest=jakarta.jsonp.tck.signaturetest.jsonp.JSONPSigTest#signatureTest
+    mvn clean test -Dtest=JSONPSigTest#signatureTest
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/Recorder.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/Recorder.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/Recorder.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/Recorder.java
index 67f4778..8a0baa8 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/Recorder.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/Recorder.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.io.BufferedInputStream;
 import java.io.File;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/RecorderFactory.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/RecorderFactory.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/RecorderFactory.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/RecorderFactory.java
index 68470b2..b5faa03 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/RecorderFactory.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/RecorderFactory.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 /**
  * <p>
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTest.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTest.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTest.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTest.java
index c3f25b9..769a7de 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTest.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTest.java
@@ -19,16 +19,12 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.InputStreamReader;
 import java.io.PrintWriter;
 import java.io.PrintStream;
 
 import java.util.ArrayList;
-import java.util.Properties;
 import java.util.logging.Logger;
 
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestData.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestData.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestData.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestData.java
index 8c2d157..53693e5 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestData.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestData.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.util.Properties;
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestDriver.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestDriver.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestDriver.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestDriver.java
index 1b8619e..9965358 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestDriver.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestDriver.java
@@ -14,7 +14,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.io.ByteArrayOutputStream;
 import java.io.File;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestEE.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestEE.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestEE.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestEE.java
index fbefc2e..cd33521 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestEE.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestEE.java
@@ -14,12 +14,11 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.io.BufferedReader;
 import java.io.File;
 import java.io.InputStreamReader;
-import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.PrintStream;
 
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestRecorder.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestRecorder.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestRecorder.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestRecorder.java
index 81513e4..03c4ba8 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestRecorder.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestRecorder.java
@@ -17,7 +17,7 @@
 /*
  * @(#)SigTestRecorder.java	1.1 03/03/05
  */
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.io.File;
 import java.io.PrintWriter;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestResult.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestResult.java
similarity index 98%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestResult.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestResult.java
index b97819f..35d2694 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SigTestResult.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SigTestResult.java
@@ -17,7 +17,7 @@
 /*
  * $Id$
  */
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.io.Serializable;
 import java.util.ArrayList;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SignatureTestDriver.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SignatureTestDriver.java
similarity index 99%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SignatureTestDriver.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SignatureTestDriver.java
index fb2b0e4..738ce18 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SignatureTestDriver.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SignatureTestDriver.java
@@ -15,7 +15,7 @@
  * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 import java.io.File;
 import java.io.FileInputStream;
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SignatureTestDriverFactory.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SignatureTestDriverFactory.java
similarity index 97%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SignatureTestDriverFactory.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SignatureTestDriverFactory.java
index 4ec4908..ff455a5 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/SignatureTestDriverFactory.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/SignatureTestDriverFactory.java
@@ -18,7 +18,7 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.signaturetest;
+package ee.jakarta.tck.jsonp.signaturetest;
 
 /**
  * <p>
diff --git a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/jsonp/JSONPSigTest.java b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/jsonp/JSONPSigTest.java
similarity index 94%
rename from tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/jsonp/JSONPSigTest.java
rename to tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/jsonp/JSONPSigTest.java
index 9cb534c..7220913 100644
--- a/tck/tck-tests/src/main/java/jakarta/jsonp/tck/signaturetest/jsonp/JSONPSigTest.java
+++ b/tck/tck-tests/src/main/java/ee/jakarta/tck/jsonp/signaturetest/jsonp/JSONPSigTest.java
@@ -18,23 +18,18 @@
  * $Id$
  */
 
-package jakarta.jsonp.tck.signaturetest.jsonp;
+package ee.jakarta.tck.jsonp.signaturetest.jsonp;
 
-import java.io.PrintWriter;
 import java.util.Properties;
 
+import ee.jakarta.tck.jsonp.signaturetest.SigTestEE;
+import ee.jakarta.tck.jsonp.signaturetest.SigTestResult;
 import org.junit.jupiter.api.Test;
 
-import jakarta.jsonp.tck.signaturetest.SigTestEE;
-import jakarta.jsonp.tck.signaturetest.SignatureTestDriver;
-import jakarta.jsonp.tck.signaturetest.SignatureTestDriverFactory;
-import jakarta.jsonp.tck.signaturetest.SigTestResult;
-
 
 import java.io.*;
 
 import java.util.ArrayList;
-import java.util.Properties;
 import java.util.logging.Logger;
 
 
@@ -170,12 +165,12 @@
     Properties mapFileAsProps = null;
     try {
 
-    InputStream inStreamMapfile = JSONPSigTest.class.getClassLoader().getResourceAsStream("jakarta/jsonp/tck/signaturetest/sig-test.map");
+    InputStream inStreamMapfile = JSONPSigTest.class.getClassLoader().getResourceAsStream("ee/jakarta/tck/jsonp/signaturetest/sig-test.map");
     File mFile = writeStreamToTempFile(inStreamMapfile, "sig-test", ".map");
     mapFile = mFile.getCanonicalPath();
     LOGGER.info("mapFile location is :"+mapFile);
 
-    InputStream inStreamPackageFile = JSONPSigTest.class.getClassLoader().getResourceAsStream("jakarta/jsonp/tck/signaturetest/sig-test-pkg-list.txt");
+    InputStream inStreamPackageFile = JSONPSigTest.class.getClassLoader().getResourceAsStream("ee/jakarta/tck/jsonp/signaturetest/sig-test-pkg-list.txt");
     File pFile = writeStreamToTempFile(inStreamPackageFile, "sig-test-pkg-list", ".txt");
     packageFile = pFile.getCanonicalPath();
     LOGGER.info("packageFile location is :"+packageFile);
@@ -184,7 +179,7 @@
     String packageVersion = mapFileAsProps.getProperty("jakarta.json");
     LOGGER.info("Package version from mapfile :"+ packageVersion);
 
-    InputStream inStreamSigFile = JSONPSigTest.class.getClassLoader().getResourceAsStream("jakarta/jsonp/tck/signaturetest/jakarta.json.sig_"+packageVersion);
+    InputStream inStreamSigFile = JSONPSigTest.class.getClassLoader().getResourceAsStream("ee/jakarta/tck/jsonp/signaturetest/jakarta.json.sig_"+packageVersion);
     File sigFile = writeStreamToSigFile(inStreamSigFile, packageVersion);
     LOGGER.info("signature File location is :"+sigFile.getCanonicalPath());
     repositoryDir = System.getProperty("java.io.tmpdir");
diff --git a/tck/tck-tests/src/main/resources/jakarta/jsonp/tck/signaturetest/jakarta.json.sig_2.1.0 b/tck/tck-tests/src/main/resources/ee/jakarta/tck/jsonp/signaturetest/jakarta.json.sig_2.1.0
similarity index 100%
rename from tck/tck-tests/src/main/resources/jakarta/jsonp/tck/signaturetest/jakarta.json.sig_2.1.0
rename to tck/tck-tests/src/main/resources/ee/jakarta/tck/jsonp/signaturetest/jakarta.json.sig_2.1.0
diff --git a/tck/tck-tests/src/main/resources/jakarta/jsonp/tck/signaturetest/sig-test-pkg-list.txt b/tck/tck-tests/src/main/resources/ee/jakarta/tck/jsonp/signaturetest/sig-test-pkg-list.txt
similarity index 100%
rename from tck/tck-tests/src/main/resources/jakarta/jsonp/tck/signaturetest/sig-test-pkg-list.txt
rename to tck/tck-tests/src/main/resources/ee/jakarta/tck/jsonp/signaturetest/sig-test-pkg-list.txt
diff --git a/tck/tck-tests/src/main/resources/jakarta/jsonp/tck/signaturetest/sig-test.map b/tck/tck-tests/src/main/resources/ee/jakarta/tck/jsonp/signaturetest/sig-test.map
similarity index 100%
rename from tck/tck-tests/src/main/resources/jakarta/jsonp/tck/signaturetest/sig-test.map
rename to tck/tck-tests/src/main/resources/ee/jakarta/tck/jsonp/signaturetest/sig-test.map
