diff --git a/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/model/auction/StaticUser.java b/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/model/auction/StaticUser.java
index 3beaff7..95820f6 100644
--- a/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/model/auction/StaticUser.java
+++ b/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/model/auction/StaticUser.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -31,6 +31,8 @@
 
 import org.eclipse.persistence.annotations.PrivateOwned;
 
+import java.util.Objects;
+
 @NamedQueries({
     @NamedQuery(
         name="User.all",
@@ -123,7 +125,7 @@
     }
 
     public boolean equals(Object object){
-        if (object == null || !(object instanceof StaticUser)){
+        if (!(object instanceof StaticUser)){
             return false;
         }
         StaticUser user = (StaticUser)object;
@@ -136,5 +138,8 @@
         return id == user.getId() && name.equals(user.getName()) && (address == null || address.getId() == user.getAddress().getId());
     }
 
-
+    @Override
+    public int hashCode() {
+        return Objects.hash(id, name, address);
+    }
 }
diff --git a/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/util/RestUtils.java b/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/util/RestUtils.java
index 0186e9a..183b138 100644
--- a/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/util/RestUtils.java
+++ b/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/util/RestUtils.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -17,7 +17,6 @@
 package org.eclipse.persistence.jpars.test.util;
 
 import jakarta.ws.rs.client.Client;
-import org.eclipse.persistence.jpa.rs.MatrixParameters;
 import org.eclipse.persistence.jpa.rs.PersistenceContext;
 import org.eclipse.persistence.jpa.rs.QueryParameters;
 import org.eclipse.persistence.jpa.rs.exceptions.ErrorResponse;
@@ -40,14 +39,13 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.UnsupportedEncodingException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.nio.charset.StandardCharsets;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.logging.Logger;
 
 import static org.junit.Assert.fail;
 
@@ -58,7 +56,6 @@
  *          Dmitry Kornilov - JAXRS 2.x, Jersey 2.x
  */
 public class RestUtils {
-    public static final String JPA_RS_VERSION_STRING = "jpars.version.string";
 
     private static final String APPLICATION_LOCATION = "/eclipselink.jpars.test/persistence/";
     private static final String SERVER_URI_BASE = "server.uri.base";
@@ -67,7 +64,6 @@
     private static final String XML_REST_MESSAGE_FOLDER = "org/eclipse/persistence/jpars/test/restmessage/xml/";
     private static final String IMAGE_FOLDER = "org/eclipse/persistence/jpars/test/image/";
 
-    private static final Logger logger = Logger.getLogger("org.eclipse.persistence.jpars.test.server");
     private static final Client client = ClientBuilder.newClient();
 
     /**
@@ -101,7 +97,7 @@
      * @return string containing XML or JSON representation of given object
      */
     public static String marshal(PersistenceContext context, Object object, MediaType mediaType)
-            throws JAXBException, UnsupportedEncodingException {
+            throws JAXBException {
         return marshal(context, object, mediaType, true);
     }
 
@@ -116,10 +112,10 @@
      * @return string containing XML or JSON representation of given object
      */
     public static String marshal(PersistenceContext context, Object object, MediaType mediaType, boolean sendRelationships)
-            throws JAXBException, UnsupportedEncodingException {
+            throws JAXBException {
         ByteArrayOutputStream os = new ByteArrayOutputStream();
         context.marshall(object, mediaType, os, sendRelationships);
-        return os.toString("UTF-8");
+        return os.toString(StandardCharsets.UTF_8);
     }
 
     /**
@@ -197,9 +193,9 @@
      * @param tenantId tenantId or null if no tenant
      * @return XML or JSON representation of retrieved object
      */
-    public static String restRead(PersistenceContext context,
+    public static <T> String restRead(PersistenceContext context,
                                   Object id,
-                                  Class resultClass,
+                                  Class<T> resultClass,
                                   MediaType outputMediaType,
                                   Map<String, String> tenantId) throws RestCallFailedException, URISyntaxException {
         final String uri = new UriBuilder(context).addTenantInfo(tenantId).addEntity(resultClass.getSimpleName(), id).toString();
@@ -216,7 +212,7 @@
      * @param outputMediaType media type to use (XML or JSON)
      * @return XML or JSON representation of retrieved object
      */
-    public static String restRead(PersistenceContext context, Object id, Class resultClass, MediaType outputMediaType)
+    public static <T> String restRead(PersistenceContext context, Object id, Class<T> resultClass, MediaType outputMediaType)
             throws RestCallFailedException, URISyntaxException {
         return restRead(context, id, resultClass, outputMediaType, null);
     }
@@ -229,7 +225,7 @@
      * @param resultClass type of the object to retrieve
      * @return XML or JSON representation of retrieved object
      */
-    public static String restRead(PersistenceContext context, Object id, Class resultClass)
+    public static <T> String restRead(PersistenceContext context, Object id, Class<T> resultClass)
             throws RestCallFailedException, URISyntaxException {
         return restRead(context, id, resultClass, MediaType.APPLICATION_JSON_TYPE);
     }
@@ -242,7 +238,6 @@
      * @param resultClass type of the object to retrieve
      * @return retrieved object
      */
-    @SuppressWarnings("unchecked")
     public static <T> T restReadByHref(PersistenceContext context, String href, Class<T> resultClass)
             throws RestCallFailedException, JAXBException {
         final Response response = doGet(context, href, MediaType.APPLICATION_JSON_TYPE);
@@ -282,14 +277,13 @@
      * @param sendLinks if true links will be marshalled
      * @return updated object
      */
-    @SuppressWarnings("unchecked")
     public static <T> T restUpdate(PersistenceContext context,
                                    Object object,
                                    Class<T> resultClass,
                                    Map<String, String> tenantId,
                                    MediaType mediaType,
                                    boolean sendLinks)
-            throws RestCallFailedException, URISyntaxException, JAXBException, UnsupportedEncodingException {
+            throws RestCallFailedException, URISyntaxException, JAXBException {
         String marshalledObj = marshal(context, object, mediaType, sendLinks);
         String uri = new UriBuilder(context).addTenantInfo(tenantId).addEntity(resultClass.getSimpleName()).toString();
         Response response = doPost(context, uri, Entity.entity(marshalledObj, mediaType), mediaType);
@@ -305,7 +299,7 @@
      * @return updated object
      */
     public static <T> T restUpdate(PersistenceContext context, Object object, Class<T> resultClass)
-            throws RestCallFailedException, URISyntaxException, JAXBException, UnsupportedEncodingException {
+            throws RestCallFailedException, URISyntaxException, JAXBException {
         return restUpdate(context, object, resultClass, null, MediaType.APPLICATION_JSON_TYPE, true);
     }
 
@@ -319,7 +313,7 @@
      * @return updated object
      */
     public static <T> T restUpdate(PersistenceContext context, Object object, Class<T> resultClass, boolean sendLinks)
-            throws RestCallFailedException, URISyntaxException, JAXBException, UnsupportedEncodingException {
+            throws RestCallFailedException, URISyntaxException, JAXBException {
         return restUpdate(context, object, resultClass, null, MediaType.APPLICATION_JSON_TYPE, sendLinks);
     }
 
@@ -333,9 +327,9 @@
      * @param mediaType media type to use (XML or JSON)
      * @return updated object in XMK or JSON depending on passed media type
      */
-    public static String restUpdateStr(PersistenceContext context,
+    public static <T> String restUpdateStr(PersistenceContext context,
                                        String message,
-                                       Class resultClass,
+                                       Class<T> resultClass,
                                        Map<String, String> tenantId,
                                        MediaType mediaType) throws RestCallFailedException, URISyntaxException {
         final String uri = new UriBuilder(context).addTenantInfo(tenantId).addEntity(resultClass.getSimpleName()).toString();
@@ -355,13 +349,12 @@
      *                  the actual objects in the relationships
      * @return created object
      */
-    @SuppressWarnings("unchecked")
     public static <T> T restCreate(PersistenceContext context,
                                    Object object,
                                    Class<T> resultClass,
                                    Map<String, String> tenantId,
                                    MediaType mediaType, boolean sendLinks)
-            throws RestCallFailedException, URISyntaxException, JAXBException, UnsupportedEncodingException {
+            throws RestCallFailedException, URISyntaxException, JAXBException {
         final String marshalledObj = marshal(context, object, mediaType, sendLinks);
         final String uri = new UriBuilder(context).addTenantInfo(tenantId).addEntity(resultClass.getSimpleName()).toString();
         final Response response = doPut(context, uri, Entity.entity(marshalledObj, mediaType), mediaType);
@@ -381,7 +374,7 @@
                                    Object object,
                                    Class<T> resultClass,
                                    MediaType mediaType)
-            throws RestCallFailedException, URISyntaxException, JAXBException, UnsupportedEncodingException {
+            throws RestCallFailedException, URISyntaxException, JAXBException {
         return restCreate(context, object, resultClass, null, mediaType, false);
     }
 
@@ -394,7 +387,7 @@
      * @return created object
      */
     public static <T> T restCreate(PersistenceContext context, Object object, Class<T> resultClass)
-            throws RestCallFailedException, URISyntaxException, JAXBException, UnsupportedEncodingException {
+            throws RestCallFailedException, URISyntaxException, JAXBException {
         return restCreate(context, object, resultClass, MediaType.APPLICATION_JSON_TYPE);
     }
 
@@ -407,7 +400,6 @@
      * @param mediaType media type to use (XML or JSON)
      * @return created object
      */
-    @SuppressWarnings("unchecked")
     public static <T> T restCreateStr(PersistenceContext context,
                                       String msg,
                                       Class<T> resultClass,
@@ -425,9 +417,9 @@
      * @param resultClass the result object type
      * @param mediaType media type to use (XML or JSON)
      */
-    public static void restCreateWithSequence(PersistenceContext context,
+    public static <T> void restCreateWithSequence(PersistenceContext context,
                                               String msg,
-                                              Class resultClass,
+                                              Class<T> resultClass,
                                               MediaType mediaType) throws URISyntaxException {
         final String uri = new UriBuilder(context).addEntity(resultClass.getSimpleName()).toString();
         doPut(context, uri, Entity.entity(msg, mediaType), mediaType);
@@ -442,9 +434,9 @@
      * @param tenantId the tenant id
      * @param mediaType media type to use (XML or JSON)
      */
-    public static void restDelete(PersistenceContext context,
+    public static <T> void restDelete(PersistenceContext context,
                                   Object id,
-                                  Class resultClass,
+                                  Class<T> resultClass,
                                   Map<String, String> tenantId,
                                   MediaType mediaType) throws RestCallFailedException, URISyntaxException {
         final String uri = new UriBuilder(context).addTenantInfo(tenantId).addEntity(resultClass.getSimpleName(), id).toString();
@@ -459,9 +451,9 @@
      * @param resultClass the result object type
      * @param mediaType media type to use (XML or JSON)
      */
-    public static void restDelete(PersistenceContext context,
+    public static <T> void restDelete(PersistenceContext context,
                                   Object id,
-                                  Class resultClass,
+                                  Class<T> resultClass,
                                   MediaType mediaType) throws RestCallFailedException, URISyntaxException {
         restDelete(context, id, resultClass, null, mediaType);
     }
@@ -473,7 +465,7 @@
      * @param id ID of object to delete
      * @param resultClass the result object type
      */
-    public static void restDelete(PersistenceContext context, Object id, Class resultClass)
+    public static <T> void restDelete(PersistenceContext context, Object id, Class<T> resultClass)
             throws RestCallFailedException, URISyntaxException {
         restDelete(context, id, resultClass, null, MediaType.APPLICATION_JSON_TYPE);
     }
@@ -667,14 +659,13 @@
      * @param mediaType media type to use (XML or JSON)
      * @return updated object
      */
-    @SuppressWarnings("unchecked")
     public static <T> T restUpdateRelationship(PersistenceContext context,
                                                String objectId,
                                                String relationshipName,
                                                Object newValue,
                                                Class<T> resultClass,
                                                MediaType mediaType)
-            throws RestCallFailedException, URISyntaxException, JAXBException, UnsupportedEncodingException {
+            throws RestCallFailedException, URISyntaxException, JAXBException {
         final String newValueStr = marshal(context, newValue, mediaType);
         final String uri = new UriBuilder(context).addEntity(resultClass.getSimpleName(), objectId, relationshipName).toString();
         final Response response = doPost(context, uri, Entity.entity(newValueStr, mediaType), mediaType);
@@ -695,19 +686,19 @@
      *                  the actual objects in the relationships
      * @return the string
      */
-    public static String restUpdateBidirectionalRelationship(PersistenceContext context,
+    public static <T> String restUpdateBidirectionalRelationship(PersistenceContext context,
                                                              String objectId,
-                                                             Class objectType,
+                                                             Class<T> objectType,
                                                              String relationshipName,
                                                              Object newValue,
                                                              MediaType mediaType,
                                                              String partner,
                                                              boolean sendLinks)
-            throws RestCallFailedException, URISyntaxException, JAXBException, UnsupportedEncodingException {
+            throws RestCallFailedException, URISyntaxException, JAXBException {
         // Construct parameters
         final Map<String, Object> params = new HashMap<>(1);
         if (partner != null) {
-            params.put(MatrixParameters.JPARS_RELATIONSHIP_PARTNER, partner);
+            params.put(QueryParameters.JPARS_RELATIONSHIP_PARTNER, partner);
         }
 
         final String newValueStr = marshal(context, newValue, mediaType, sendLinks);
@@ -728,14 +719,14 @@
      * @param listItemId the list item id
      * @return the string
      */
-    public static String restRemoveBidirectionalRelationship(PersistenceContext context,
+    public static <T> String restRemoveBidirectionalRelationship(PersistenceContext context,
                                                              String objectId,
-                                                             Class objectType,
+                                                             Class<T> objectType,
                                                              String relationshipName,
                                                              MediaType mediaType,
                                                              String partner,
                                                              String listItemId)
-            throws RestCallFailedException, URISyntaxException, JAXBException {
+            throws RestCallFailedException, URISyntaxException {
         // Construct hints
         final Map<String, String> hints = new HashMap<>();
         if (partner != null) {
@@ -781,6 +772,9 @@
      */
     public static byte[] convertImageToByteArray(String imageName) throws IOException {
         final InputStream is = Thread.currentThread().getContextClassLoader().getResourceAsStream(IMAGE_FOLDER + imageName);
+        if (is == null) {
+            throw new IOException("Cannot find " + IMAGE_FOLDER + imageName);
+        }
         final BufferedImage originalImage = ImageIO.read(is);
         final ByteArrayOutputStream baos = new ByteArrayOutputStream();
         ImageIO.write(originalImage, getExtension(new File(imageName)), baos);
@@ -797,9 +791,9 @@
      * @param outputMediaType the output media type
      * @return attribute
      */
-    public static String restFindAttribute(PersistenceContext context,
+    public static <T> String restFindAttribute(PersistenceContext context,
                                            Object id,
-                                           Class objectType,
+                                           Class<T> objectType,
                                            String attribute,
                                            MediaType outputMediaType) throws RestCallFailedException, URISyntaxException {
         final String uri = new UriBuilder(context).addEntity(objectType.getSimpleName(), id, attribute).toString();
@@ -819,9 +813,9 @@
      * @param outputMediaType the output media type
      * @return attribute
      */
-    public static String restFindAttribute(PersistenceContext context,
+    public static <T> String restFindAttribute(PersistenceContext context,
                                            Object id,
-                                           Class objectType,
+                                           Class<T> objectType,
                                            String attribute,
                                            Map<String, Object> parameters,
                                            Map<String, String> hints,
@@ -874,7 +868,7 @@
      * @param outputMediaType media type to use
      * @return response
      */
-    public static Response doPost(PersistenceContext context, String uri, Entity entity, MediaType outputMediaType) {
+    public static Response doPost(PersistenceContext context, String uri, Entity<String> entity, MediaType outputMediaType) {
         final Response response = client.target(uri).request(outputMediaType).accept(outputMediaType).post(entity);
         checkResponse(Response.Status.OK, context, outputMediaType, response);
         return response;
@@ -889,7 +883,7 @@
      * @param outputMediaType media type to use
      * @return response
      */
-    public static Response doPut(PersistenceContext context, String uri, Entity entity, MediaType outputMediaType) {
+    public static Response doPut(PersistenceContext context, String uri, Entity<String> entity, MediaType outputMediaType) {
         final Response response = client.target(uri).request(outputMediaType).put(entity);
         checkResponse(Response.Status.CREATED, context, outputMediaType, response);
         return response;
diff --git a/jpa/org.eclipse.persistence.jpars/src/main/java/module-info.java b/jpa/org.eclipse.persistence.jpars/src/main/java/module-info.java
index bbba65d..f66347f 100644
--- a/jpa/org.eclipse.persistence.jpars/src/main/java/module-info.java
+++ b/jpa/org.eclipse.persistence.jpars/src/main/java/module-info.java
@@ -17,7 +17,6 @@
 
     requires jakarta.persistence;
     requires jakarta.xml.bind;
-    requires jakarta.activation;
     requires transitive jakarta.annotation;
     requires transitive jakarta.ws.rs;
 
@@ -30,6 +29,8 @@
 
     exports org.eclipse.persistence.jpa.rs.service;
 
+    uses org.eclipse.persistence.jpa.rs.PersistenceContextFactoryProvider;
+
     provides org.eclipse.persistence.jpa.rs.PersistenceContextFactoryProvider with
             org.eclipse.persistence.jpa.rs.service.JPARSPersistenceContextFactoryProvider;
 }
diff --git a/jpa/org.eclipse.persistence.jpars/src/main/java/org/eclipse/persistence/jpa/rs/service/JPARSApplication.java b/jpa/org.eclipse.persistence.jpars/src/main/java/org/eclipse/persistence/jpa/rs/service/JPARSApplication.java
index 5e049bf..7e15882 100644
--- a/jpa/org.eclipse.persistence.jpars/src/main/java/org/eclipse/persistence/jpa/rs/service/JPARSApplication.java
+++ b/jpa/org.eclipse.persistence.jpars/src/main/java/org/eclipse/persistence/jpa/rs/service/JPARSApplication.java
@@ -44,7 +44,7 @@
      * Instantiates a new jPARS application.
      */
     public JPARSApplication() {
-        HashSet<Class<?>> c = new HashSet<Class<?>>();
+        HashSet<Class<?>> c = new HashSet<>();
 
         // Unversioned Resources (resources that do not have version in the url)
         c.add(org.eclipse.persistence.jpa.rs.resources.unversioned.PersistenceResource.class);
