add generics to ValueHolders,
related cleanup
cleanup in remote sessions related code

Signed-off-by: Lukas Jungmann <lukas.jungmann@oracle.com>
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassDescriptor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassDescriptor.java
index d366280..87d9c80 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassDescriptor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassDescriptor.java
@@ -1014,13 +1014,13 @@
                 if (session.getIntegrityChecker().checkTable(table, session)) {
                     // To load the fields of database into a vector
                     List databaseFields = new ArrayList();
-                    List result = session.getAccessor().getColumnInfo(null, null, table.getName(), null, session);
+                    List<AbstractRecord> result = session.getAccessor().getColumnInfo(null, null, table.getName(), null, session);
                     // Table name may need to be lowercase.
                     if (result.isEmpty() && session.getPlatform().shouldForceFieldNamesToUpperCase()) {
                         result = session.getAccessor().getColumnInfo(null, null, table.getName().toLowerCase(), null, session);
                     }
-                    for (Iterator resultIterator = result.iterator(); resultIterator.hasNext();) {
-                        AbstractRecord row = (AbstractRecord)resultIterator.next();
+                    for (Iterator<AbstractRecord> resultIterator = result.iterator(); resultIterator.hasNext();) {
+                        AbstractRecord row = resultIterator.next();
                         if (session.getPlatform().shouldForceFieldNamesToUpperCase()) {
                             databaseFields.add(((String)row.get("COLUMN_NAME")).toUpperCase());
                         } else {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/dynamic/DynamicHelper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/dynamic/DynamicHelper.java
index 7174d37..881f20f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/dynamic/DynamicHelper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/dynamic/DynamicHelper.java
@@ -238,6 +238,12 @@
      */
     public static class SessionCustomizer implements org.eclipse.persistence.config.SessionCustomizer {
 
+        /**
+         * Default constructor.
+         */
+        public SessionCustomizer() {
+        }
+
         @Override
         public void customize(Session session) throws Exception {
             DynamicClassLoader dcl = DynamicClassLoader.lookup(session);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISMappedRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISMappedRecord.java
index 462c224..9175b59 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISMappedRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISMappedRecord.java
@@ -55,7 +55,7 @@
      */
     @Override
     public Vector getValues() {
-        return new Vector(getRecord().values());
+        return new Vector<>(getRecord().values());
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/IntegrityChecker.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/IntegrityChecker.java
index c02ae21..33e3d77 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/IntegrityChecker.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/IntegrityChecker.java
@@ -28,7 +28,7 @@
 public class IntegrityChecker implements Serializable {
 
     /** To add all the Descriptor exceptions */
-    protected Vector caughtExceptions = null;
+    protected Vector<Exception> caughtExceptions = null;
 
     /** To load the tables from database    */
     protected Vector tables = null;
@@ -124,9 +124,9 @@
      * PUBLIC:
      * This method returns the vector which adds all the Descriptors Exceptions.
      */
-    public Vector getCaughtExceptions() {
+    public Vector<Exception> getCaughtExceptions() {
         if (caughtExceptions == null) {
-            caughtExceptions = new Vector();
+            caughtExceptions = new Vector<>();
         }
         return caughtExceptions;
     }
@@ -171,7 +171,7 @@
      */
     public boolean hasRuntimeExceptions() {
         if (hasErrors()) {
-            for (Enumeration exceptionsEnum = getCaughtExceptions().elements();
+            for (Enumeration<Exception> exceptionsEnum = getCaughtExceptions().elements();
                      exceptionsEnum.hasMoreElements();) {
                 if (exceptionsEnum.nextElement() instanceof RuntimeException) {
                     return true;
@@ -186,9 +186,9 @@
      * This method is used to get all the database tables and add them into a vector.
      */
     public void initializeTables(AbstractSession session) {
-        List result = session.getAccessor().getTableInfo(null, null, null, null, session);
-        for (Iterator iterator = result.iterator(); iterator.hasNext();) {
-            AbstractRecord row = (AbstractRecord)iterator.next();
+        List<AbstractRecord> result = session.getAccessor().getTableInfo(null, null, null, null, session);
+        for (Iterator<AbstractRecord> iterator = result.iterator(); iterator.hasNext();) {
+            AbstractRecord row = iterator.next();
             if (session.getPlatform().shouldForceFieldNamesToUpperCase()) {
                 this.tables.add(((String)row.get("TABLE_NAME")).toUpperCase());
             } else {
@@ -200,7 +200,7 @@
     /**
      * INTERNAL:
      */
-    public void setCaughtExceptions(Vector exceptions) {
+    public void setCaughtExceptions(Vector<Exception> exceptions) {
         this.caughtExceptions = exceptions;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/IntegrityException.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/IntegrityException.java
index 638406b..8d3e4f0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/IntegrityException.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/IntegrityException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -61,9 +61,9 @@
         java.io.PrintWriter writer = new java.io.PrintWriter(swriter);
         writer.println(cr + ExceptionMessageGenerator.getHeader("DescriptorExceptionsHeader"));
         writer.println("---------------------------------------------------------");
-        for (Enumeration enumtr = getIntegrityChecker().getCaughtExceptions().elements();
+        for (Enumeration<Exception> enumtr = getIntegrityChecker().getCaughtExceptions().elements();
                  enumtr.hasMoreElements();) {
-            Exception e = (Exception)enumtr.nextElement();
+            Exception e = enumtr.nextElement();
             if (e instanceof DescriptorException) {
                 writer.println(cr + e);
             }
@@ -72,9 +72,9 @@
         if (getIntegrityChecker().hasRuntimeExceptions()) {
             writer.println(cr + ExceptionMessageGenerator.getHeader("RuntimeExceptionsHeader"));
             writer.println("---------------------------------------------------------");
-            for (Enumeration enumtr = getIntegrityChecker().getCaughtExceptions().elements();
+            for (Enumeration<Exception> enumtr = getIntegrityChecker().getCaughtExceptions().elements();
                      enumtr.hasMoreElements();) {
-                Exception e = (Exception)enumtr.nextElement();
+                Exception e = enumtr.nextElement();
                 if (!(e instanceof DescriptorException)) {
                     writer.println(cr + e);
                 }
@@ -114,9 +114,9 @@
         String cr = org.eclipse.persistence.internal.helper.Helper.cr();
         writer.println(cr + ExceptionMessageGenerator.getHeader("DescriptorExceptionsHeader"));
         writer.println("---------------------------------------------------------");
-        for (Enumeration enumtr = getIntegrityChecker().getCaughtExceptions().elements();
+        for (Enumeration<Exception> enumtr = getIntegrityChecker().getCaughtExceptions().elements();
                  enumtr.hasMoreElements();) {
-            Exception e = (Exception)enumtr.nextElement();
+            Exception e = enumtr.nextElement();
             if (e instanceof DescriptorException) {
                 writer.println(cr);
                 e.printStackTrace(writer);
@@ -126,9 +126,9 @@
         if (getIntegrityChecker().hasRuntimeExceptions()) {
             writer.println(cr + ExceptionMessageGenerator.getHeader("RuntimeExceptionsHeader"));
             writer.println("---------------------------------------------------------");
-            for (Enumeration enumtr = getIntegrityChecker().getCaughtExceptions().elements();
+            for (Enumeration<Exception> enumtr = getIntegrityChecker().getCaughtExceptions().elements();
                      enumtr.hasMoreElements();) {
-                Exception e = (Exception)enumtr.nextElement();
+                Exception e = enumtr.nextElement();
                 if (!(e instanceof DescriptorException)) {
                     writer.println(cr);
                     e.printStackTrace(writer);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/indirection/IndirectSet.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/indirection/IndirectSet.java
index ef966c7..901b456 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/indirection/IndirectSet.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/indirection/IndirectSet.java
@@ -331,7 +331,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    return (Set<E>)AccessController.doPrivileged(new PrivilegedMethodInvoker(cloneMethod, this.getDelegate(), null));
+                    return AccessController.doPrivileged(new PrivilegedMethodInvoker<>(cloneMethod, this.getDelegate(), null));
                 } catch (PrivilegedActionException exception) {
                     Exception throwableException = exception.getException();
                     if (throwableException instanceof IllegalAccessException) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreField.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreField.java
index 9c757d1..2e1b6f5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreField.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreField.java
@@ -21,7 +21,7 @@
      */
     String getName();
 
-    <T> Class<T> getType();
+    Class<?> getType();
 
     /**
      * Set the unqualified name of the field.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Accessor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Accessor.java
index bd20024..73c35d1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Accessor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Accessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -125,7 +125,7 @@
      * Return the column metadata for the specified
      * selection criteria.
      */
-    Vector getColumnInfo(String catalog, String schema, String tableName, String columnName, AbstractSession session) throws DatabaseException;
+    Vector<AbstractRecord> getColumnInfo(String catalog, String schema, String tableName, String columnName, AbstractSession session) throws DatabaseException;
 
     /**
      * Return the JDBC connection for relational accessors.
@@ -148,7 +148,7 @@
      * Return the table metadata for the specified
      * selection criteria.
      */
-    Vector getTableInfo(String catalog, String schema, String tableName, String[] types, AbstractSession session) throws DatabaseException;
+    Vector<AbstractRecord> getTableInfo(String catalog, String schema, String tableName, String[] types, AbstractSession session) throws DatabaseException;
 
     /**
      * Increment the number of calls in progress.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/BindCallCustomParameter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/BindCallCustomParameter.java
index 409d275..e5abc8b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/BindCallCustomParameter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/BindCallCustomParameter.java
@@ -141,13 +141,13 @@
             return parameter;
         }
 
-        Collection container = (Collection)parameter;
+        Collection<?> container = (Collection<?>)parameter;
 
         DatabaseField nestedType = ordField.getNestedTypeField();
 
         Object[] fields = new Object[container.size()];
         int i = 0;
-        for (Iterator iter = container.iterator(); iter.hasNext();) {
+        for (Iterator<?> iter = container.iterator(); iter.hasNext();) {
             Object element = iter.next();
             if (element != null) {
                 element = convert(element, nestedType, session, connection);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabaseAccessor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabaseAccessor.java
index 0bf5977..87dc2ee 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabaseAccessor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabaseAccessor.java
@@ -759,7 +759,7 @@
                 }
             } else {
                 boolean hasMultipleResultsSets = call.hasMultipleResultSets();
-                Vector results = null;
+                Vector<AbstractRecord> results = null;
                 boolean hasMoreResultsSets = true;
                 while (hasMoreResultsSets) {
                     boolean hasNext = resultSet.next();
@@ -770,14 +770,14 @@
                             // do not close the result or statement as the rows are being fetched by the thread.
                             return buildThreadCursoredResult(call, resultSet, statement, metaData, session);
                         } else {
-                            results = new Vector(16);
+                            results = new Vector<>(16);
                             while (hasNext) {
                                 results.add(fetchRow(call.getFields(), call.getFieldsArray(), resultSet, metaData, session));
                                 hasNext = resultSet.next();
                             }
                         }
                     } else {
-                        results = new Vector(0);
+                        results = new Vector<>(0);
                     }
                     if (result == null) {
                         if (call.returnMultipleResultSetCollections()) {
@@ -817,7 +817,7 @@
      * This allows for the rows to be fetched concurrently to the objects being built.
      * This code is not currently publicly supported.
      */
-    protected Vector buildThreadCursoredResult(final DatabaseCall dbCall, final ResultSet resultSet, final Statement statement, final ResultSetMetaData metaData, final AbstractSession session) {
+    protected Vector<AbstractRecord> buildThreadCursoredResult(final DatabaseCall dbCall, final ResultSet resultSet, final Statement statement, final ResultSetMetaData metaData, final AbstractSession session) {
         final ThreadCursoredList<AbstractRecord> results = new ThreadCursoredList<>(20);
         Runnable runnable = new Runnable() {
             @Override
@@ -1042,7 +1042,7 @@
      */
     protected AbstractRecord fetchRow(Vector<DatabaseField> fields, ResultSet resultSet, ResultSetMetaData metaData, AbstractSession session) throws DatabaseException {
         int size = fields.size();
-        Vector values = NonSynchronizedVector.newInstance(size);
+        Vector<Object> values = NonSynchronizedVector.newInstance(size);
         // PERF: Pass platform and optimize data flag.
         DatabasePlatform platform = getPlatform();
         boolean optimizeData = platform.shouldOptimizeDataConversion();
@@ -1070,7 +1070,7 @@
      * match the number of column names available on the database.
      * PERF: This method must be highly optimized.
      */
-    public AbstractRecord fetchRow(Vector fields, DatabaseField[] fieldsArray, ResultSet resultSet, ResultSetMetaData metaData, AbstractSession session) throws DatabaseException {
+    public AbstractRecord fetchRow(Vector<DatabaseField> fields, DatabaseField[] fieldsArray, ResultSet resultSet, ResultSetMetaData metaData, AbstractSession session) throws DatabaseException {
         int size = fieldsArray.length;
         Object[] values = new Object[size];
         // PERF: Pass platform and optimize data flag.
@@ -1168,17 +1168,17 @@
      * @return a Vector of DatabaseRows.
      */
     @Override
-    public Vector getColumnInfo(String catalog, String schema, String tableName, String columnName, AbstractSession session) throws DatabaseException {
+    public Vector<AbstractRecord> getColumnInfo(String catalog, String schema, String tableName, String columnName, AbstractSession session) throws DatabaseException {
         if (session.shouldLog(SessionLog.FINEST, SessionLog.QUERY)) {// Avoid printing if no logging required.
             Object[] args = { catalog, schema, tableName, columnName };
             session.log(SessionLog.FINEST, SessionLog.QUERY, "query_column_meta_data_with_column", args, this);
         }
-        Vector result = new Vector();
+        Vector<AbstractRecord> result = new Vector<>();
         ResultSet resultSet = null;
         try {
             incrementCallCount(session);
             resultSet = getConnectionMetaData().getColumns(catalog, schema, tableName, columnName);
-            Vector fields = buildSortedFields(null, resultSet, session);
+            Vector<DatabaseField> fields = buildSortedFields(null, resultSet, session);
             ResultSetMetaData metaData = resultSet.getMetaData();
 
             while (resultSet.next()) {
@@ -1346,7 +1346,7 @@
      */
     protected Object getObjectThroughOptimizedDataConversion(ResultSet resultSet, DatabaseField field, int type, int columnNumber, DatabasePlatform platform, AbstractSession session) throws SQLException {
         Object value = this;// Means no optimization, need to distinguish from null.
-        Class fieldType = field.type;
+        Class<?> fieldType = field.type;
 
         if (platform.shouldUseGetSetNString() && (type == Types.NVARCHAR || type == Types.NCHAR)) {
             value = resultSet.getNString(columnNumber);
@@ -1485,12 +1485,12 @@
      * @return a Vector of DatabaseRows.
      */
     @Override
-    public Vector getTableInfo(String catalog, String schema, String tableName, String[] types, AbstractSession session) throws DatabaseException {
+    public Vector<AbstractRecord> getTableInfo(String catalog, String schema, String tableName, String[] types, AbstractSession session) throws DatabaseException {
         if (session.shouldLog(SessionLog.FINEST, SessionLog.QUERY)) {// Avoid printing if no logging required.
             Object[] args = { catalog, schema, tableName };
             session.log(SessionLog.FINEST, SessionLog.QUERY, "query_column_meta_data", args, this);
         }
-        Vector result = new Vector();
+        Vector<AbstractRecord> result = new Vector<>();
         ResultSet resultSet = null;
         try {
             incrementCallCount(session);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabaseCall.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabaseCall.java
index 9a870ad..b6c8b39 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabaseCall.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabaseCall.java
@@ -105,7 +105,7 @@
     protected Boolean shouldCacheStatement;
 
     // The returned fields.
-    transient protected Vector fields;
+    transient protected Vector<DatabaseField> fields;
     // PERF: fields array
     transient protected DatabaseField[] fieldsArray;
 
@@ -384,7 +384,7 @@
      * The fields expected by the calls result set.
      * null means that the fields are unknown and should be built from the result set.
      */
-    public Vector getFields() {
+    public Vector<DatabaseField> getFields() {
         return fields;
     }
 
@@ -856,13 +856,13 @@
     /**
      * The fields expected by the calls result set.
      */
-    public void setFields(Vector fields) {
+    public void setFields(Vector<DatabaseField> fields) {
         this.fields = fields;
         if (fields != null) {
             int size = fields.size();
             this.fieldsArray = new DatabaseField[size];
             for (int index = 0; index < size; index++) {
-                this.fieldsArray[index] = (DatabaseField)fields.get(index);
+                this.fieldsArray[index] = fields.get(index);
             }
         } else {
             this.fieldsArray = null;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabasePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabasePlatform.java
index d40fdb4..4b28acd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabasePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatabasePlatform.java
@@ -223,7 +223,7 @@
      * They can be looked up by java Class or by Struct type
      */
     protected Map<String, StructConverter> structConverters = null;
-    protected Map<Class, StructConverter> typeConverters = null;
+    protected Map<Class<?>, StructConverter> typeConverters = null;
 
     /**
      * Some platforms allow a query's maxRows and FirstResult settings to be
@@ -368,7 +368,7 @@
      * This map indexes StructConverters by the Java Class they are meant to
      * convert
      */
-    public Map<Class, StructConverter> getTypeConverters() {
+    public Map<Class<?>, StructConverter> getTypeConverters() {
         if (typeConverters == null){
             typeConverters = new HashMap<>();
         }
@@ -547,7 +547,7 @@
                     appendByteArray((byte[])dbValue, writer);
                 }
             } else if (dbValue instanceof Collection) {
-                nBoundParameters = printValuelist((Collection)dbValue, databaseCall, writer);
+                nBoundParameters = printValuelist((Collection<?>)dbValue, databaseCall, writer);
             } else if (typeConverters != null && typeConverters.containsKey(dbValue.getClass())){
                 dbValue = new BindCallCustomParameter(dbValue);
                 // custom binding is required, object to be bound is wrapped (example NCHAR, NVARCHAR2, NCLOB on Oracle9)
@@ -1281,14 +1281,14 @@
                 return getJDBCType(ConversionManager.getObjectClass(field.getType()));
             }
         } else {
-            return getJDBCType((Class)null);
+            return getJDBCType((Class<?>)null);
         }
     }
 
     /**
      * Return the JDBC type for the Java type.
      */
-    public int getJDBCType(Class javaType) {
+    public int getJDBCType(Class<?> javaType) {
         if (javaType == null) {
             return Types.VARCHAR;// Best guess, sometimes we cannot determine type from mapping, this may fail on some drivers, other dont care what type it is.
         } else if (javaType == ClassConstants.STRING) {
@@ -1757,10 +1757,10 @@
         return nBoundParameters;
     }
 
-    public int printValuelist(Collection theObjects, DatabaseCall call, Writer writer) throws IOException {
+    public int printValuelist(Collection<?> theObjects, DatabaseCall call, Writer writer) throws IOException {
         int nBoundParameters = 0;
         writer.write("(");
-        Iterator iterator = theObjects.iterator();
+        Iterator<?> iterator = theObjects.iterator();
         while (iterator.hasNext()) {
             nBoundParameters = nBoundParameters + appendParameterInternal(call, writer, iterator.next());
             if (iterator.hasNext()) {
@@ -1938,7 +1938,7 @@
             ((TableSequence)getDefaultSequence()).setCounterFieldName(name);
         } else {
             if (!name.equals((new TableSequence()).getCounterFieldName())) {
-                ValidationException.wrongSequenceType(Helper.getShortClassName(getDefaultSequence()), "setCounterFieldName");
+                throw ValidationException.wrongSequenceType(Helper.getShortClassName(getDefaultSequence()), "setCounterFieldName");
             }
         }
     }
@@ -2575,7 +2575,7 @@
             statement.setBoolean(index, (Boolean) parameter);
         } else if (parameter == null) {
             // Normally null is passed as a DatabaseField so the type is included, but in some case may be passed directly.
-            statement.setNull(index, getJDBCType((Class)null));
+            statement.setNull(index, getJDBCType((Class<?>)null));
         } else if (parameter instanceof DatabaseField) {
             setNullFromDatabaseField((DatabaseField)parameter, statement, index);
         } else if (parameter instanceof byte[]) {
@@ -2680,7 +2680,7 @@
             statement.setBoolean(name, (Boolean) parameter);
         } else if (parameter == null) {
             // Normally null is passed as a DatabaseField so the type is included, but in some case may be passed directly.
-            statement.setNull(name, getJDBCType((Class)null));
+            statement.setNull(name, getJDBCType((Class<?>)null));
         } else if (parameter instanceof DatabaseField) {
             setNullFromDatabaseField((DatabaseField)parameter, statement, name);
         } else if (parameter instanceof byte[]) {
@@ -2984,7 +2984,7 @@
                 FieldDefinition fieldDef;
                 //gfbug3307, should use columnDefinition if it was defined.
                 if ((field.getColumnDefinition()!= null) && (field.getColumnDefinition().length() == 0)) {
-                    Class<? extends Class> type = ConversionManager.getObjectClass(field.getType());
+                    Class<?> type = ConversionManager.getObjectClass(field.getType());
                     // Default type to VARCHAR, if unknown.
                     if (type == null) {
                         type = ConversionManager.getObjectClass(ClassConstants.STRING);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourceAccessor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourceAccessor.java
index 4544778..b080b07 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourceAccessor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourceAccessor.java
@@ -92,7 +92,7 @@
     /** Keep track of whether the accessor is "connected". */
     protected boolean isConnected;
 
-    /** PERF: Cache platform to avoid gets (small but can add up). */
+    /* PERF: Cache platform to avoid gets (small but can add up). */
     /** This is also required to ensure all accessors for a session are using the same platform. */
     protected DatasourcePlatform platform;
 
@@ -643,8 +643,8 @@
      * database objects.
      */
     @Override
-    public Vector getColumnInfo(String catalog, String schema, String tableName, String columnName, AbstractSession session) throws DatabaseException {
-        return new Vector();
+    public Vector<AbstractRecord> getColumnInfo(String catalog, String schema, String tableName, String columnName, AbstractSession session) throws DatabaseException {
+        return new Vector<>();
     }
 
     /**
@@ -673,8 +673,8 @@
      * database objects.
      */
     @Override
-    public Vector getTableInfo(String catalog, String schema, String tableName, String[] types, AbstractSession session) throws DatabaseException {
-        return new Vector();
+    public Vector<AbstractRecord> getTableInfo(String catalog, String schema, String tableName, String[] types, AbstractSession session) throws DatabaseException {
+        return new Vector<>();
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
index e252a34..fbf23b9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
@@ -295,13 +295,13 @@
      * Return the operator for the operator constant defined in ExpressionOperator.
      */
     public ExpressionOperator getOperator(int selector) {
-        return (ExpressionOperator)getPlatformOperators().get(selector);
+        return getPlatformOperators().get(selector);
     }
 
     /**
      * Return any platform-specific operators
      */
-    public Map getPlatformOperators() {
+    public Map<Integer, ExpressionOperator> getPlatformOperators() {
         if (platformOperators == null) {
             synchronized (this) {
                 if (platformOperators == null) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DynamicSQLBatchWritingMechanism.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DynamicSQLBatchWritingMechanism.java
index 72f6e66..8cf7c91 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DynamicSQLBatchWritingMechanism.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DynamicSQLBatchWritingMechanism.java
@@ -41,7 +41,7 @@
      */
     protected List<String> sqlStrings;
 
-    /**
+    /*
      * Stores the statement indexes for statements that are using optimistic locking.  This allows us to check individual
      * statement results on supported platforms
      */
@@ -60,7 +60,7 @@
 
     public DynamicSQLBatchWritingMechanism(DatabaseAccessor databaseAccessor) {
         this.databaseAccessor = databaseAccessor;
-        this.sqlStrings = new ArrayList();
+        this.sqlStrings = new ArrayList<>();
         this.batchSize = 0;
         this.maxBatchSize = this.databaseAccessor.getLogin().getPlatform().getMaxBatchWritingSize();
         if (this.maxBatchSize == 0) {
@@ -90,9 +90,7 @@
             this.usesOptimisticLocking = dbCall.hasOptimisticLock;
             this.statementCount++;
             // Store the largest queryTimeout on a single call for later use by the single statement in prepareJDK12BatchStatement
-            if (dbCall != null) {
-                cacheQueryTimeout(session, dbCall);
-            }
+            cacheQueryTimeout(session, dbCall);
             // feature for bug 4104613, allows users to force statements to flush on execution
             if (((ModifyQuery) dbCall.getQuery()).forceBatchStatementExecution()) {
               executeBatchedStatements(session);
@@ -112,7 +110,7 @@
     public void clear() {
         //Bug#419326 : A clone may be holding a reference to this.parameters.
         //So, instead of clearing the parameters, just initialize with a new reference.
-        this.sqlStrings = new ArrayList();
+        this.sqlStrings = new ArrayList<>();
         this.statementCount = executionCount  = 0;
         this.usesOptimisticLocking = false;
         this.batchSize = 0;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/InParameterForCallableStatement.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/InParameterForCallableStatement.java
index b283e97..eb00225 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/InParameterForCallableStatement.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/InParameterForCallableStatement.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2019 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -42,7 +42,7 @@
         platform.setParameterValueInDatabaseCall(parameter, statement, parameterName, session);
     }
 
-    public Class getType(){
+    public Class<?> getType(){
         if ((inField != null) && (inField.getType() != null)) {
             return inField.getType();
         } else if (inParameter!=null) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/ParameterizedSQLBatchWritingMechanism.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/ParameterizedSQLBatchWritingMechanism.java
index ae144f1..1816465 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/ParameterizedSQLBatchWritingMechanism.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/ParameterizedSQLBatchWritingMechanism.java
@@ -56,7 +56,7 @@
 
     public ParameterizedSQLBatchWritingMechanism(DatabaseAccessor databaseAccessor) {
         this.databaseAccessor = databaseAccessor;
-        this.parameters = new ArrayList();
+        this.parameters = new ArrayList<>();
         this.maxBatchSize = this.databaseAccessor.getLogin().getPlatform().getMaxBatchWritingSize();
         if (this.maxBatchSize == 0) {
             // the max size was not set on the platform - use default
@@ -113,7 +113,7 @@
         this.previousCall = null;
         //Bug#419326 : A clone may be holding a reference to this.parameters.
         //So, instead of clearing the parameters, just initialize with a new reference.
-        this.parameters = new ArrayList();
+        this.parameters = new ArrayList<>();
         this.statementCount = 0;
         this.executionCount  = 0;
         this.queryTimeoutCache = DescriptorQueryManager.NoTimeout;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java
index 4e63728..429933b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/ObjectBuilder.java
@@ -101,6 +101,7 @@
 import org.eclipse.persistence.internal.sessions.TransformationMappingChangeRecord;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.logging.SessionLog;
 import org.eclipse.persistence.mappings.AggregateObjectMapping;
 import org.eclipse.persistence.mappings.ContainerMapping;
@@ -3346,7 +3347,7 @@
      * Replace the transient attributes of the remote value holders
      * with client-side objects.
      */
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         // PERF: Only process relationships.
         if (!this.isSimple) {
             List<DatabaseMapping> mappings = this.relationshipMappings;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicEntityImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicEntityImpl.java
index 0116b54..e1aa786 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicEntityImpl.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicEntityImpl.java
@@ -42,6 +42,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.queries.FetchGroup;
 import org.eclipse.persistence.queries.FetchGroupTracker;
@@ -402,8 +403,8 @@
          * @see org.eclipse.persistence.mappings.DatabaseMapping#fixObjectReferences(java.lang.Object, java.util.Map, java.util.Map, org.eclipse.persistence.queries.ObjectLevelReadQuery, org.eclipse.persistence.sessions.remote.RemoteSession)
          */
         @Override
-        public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects,
-                ObjectLevelReadQuery query, DistributedSession session) {
+        public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects,
+                                        ObjectLevelReadQuery query, DistributedSession session) {
         }
 
         /* (non-Javadoc)
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicPropertiesInitializatonPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicPropertiesInitializatonPolicy.java
index dc69f12..bacad70 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicPropertiesInitializatonPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicPropertiesInitializatonPolicy.java
@@ -28,6 +28,12 @@
 public class DynamicPropertiesInitializatonPolicy {
 
     /**
+     * Default constructor.
+     */
+    public DynamicPropertiesInitializatonPolicy() {
+    }
+
+    /**
      * After entity is created, initialize all required attributes.
      */
     public void initializeProperties(DynamicTypeImpl type, DynamicEntityImpl entity) {
@@ -76,7 +82,7 @@
             ForeignReferenceMapping refMapping = (ForeignReferenceMapping)mapping;
             if (refMapping.usesIndirection() &&
                 refMapping.getIndirectionPolicy() instanceof BasicIndirectionPolicy) {
-                value = new ValueHolder(value);
+                value = new ValueHolder<>(value);
             }
             else if (refMapping.isCollectionMapping()) {
                 value = refMapping.getContainerPolicy().containerInstance();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/SQLSelectStatement.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/SQLSelectStatement.java
index 53064a8..9ed09d2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/SQLSelectStatement.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/SQLSelectStatement.java
@@ -148,7 +148,7 @@
 
     public SQLSelectStatement() {
         this.fields = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(2);
-        this.tables = new ArrayList(4);
+        this.tables = new ArrayList<>(4);
         this.requiresAliases = false;
         this.useUniqueFieldAliases=false;
         this.isAggregateSelect = false;
@@ -419,7 +419,7 @@
                         DatabaseTable relationAlias = holder.outerJoinedMappingCriteria.aliasForTable(relationTable);
                         DatabaseTable mapKeyAlias = null;
                         DatabaseTable mapKeyTable = null;
-                        List<DatabaseTable> tablesInOrder = new ArrayList();
+                        List<DatabaseTable> tablesInOrder = new ArrayList<>();
                         // glassfish issue 2440: store aliases instead of tables
                         // in the tablesInOrder. This allows to distinguish source
                         // and target table in case of an self referencing relationship.
@@ -554,7 +554,7 @@
 
         // Print outer joins
         boolean firstTable = true;
-        List<DatabaseTable> outerJoinedAliases = new ArrayList(4); // Must keep track of tables used for outer join so no normal join is given
+        List<DatabaseTable> outerJoinedAliases = new ArrayList<>(4); // Must keep track of tables used for outer join so no normal join is given
 
         // prepare to lock tables if required
         boolean shouldPrintUpdateClause = printer.getPlatform().shouldPrintForUpdateClause()
@@ -626,7 +626,7 @@
 
         printer.getWriter().write(" GROUP BY ");
 
-        Vector newFields = new Vector();
+        Vector<DatabaseField> newFields = new Vector<>();
         // to avoid printing a comma before the first field
         printer.setIsFirstElementPrinted(false);
         for (Expression expression : getGroupByExpressions()) {
@@ -976,7 +976,7 @@
      * no ambiguity
      */
     public void computeTablesFromTables() {
-        Map<DatabaseTable, DatabaseTable> allTables = new Hashtable();
+        Map<DatabaseTable, DatabaseTable> allTables = new Hashtable<>();
         AsOfClause asOfClause = null;
 
         if (getBuilder().hasAsOfClause() && !getBuilder().getSession().getProject().hasGenericHistorySupport()) {
@@ -1159,7 +1159,7 @@
      */
     public List<Expression> getOrderByExpressions() {
         if (orderByExpressions == null) {
-            orderByExpressions = new ArrayList(4);
+            orderByExpressions = new ArrayList<>(4);
         }
 
         return orderByExpressions;
@@ -1167,7 +1167,7 @@
 
     public List<Expression> getUnionExpressions() {
         if (unionExpressions == null) {
-            unionExpressions = new ArrayList(4);
+            unionExpressions = new ArrayList<>(4);
         }
         return unionExpressions;
     }
@@ -1182,7 +1182,7 @@
      */
     public List<OuterJoinExpressionHolder> getOuterJoinExpressionsHolders() {
         if (outerJoinExpressionHolders == null) {
-            outerJoinExpressionHolders = new ArrayList(4);
+            outerJoinExpressionHolders = new ArrayList<>(4);
         }
 
         return outerJoinExpressionHolders;
@@ -1237,10 +1237,10 @@
                             table = getTableAliases().get(alias);
                         }
                         if (this.additionalTargetAliases == null) {
-                            this.additionalTargetAliases = new ArrayList();
-                            this.additionalTargetTables = new ArrayList();
-                            this.additionalJoinOnExpression = new ArrayList();
-                            this.additionalTargetIsDescriptorTable = new ArrayList();
+                            this.additionalTargetAliases = new ArrayList<>();
+                            this.additionalTargetTables = new ArrayList<>();
+                            this.additionalJoinOnExpression = new ArrayList<>();
+                            this.additionalTargetIsDescriptorTable = new ArrayList<>();
                         }
                         this.additionalTargetAliases.add(alias);
                         this.additionalTargetTables.add(table);
@@ -1654,7 +1654,7 @@
      * Order by the objects primary key or all fields for aggregates.
      */
     protected void normalizeOrderBy(Expression builder, List<Expression> allExpressions, Map<Expression, Expression> clonedExpressions, AbstractSession session) {
-        List<Expression> newOrderBys = new ArrayList(this.orderByExpressions.size());
+        List<Expression> newOrderBys = new ArrayList<>(this.orderByExpressions.size());
         for (Expression orderBy : this.orderByExpressions) {
             orderBy = rebuildExpression(orderBy, builder, clonedExpressions);
             Expression base = orderBy;
@@ -1686,7 +1686,7 @@
                     // Check if a non basic mapping.
                     orderBys = expression.getMapping().getOrderByNormalizedExpressions(expression);
                 } else if (base.isExpressionBuilder()) {
-                    orderBys = new ArrayList(expression.getDescriptor().getPrimaryKeyFields().size());
+                    orderBys = new ArrayList<>(expression.getDescriptor().getPrimaryKeyFields().size());
                     for (DatabaseField field : expression.getDescriptor().getPrimaryKeyFields()) {
                         orderBys.add(expression.getField(field));
                     }
@@ -1722,9 +1722,9 @@
     /**
      * Print the SQL representation of the statement on a stream.
      */
-    public Vector printSQL(ExpressionSQLPrinter printer) {
+    public Vector<DatabaseField> printSQL(ExpressionSQLPrinter printer) {
         try {
-            Vector selectFields = null;
+            Vector<DatabaseField> selectFields = null;
             printer.setRequiresDistinct(shouldDistinctBeUsed());
 
             if (hasUnionExpressions()) {
@@ -2133,17 +2133,17 @@
     /**
      * INTERNAL:
      */
-    protected void writeFieldsFromExpression(ExpressionSQLPrinter printer, Expression expression, Vector newFields) {
+    protected void writeFieldsFromExpression(ExpressionSQLPrinter printer, Expression expression, Vector<DatabaseField> newFields) {
         expression.writeFields(printer, newFields, this);
     }
 
     /**
      * INTERNAL:
      */
-    protected Vector writeFieldsIn(ExpressionSQLPrinter printer) {
+    protected Vector<DatabaseField> writeFieldsIn(ExpressionSQLPrinter printer) {
         this.lastTable = null;
 
-        Vector newFields = NonSynchronizedVector.newInstance();
+        Vector<DatabaseField> newFields = NonSynchronizedVector.newInstance();
 
         for (Object next : getFields()) {
             // Fields can be null placeholders for fetch groups.
@@ -2152,7 +2152,7 @@
                     writeFieldsFromExpression(printer, (Expression)next, newFields);
                 } else {
                     writeField(printer, (DatabaseField)next);
-                    newFields.add(next);
+                    newFields.add((DatabaseField) next);
                 }
             }
         }
@@ -2306,9 +2306,9 @@
      *
      */
     protected void sortOuterJoinExpressionHolders(List<OuterJoinExpressionHolder> holders) {
-        Map<DatabaseTable, OuterJoinExpressionHolder> targetAliasToHolders = new HashMap();
-        Set<DatabaseTable> aliases = new HashSet();
-        Map<DatabaseTable, Integer> aliasToIndexes = new HashMap(aliases.size());
+        Map<DatabaseTable, OuterJoinExpressionHolder> targetAliasToHolders = new HashMap<>();
+        Set<DatabaseTable> aliases = new HashSet<>();
+        Map<DatabaseTable, Integer> aliasToIndexes = new HashMap<>(aliases.size());
         int i = 0;
         for(OuterJoinExpressionHolder holder : holders) {
             targetAliasToHolders.put(holder.targetAlias, holder);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DatabaseField.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DatabaseField.java
index dbf0b92..a02ddc5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DatabaseField.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DatabaseField.java
@@ -71,7 +71,7 @@
      * Respective Java type desired for the field's value, used to optimize performance and for binding.
      * PERF: Allow direct variable access from getObject.
      */
-    public transient Class type;
+    public transient Class<?> type;
     public String typeName; // shadow variable - string name of above Class type variable
 
     /**
@@ -91,7 +91,7 @@
 
     /**
      * If this is set, it will be used in determining equality (unless delimiters are used) and the hashcode.
-     * @see getNameForComparisons
+     * @see #getNameForComparisons()
      */
     protected String nameForComparisons;
 
@@ -369,7 +369,7 @@
     }
 
     @Override
-    public Class getType() {
+    public Class<?> getType() {
         if ((this.type == null) && (this.typeName != null)) {
             convertClassNamesToClasses(getClass().getClassLoader());
         }
@@ -626,7 +626,7 @@
      * this is used to optimize performance, and for binding.
      */
     @Override
-    public void setType(Class type) {
+    public void setType(Class<?> type) {
         this.type = type;
         if (this.type != null && typeName == null) {
             typeName = this.type.getName();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BackupValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BackupValueHolder.java
index 811eb1a..f4b6d34 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BackupValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BackupValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -26,33 +26,33 @@
  * @since 10.1.3
  * @author James Sutherland
  */
-public class BackupValueHolder extends DatabaseValueHolder {
+public class BackupValueHolder<T> extends DatabaseValueHolder<T> {
 
     /** Stores the original uow clone's value holder. */
-    protected ValueHolderInterface<?> unitOfWorkValueHolder;
+    protected ValueHolderInterface<T> unitOfWorkValueHolder;
 
-    public BackupValueHolder(ValueHolderInterface<?> unitOfWorkValueHolder) {
+    public BackupValueHolder(ValueHolderInterface<T> unitOfWorkValueHolder) {
         this.unitOfWorkValueHolder = unitOfWorkValueHolder;
     }
 
     @Override
     public boolean isPessimisticLockingValueHolder() {
-        return ((DatabaseValueHolder)this.unitOfWorkValueHolder).isPessimisticLockingValueHolder();
+        return ((DatabaseValueHolder<T>)this.unitOfWorkValueHolder).isPessimisticLockingValueHolder();
     }
 
     @Override
-    public Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder) {
-        return ((DatabaseValueHolder)this.unitOfWorkValueHolder).instantiateForUnitOfWorkValueHolder(unitOfWorkValueHolder);
+    public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder) {
+        return ((DatabaseValueHolder<T>)this.unitOfWorkValueHolder).instantiateForUnitOfWorkValueHolder(unitOfWorkValueHolder);
     }
 
     @Override
     public AbstractRecord getRow() {
-        return ((DatabaseValueHolder)this.unitOfWorkValueHolder).getRow();
+        return ((DatabaseValueHolder<T>)this.unitOfWorkValueHolder).getRow();
     }
 
     @Override
     public AbstractSession getSession() {
-        return ((DatabaseValueHolder)this.unitOfWorkValueHolder).getSession();
+        return ((DatabaseValueHolder<T>)this.unitOfWorkValueHolder).getSession();
     }
 
     /**
@@ -60,7 +60,7 @@
      * then first instantiate it to obtain the backup value.
      */
     @Override
-    public Object instantiate() {
+    public T instantiate() {
         // Ensures instantiation of the original, and setting of this back value holder's value.
         return this.unitOfWorkValueHolder.getValue();
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BasicIndirectionPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BasicIndirectionPolicy.java
index adeacde..658757b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BasicIndirectionPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BasicIndirectionPolicy.java
@@ -28,6 +28,7 @@
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.internal.sessions.remote.RemoteSessionController;
 import org.eclipse.persistence.internal.sessions.remote.RemoteUnitOfWork;
 import org.eclipse.persistence.internal.sessions.remote.RemoteValueHolder;
@@ -65,7 +66,8 @@
     public Object backupCloneAttribute(Object attributeValue, Object clone, Object backup, UnitOfWorkImpl unitOfWork) {
         //no need to check if the attribute is a valueholder because closeAttribute
         // should always be called first
-        ValueHolderInterface<?> valueHolder = (ValueHolderInterface)attributeValue;// cast the value
+        @SuppressWarnings({"unchecked"})
+        ValueHolderInterface<Object> valueHolder = (ValueHolderInterface<Object>)attributeValue;// cast the value
         ValueHolderInterface<Object> result = null;
         // delay instantiation until absolutely necessary
         if ((!(valueHolder instanceof UnitOfWorkValueHolder)) || valueHolder.isInstantiated()) {
@@ -74,8 +76,8 @@
         } else {
             // Backup value holder will be instantiated when uow vh is, to get original value,
             // backup must also know about the uow vh, in case it needs to get its value.
-            result = new BackupValueHolder(valueHolder);
-            ((UnitOfWorkValueHolder)valueHolder).setBackupValueHolder(result);
+            result = new BackupValueHolder<>(valueHolder);
+            ((UnitOfWorkValueHolder<Object>)valueHolder).setBackupValueHolder(result);
         }
 
         return result;
@@ -102,7 +104,8 @@
      */
     @Override
     public Object cloneAttribute(Object attributeValue, Object original, CacheKey cacheKey, Object clone, Integer refreshCascade, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
-        ValueHolderInterface<?> valueHolder = (ValueHolderInterface<?>) attributeValue;
+        @SuppressWarnings({"unchecked"})
+        ValueHolderInterface<Object> valueHolder = (ValueHolderInterface<Object>) attributeValue;
         ValueHolderInterface<Object> result;
 
         if (!buildDirectlyFromRow && cloningSession.isUnitOfWork() && ((UnitOfWorkImpl)cloningSession).isOriginalNewObject(original)) {
@@ -110,8 +113,8 @@
             // This can occur if an existing serialized object is attempt to be registered as new.
             if ((valueHolder instanceof DatabaseValueHolder)
                     && (! valueHolder.isInstantiated())
-                    && (((DatabaseValueHolder) valueHolder).getSession() == null)
-                    && (! ((DatabaseValueHolder) valueHolder).isSerializedRemoteUnitOfWorkValueHolder())) {
+                    && (((DatabaseValueHolder<?>) valueHolder).getSession() == null)
+                    && (! ((DatabaseValueHolder<?>) valueHolder).isSerializedRemoteUnitOfWorkValueHolder())) {
                 throw DescriptorException.attemptToRegisterDeadIndirection(original, this.mapping);
             }
             if (this.mapping.getRelationshipPartner() == null) {
@@ -122,18 +125,18 @@
                 // because of this call the entire tree should be recursively cloned
                 AbstractRecord row = null;
                 if (valueHolder instanceof DatabaseValueHolder) {
-                    row = ((DatabaseValueHolder)valueHolder).getRow();
+                    row = ((DatabaseValueHolder<?>)valueHolder).getRow();
                 }
                 result = this.mapping.createCloneValueHolder(valueHolder, original, clone, row, cloningSession, buildDirectlyFromRow);
 
                 Object newObject = this.mapping.buildCloneForPartObject(valueHolder.getValue(), original, cacheKey, clone, cloningSession, refreshCascade, false, false);
-                ((UnitOfWorkValueHolder)result).privilegedSetValue(newObject);
-                ((UnitOfWorkValueHolder)result).setInstantiated();
+                ((UnitOfWorkValueHolder<Object>)result).privilegedSetValue(newObject);
+                ((UnitOfWorkValueHolder<?>)result).setInstantiated();
             }
         } else {
             AbstractRecord row = null;
             if (valueHolder instanceof DatabaseValueHolder) {
-                row = ((DatabaseValueHolder)valueHolder).getRow();
+                row = ((DatabaseValueHolder<?>)valueHolder).getRow();
             }
             result = this.mapping.createCloneValueHolder(valueHolder, original, clone, row, cloningSession, buildDirectlyFromRow);
         }
@@ -149,7 +152,7 @@
     @Override
     public Object extractPrimaryKeyForReferenceObject(Object referenceObject, AbstractSession session) {
         if (objectIsEasilyInstantiated(referenceObject)) {
-            return super.extractPrimaryKeyForReferenceObject(((ValueHolderInterface)referenceObject).getValue(), session);
+            return super.extractPrimaryKeyForReferenceObject(((ValueHolderInterface<?>)referenceObject).getValue(), session);
         } else {
             return getOneToOneMapping().extractPrimaryKeysForReferenceObjectFromRow(extractReferenceRow(referenceObject));
         }
@@ -167,7 +170,7 @@
         if (this.objectIsInstantiated(referenceObject)) {
             return null;
         } else {
-            return ((DatabaseValueHolder)referenceObject).getRow();
+            return ((DatabaseValueHolder<?>)referenceObject).getRow();
         }
     }
 
@@ -178,11 +181,11 @@
      * with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         Object attributeValue = this.mapping.getAttributeValueFromObject(object);
         //bug 4147755 if it is not a Remote Valueholder then treat as if there was no VH...
         if (attributeValue instanceof RemoteValueHolder){
-            RemoteValueHolder rvh = (RemoteValueHolder)this.mapping.getAttributeValueFromObject(object);
+            RemoteValueHolder<?> rvh = (RemoteValueHolder<?>)this.mapping.getAttributeValueFromObject(object);
             rvh.setSession(session);
             rvh.setMapping(this.mapping);
 
@@ -215,7 +218,7 @@
      */
     @Override
     public Object getOriginalIndirectionObjectForMerge(Object unitOfWorkIndirectionObject, AbstractSession session) {
-        DatabaseValueHolder holder = (DatabaseValueHolder)getOriginalIndirectionObject(unitOfWorkIndirectionObject, session);
+        DatabaseValueHolder<?> holder = (DatabaseValueHolder<?>)getOriginalIndirectionObject(unitOfWorkIndirectionObject, session);
         if (holder != null && holder.getSession()!= null){
             holder.setSession(session);
         }
@@ -230,14 +233,14 @@
     @Override
     public Object getOriginalValueHolder(Object unitOfWorkIndirectionObject, AbstractSession session) {
         if ((unitOfWorkIndirectionObject instanceof UnitOfWorkValueHolder)
-                && (((UnitOfWorkValueHolder)unitOfWorkIndirectionObject).getRemoteUnitOfWork() != null)) {
-            ValueHolderInterface<?> valueHolder = ((UnitOfWorkValueHolder) unitOfWorkIndirectionObject).getWrappedValueHolder();
+                && (((UnitOfWorkValueHolder<?>)unitOfWorkIndirectionObject).getRemoteUnitOfWork() != null)) {
+            ValueHolderInterface<?> valueHolder = ((UnitOfWorkValueHolder<?>) unitOfWorkIndirectionObject).getWrappedValueHolder();
             if (valueHolder == null) {
                 // For remote session the original value holder is transient,
                 // so the value must be found in the registry or created.
-                RemoteUnitOfWork remoteUnitOfWork = (RemoteUnitOfWork)((UnitOfWorkValueHolder)unitOfWorkIndirectionObject).getRemoteUnitOfWork();
+                RemoteUnitOfWork remoteUnitOfWork = (RemoteUnitOfWork)((UnitOfWorkValueHolder<?>)unitOfWorkIndirectionObject).getRemoteUnitOfWork();
                 RemoteSessionController controller = remoteUnitOfWork.getParentSessionController();
-                ObjID id = ((UnitOfWorkValueHolder) unitOfWorkIndirectionObject).getWrappedValueHolderRemoteID();
+                ObjID id = ((UnitOfWorkValueHolder<?>) unitOfWorkIndirectionObject).getWrappedValueHolderRemoteID();
                 if (id != null) {
                     // This value holder may be on the server, or the client,
                     // on the server, the controller should exists, so can lock up in it,
@@ -245,30 +248,30 @@
                     if (controller != null) {
                         valueHolder = controller.getRemoteValueHolders().get(id);
                     } else if (session.isRemoteSession()) {
-                        valueHolder = new RemoteValueHolder(id);
-                        ((RemoteValueHolder)valueHolder).setSession(session);
+                        valueHolder = new RemoteValueHolder<>(id);
+                        ((RemoteValueHolder<?>)valueHolder).setSession(session);
                     }
                 }
                 if (valueHolder == null) {
                     // Must build a new value holder.
-                    Object object = ((UnitOfWorkValueHolder) unitOfWorkIndirectionObject).getSourceObject();
+                    Object object = ((UnitOfWorkValueHolder<?>) unitOfWorkIndirectionObject).getSourceObject();
                     AbstractRecord row = this.mapping.getDescriptor().getObjectBuilder().buildRow(object, session, WriteType.UNDEFINED);
                     ReadObjectQuery query = new ReadObjectQuery();
                     query.setSession(session);
-                    valueHolder = (ValueHolderInterface) this.mapping.valueFromRow(row, null, query, true);
+                    valueHolder = (ValueHolderInterface<?>) this.mapping.valueFromRow(row, null, query, true);
                 }
                 return valueHolder;
             }
         }
         if (unitOfWorkIndirectionObject instanceof WrappingValueHolder) {
-            ValueHolderInterface<?> valueHolder =  ((WrappingValueHolder)unitOfWorkIndirectionObject).getWrappedValueHolder();
+            ValueHolderInterface<?> valueHolder =  ((WrappingValueHolder<?>)unitOfWorkIndirectionObject).getWrappedValueHolder();
             if (!session.isProtectedSession()){
-                while (valueHolder instanceof WrappingValueHolder && ((WrappingValueHolder)valueHolder).getWrappedValueHolder() != null){
-                    valueHolder = ((WrappingValueHolder)valueHolder).getWrappedValueHolder();
+                while (valueHolder instanceof WrappingValueHolder && ((WrappingValueHolder<?>)valueHolder).getWrappedValueHolder() != null){
+                    valueHolder = ((WrappingValueHolder<?>)valueHolder).getWrappedValueHolder();
                 }
             }
-            if ((valueHolder != null) && (valueHolder instanceof DatabaseValueHolder)) {
-                ((DatabaseValueHolder) valueHolder).releaseWrappedValueHolder(session);
+            if (valueHolder instanceof DatabaseValueHolder) {
+                ((DatabaseValueHolder<?>) valueHolder).releaseWrappedValueHolder(session);
             }
             return valueHolder;
         } else {
@@ -281,7 +284,7 @@
      */
     @Override
     public void reset(Object target) {
-        this.mapping.setAttributeValueInObject(target, new ValueHolder());
+        this.mapping.setAttributeValueInObject(target, new ValueHolder<>());
     }
 
     /**
@@ -292,7 +295,7 @@
     @Override
     public Object getRealAttributeValueFromObject(Object object, Object attribute) {
         if (attribute instanceof ValueHolderInterface) {
-            return ((ValueHolderInterface)attribute).getValue();
+            return ((ValueHolderInterface<?>)attribute).getValue();
         } else {
             return attribute;
         }
@@ -304,7 +307,7 @@
      * specified remote value holder.
      */
     @Override
-    public Object getValueFromRemoteValueHolder(RemoteValueHolder remoteValueHolder) {
+    public Object getValueFromRemoteValueHolder(RemoteValueHolder<?> remoteValueHolder) {
         return remoteValueHolder.getValue();
     }
 
@@ -313,13 +316,13 @@
      * The method validateAttributeOfInstantiatedObject(Object attributeValue) fixes the value of the attributeValue
      * in cases where it is null and indirection requires that it contain some specific data structure.  Return whether this will happen.
      * This method is used to help determine if indirection has been triggered
-     * @see validateAttributeOfInstantiatedObject(Object attributeValue)
+     * @see #validateAttributeOfInstantiatedObject(Object attributeValue)
      */
     @Override
     public boolean isAttributeValueFullyBuilt(Object attributeValue){
         //Bug#413833 : If attributeValue is an instance of ValueHolder,
         //it has not been built into the clone previously
-        return attributeValue != null && !(attributeValue instanceof ValueHolder && ((ValueHolder)attributeValue).isNewlyWeavedValueHolder());
+        return attributeValue != null && !(attributeValue instanceof ValueHolder && ((ValueHolder<?>)attributeValue).isNewlyWeavedValueHolder());
     }
 
     /**
@@ -328,7 +331,7 @@
      */
     @Override
     public void iterateOnAttributeValue(DescriptorIterator iterator, Object attributeValue) {
-        iterator.iterateValueHolderForMapping((ValueHolderInterface)attributeValue, this.mapping);
+        iterator.iterateValueHolderForMapping((ValueHolderInterface<?>)attributeValue, this.mapping);
     }
 
     /**
@@ -339,7 +342,7 @@
     @Override
     public void mergeRemoteValueHolder(Object clientSideDomainObject, Object serverSideDomainObject, MergeManager mergeManager) {
         // This will always be a remote value holder coming from the server,
-        RemoteValueHolder serverValueHolder = (RemoteValueHolder)this.mapping.getAttributeValueFromObject(serverSideDomainObject);
+        RemoteValueHolder<?> serverValueHolder = (RemoteValueHolder<?>)this.mapping.getAttributeValueFromObject(serverSideDomainObject);
         mergeClientIntoServerValueHolder(serverValueHolder, mergeManager);
 
         this.mapping.setAttributeValueInObject(clientSideDomainObject, serverValueHolder);
@@ -354,7 +357,7 @@
      */
     @Override
     public Object nullValueFromRow() {
-        return new ValueHolder();
+        return new ValueHolder<>();
     }
 
     /**
@@ -363,7 +366,7 @@
      */
     @Override
     public boolean objectIsInstantiated(Object object) {
-        return ((ValueHolderInterface)object).isInstantiated();
+        return ((ValueHolderInterface<?>)object).isInstantiated();
     }
 
     /**
@@ -373,7 +376,7 @@
     @Override
     public boolean objectIsEasilyInstantiated(Object object) {
         if (object instanceof DatabaseValueHolder) {
-            return ((DatabaseValueHolder)object).isEasilyInstantiated();
+            return ((DatabaseValueHolder<?>)object).isEasilyInstantiated();
         } else {
             return true;
         }
@@ -385,6 +388,7 @@
      * In this case, place the value inside the target's ValueHolder.
      */
     @Override
+    @SuppressWarnings({"unchecked"})
     public void setRealAttributeValueInObject(Object target, Object attributeValue) {
         ValueHolderInterface<Object> holder = (ValueHolderInterface<Object>)this.mapping.getAttributeValueFromObject(target);
         if (holder == null) {
@@ -401,9 +405,10 @@
      * Used only by transparent indirection.
      */
     @Override
+    @SuppressWarnings({"unchecked"})
     public void setSourceObject(Object sourceObject, Object attributeValue) {
         if (attributeValue instanceof QueryBasedValueHolder) {
-            ((QueryBasedValueHolder)attributeValue).setSourceObject(sourceObject);
+            ((QueryBasedValueHolder<Object>)attributeValue).setSourceObject(sourceObject);
         }
     }
 
@@ -412,7 +417,7 @@
      *    Return whether the type is appropriate for the indirection policy.
      * In this case, the attribute type MUST be ValueHolderInterface.
      */
-    protected boolean typeIsValid(Class attributeType) {
+    protected boolean typeIsValid(Class<?> attributeType) {
         return attributeType == ClassConstants.ValueHolderInterface_Class ||
             attributeType == ClassConstants.WeavedAttributeValueHolderInterface_Class;
     }
@@ -431,7 +436,7 @@
         // this allows for indirection attributes to not be instantiated in the constructor as they
         // are typically replaced when reading or cloning so is very inefficient to initialize.
         if (attributeValue == null) {
-            return new ValueHolder();
+            return new ValueHolder<>();
         }
         if (!(attributeValue instanceof ValueHolderInterface)) {
             throw DescriptorException.valueHolderInstantiationMismatch(attributeValue, this.mapping);
@@ -447,7 +452,7 @@
      * In this case, the attribute type MUST be ValueHolderInterface.
      */
     @Override
-    public void validateDeclaredAttributeType(Class attributeType, IntegrityChecker checker) throws DescriptorException {
+    public void validateDeclaredAttributeType(Class<?> attributeType, IntegrityChecker checker) throws DescriptorException {
         super.validateDeclaredAttributeType(attributeType, checker);
         if (!this.typeIsValid(attributeType)) {
             checker.handleError(DescriptorException.attributeAndMappingWithIndirectionMismatch(this.mapping));
@@ -462,7 +467,7 @@
      * In this case, the return type MUST be ValueHolderInterface.
      */
     @Override
-    public void validateGetMethodReturnType(Class returnType, IntegrityChecker checker) throws DescriptorException {
+    public void validateGetMethodReturnType(Class<?> returnType, IntegrityChecker checker) throws DescriptorException {
         super.validateGetMethodReturnType(returnType, checker);
         if (!this.typeIsValid(returnType)) {
             checker.handleError(DescriptorException.returnAndMappingWithIndirectionMismatch(this.mapping));
@@ -477,7 +482,7 @@
      * In this case, the parameter type MUST be ValueHolderInterface.
      */
     @Override
-    public void validateSetMethodParameterType(Class parameterType, IntegrityChecker checker) throws DescriptorException {
+    public void validateSetMethodParameterType(Class<?> parameterType, IntegrityChecker checker) throws DescriptorException {
         super.validateSetMethodParameterType(parameterType, checker);
         if (!this.typeIsValid(parameterType)) {
             checker.handleError(DescriptorException.parameterAndMappingWithIndirectionMismatch(this.mapping));
@@ -492,7 +497,7 @@
      */
     @Override
     public Object valueFromBatchQuery(ReadQuery batchQuery, AbstractRecord row, ObjectLevelReadQuery originalQuery, CacheKey parentCacheKey) {
-        return new BatchValueHolder(batchQuery, row, this.getForeignReferenceMapping(), originalQuery, parentCacheKey);
+        return new BatchValueHolder<>(batchQuery, row, this.getForeignReferenceMapping(), originalQuery, parentCacheKey);
     }
 
     /**
@@ -504,7 +509,7 @@
      */
     @Override
     public Object valueFromMethod(Object object, AbstractRecord row, AbstractSession session) {
-        return new TransformerBasedValueHolder(this.getTransformationMapping().getAttributeTransformer(), object, row, session);
+        return new TransformerBasedValueHolder<>(this.getTransformationMapping().getAttributeTransformer(), object, row, session);
     }
 
     /**
@@ -515,7 +520,7 @@
      */
     @Override
     public Object valueFromQuery(ReadQuery query, AbstractRecord row, Object sourceObject, AbstractSession session) {
-        return new QueryBasedValueHolder(query, sourceObject, row, session);
+        return new QueryBasedValueHolder<>(query, sourceObject, row, session);
     }
 
     /**
@@ -526,7 +531,7 @@
      */
     @Override
     public Object valueFromQuery(ReadQuery query, AbstractRecord row, AbstractSession session) {
-        return new QueryBasedValueHolder(query, row, session);
+        return new QueryBasedValueHolder<>(query, row, session);
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BatchValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BatchValueHolder.java
index b87623b..6d723d3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BatchValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/BatchValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -29,7 +29,7 @@
  * The query is also shared by all other value holders within the batch and it must be ensured that the query is only
  * executed once.  Concurrency must also be maintained across all of the value holders in the batch.
  */
-public class BatchValueHolder extends QueryBasedValueHolder {
+public class BatchValueHolder<T> extends QueryBasedValueHolder<T> {
     protected transient ForeignReferenceMapping mapping;
     protected transient ObjectLevelReadQuery originalQuery;
     protected transient CacheKey parentCacheKey;
@@ -57,8 +57,9 @@
      * since they all share the same query, the extractResultFromBatchQuery method must be synchronized.
      */
     @Override
-    protected Object instantiate(AbstractSession session) throws EclipseLinkException {
-        return this.mapping.extractResultFromBatchQuery(this.query, this.parentCacheKey, this.row, session, this.originalQuery);
+    @SuppressWarnings({"unchecked"})
+    protected T instantiate(AbstractSession session) throws EclipseLinkException {
+        return (T) this.mapping.extractResultFromBatchQuery(this.query, this.parentCacheKey, this.row, session, this.originalQuery);
     }
 
     /**
@@ -75,14 +76,15 @@
      * as the batch is local to the unit of work.
      */
     @Override
-    public Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder) {
+    @SuppressWarnings({"unchecked"})
+    public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder) {
         UnitOfWorkImpl unitOfWork = unitOfWorkValueHolder.getUnitOfWork();
         ReadQuery localQuery = unitOfWork.getBatchQueries().get(this.query);
         if (localQuery == null) {
             localQuery = (ReadQuery)this.query.clone();
             unitOfWork.getBatchQueries().put(this.query, localQuery);
         }
-        return this.mapping.extractResultFromBatchQuery(localQuery, this.parentCacheKey, this.row, unitOfWorkValueHolder.getUnitOfWork(), this.originalQuery);
+        return (T) this.mapping.extractResultFromBatchQuery(localQuery, this.parentCacheKey, this.row, unitOfWorkValueHolder.getUnitOfWork(), this.originalQuery);
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/CacheBasedValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/CacheBasedValueHolder.java
index 760d106..afe4c91 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/CacheBasedValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/CacheBasedValueHolder.java
@@ -36,7 +36,7 @@
  * @author gyorke
  * @since EclipseLink 1.1
  */
-public class CacheBasedValueHolder extends DatabaseValueHolder {
+public class CacheBasedValueHolder<T> extends DatabaseValueHolder<T> {
 
     protected transient ForeignReferenceMapping mapping;
     protected Object[] references;
@@ -61,7 +61,8 @@
      * If null is returned then the calling UOW will instantiate as normal.
      */
     @Override
-    public Object getValue(UnitOfWorkImpl uow) {
+    @SuppressWarnings({"unchecked"})
+    public T getValue(UnitOfWorkImpl uow) {
         if (this.references != null && this.references.length != 0){
             if (mapping.isCollectionMapping()){
                 Collection<Object> result = uow.getIdentityMapAccessorInstance().getAllFromIdentityMapWithEntityPK(this.references, this.mapping.getReferenceDescriptor()).values();
@@ -71,25 +72,26 @@
                     for (Object object : result){
                         cp.addInto(object, container, uow);
                     }
-                    return container;
+                    return (T) container;
                 }
             }else{
-                return uow.getIdentityMapAccessorInstance().getFromIdentityMap(this.references[0], this.mapping.getReferenceClass());
+                return (T) uow.getIdentityMapAccessorInstance().getFromIdentityMap(this.references[0], this.mapping.getReferenceClass());
             }
         }
         return null;
     }
 
     @Override
-    protected Object instantiate() throws DatabaseException {
+    protected T instantiate() throws DatabaseException {
         return instantiate(this.session);
     }
 
-    protected Object instantiate(AbstractSession localSession) throws DatabaseException {
+    @SuppressWarnings({"unchecked"})
+    protected T instantiate(AbstractSession localSession) throws DatabaseException {
         if (session == null){
             throw ValidationException.instantiatingValueholderWithNullSession();
         }
-        return mapping.valueFromPKList(references, row, localSession);
+        return (T) mapping.valueFromPKList(references, row, localSession);
     }
 
     /**
@@ -104,7 +106,7 @@
      * Note: This method is not thread-safe.  It must be used in a synchronized manner
      */
     @Override
-    public Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder) {
+    public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder) {
         return instantiate(unitOfWorkValueHolder.getUnitOfWork());
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ContainerIndirectionPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ContainerIndirectionPolicy.java
index 9832c0a..6a31b46 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ContainerIndirectionPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ContainerIndirectionPolicy.java
@@ -67,26 +67,26 @@
     public Object backupCloneAttribute(Object attributeValue, Object clone, Object backup, UnitOfWorkImpl unitOfWork) {
         IndirectContainer container = (IndirectContainer)attributeValue;
         ValueHolderInterface valueHolder = container.getValueHolder();
-        ValueHolderInterface newValueHolder = (ValueHolderInterface)super.backupCloneAttribute(valueHolder, clone, backup, unitOfWork);
+        ValueHolderInterface<?> newValueHolder = (ValueHolderInterface<?>)super.backupCloneAttribute(valueHolder, clone, backup, unitOfWork);
         return buildContainer(newValueHolder);
     }
 
     /**
      * Build a container with the initialized constructor.
      */
-    protected IndirectContainer buildContainer(ValueHolderInterface valueHolder) {
+    protected IndirectContainer buildContainer(ValueHolderInterface<?> valueHolder) {
         try {
             IndirectContainer container = null;
             if (getContainerConstructor().getParameterTypes().length == 0) {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    container = (IndirectContainer)AccessController.doPrivileged(new PrivilegedInvokeConstructor(getContainerConstructor(), new Object[0]));
+                    container = (IndirectContainer)AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(getContainerConstructor(), new Object[0]));
                 }else{
                     container = (IndirectContainer)PrivilegedAccessHelper.invokeConstructor(getContainerConstructor(), new Object[0]);
                 }
                 container.setValueHolder(valueHolder);
             } else {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    container = (IndirectContainer)AccessController.doPrivileged(new PrivilegedInvokeConstructor(getContainerConstructor(), new Object[] { valueHolder }));
+                    container = (IndirectContainer)AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(getContainerConstructor(), new Object[] { valueHolder }));
                 }else{
                     container = (IndirectContainer)PrivilegedAccessHelper.invokeConstructor(getContainerConstructor(), new Object[] { valueHolder });
                 }
@@ -119,8 +119,8 @@
     @Override
     public Object cloneAttribute(Object attributeValue, Object original, CacheKey cacheKey, Object clone, Integer refreshCascade, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
         IndirectContainer container = (IndirectContainer)attributeValue;
-        ValueHolderInterface valueHolder = container.getValueHolder();
-        ValueHolderInterface newValueHolder = (ValueHolderInterface)super.cloneAttribute(valueHolder, original, cacheKey, clone, refreshCascade, cloningSession, buildDirectlyFromRow);
+        ValueHolderInterface<?> valueHolder = container.getValueHolder();
+        ValueHolderInterface<?> newValueHolder = (ValueHolderInterface<?>)super.cloneAttribute(valueHolder, original, cacheKey, clone, refreshCascade, cloningSession, buildDirectlyFromRow);
 
         return buildContainer(newValueHolder);
     }
@@ -175,10 +175,10 @@
     public Object getOriginalIndirectionObject(Object unitOfWorkIndirectionObject, AbstractSession session) {
         IndirectContainer container = (IndirectContainer)unitOfWorkIndirectionObject;
         if (container.getValueHolder() instanceof UnitOfWorkValueHolder) {
-            ValueHolderInterface<?> valueHolder = ((UnitOfWorkValueHolder)container.getValueHolder()).getWrappedValueHolder();
+            ValueHolderInterface<?> valueHolder = ((UnitOfWorkValueHolder<?>)container.getValueHolder()).getWrappedValueHolder();
             if ((valueHolder == null) && session.isRemoteUnitOfWork()) {
                 RemoteSessionController controller = ((RemoteUnitOfWork)session).getParentSessionController();
-                valueHolder = controller.getRemoteValueHolders().get(((UnitOfWorkValueHolder)container.getValueHolder()).getWrappedValueHolderRemoteID());
+                valueHolder = controller.getRemoteValueHolders().get(((UnitOfWorkValueHolder<?>)container.getValueHolder()).getWrappedValueHolderRemoteID());
             }
             return buildContainer(valueHolder);
         } else {
@@ -193,7 +193,7 @@
     @Override
     public Object getOriginalIndirectionObjectForMerge(Object unitOfWorkIndirectionObject, AbstractSession session) {
         IndirectContainer container = (IndirectContainer) getOriginalIndirectionObject(unitOfWorkIndirectionObject, session);
-        DatabaseValueHolder holder = (DatabaseValueHolder)container.getValueHolder();
+        DatabaseValueHolder<?> holder = (DatabaseValueHolder<?>)container.getValueHolder();
         if (holder != null && holder.getSession()!= null){
             holder.setSession(session);
         }
@@ -268,7 +268,7 @@
      * The method validateAttributeOfInstantiatedObject(Object attributeValue) fixes the value of the attributeValue
      * in cases where it is null and indirection requires that it contain some specific data structure.  Return whether this will happen.
      * This method is used to help determine if indirection has been triggered
-     * @see validateAttributeOfInstantiatedObject(Object attributeValue)
+     * @see #validateAttributeOfInstantiatedObject(Object attributeValue)
      */
     @Override
     public boolean isAttributeValueFullyBuilt(Object attributeValue){
@@ -294,7 +294,7 @@
      */
     @Override
     public Object nullValueFromRow() {
-        return buildContainer(new ValueHolder());
+        return buildContainer(new ValueHolder<>());
     }
 
     /**
@@ -302,7 +302,7 @@
      */
     @Override
     public void reset(Object target) {
-        getMapping().setAttributeValueInObject(target, buildContainer(new ValueHolder()));
+        getMapping().setAttributeValueInObject(target, buildContainer(new ValueHolder<>()));
     }
 
     /**
@@ -320,9 +320,9 @@
      */
     @Override
     public boolean objectIsEasilyInstantiated(Object object) {
-        ValueHolderInterface valueHolder = ((IndirectContainer)object).getValueHolder();
+        ValueHolderInterface<?> valueHolder = ((IndirectContainer)object).getValueHolder();
         if (valueHolder instanceof DatabaseValueHolder) {
-            return ((DatabaseValueHolder)valueHolder).isEasilyInstantiated();
+            return ((DatabaseValueHolder<?>)valueHolder).isEasilyInstantiated();
         } else {
             return true;
         }
@@ -361,7 +361,7 @@
      * allow the conatinerClass to be assigned to it.
      */
     @Override
-    protected boolean typeIsValid(Class attributeType) {
+    protected boolean typeIsValid(Class<?> attributeType) {
         return ClassConstants.IndirectContainer_Class.isAssignableFrom(attributeType) || attributeType.isAssignableFrom(getContainerClass());
     }
 
@@ -388,7 +388,7 @@
      */
     @Override
     public Object valueFromBatchQuery(ReadQuery batchQuery, AbstractRecord row, ObjectLevelReadQuery originalQuery, CacheKey parentCacheKey) {
-        ValueHolderInterface valueHolder = (ValueHolderInterface)super.valueFromBatchQuery(batchQuery, row, originalQuery, parentCacheKey);
+        ValueHolderInterface<?> valueHolder = (ValueHolderInterface<?>)super.valueFromBatchQuery(batchQuery, row, originalQuery, parentCacheKey);
         return buildContainer(valueHolder);
     }
 
@@ -401,7 +401,7 @@
      */
     @Override
     public Object valueFromMethod(Object object, AbstractRecord row, AbstractSession session) {
-        ValueHolderInterface valueHolder = (ValueHolderInterface)super.valueFromMethod(object, row, session);
+        ValueHolderInterface<?> valueHolder = (ValueHolderInterface<?>)super.valueFromMethod(object, row, session);
         return buildContainer(valueHolder);
     }
 
@@ -413,7 +413,7 @@
      */
     @Override
     public Object valueFromQuery(ReadQuery query, AbstractRecord row, AbstractSession session) {
-        ValueHolderInterface valueHolder = (ValueHolderInterface)super.valueFromQuery(query, row, session);
+        ValueHolderInterface<?> valueHolder = (ValueHolderInterface<?>)super.valueFromQuery(query, row, session);
         return buildContainer(valueHolder);
     }
 
@@ -425,6 +425,6 @@
      */
     @Override
     public Object valueFromRow(Object object) {
-        return buildContainer(new ValueHolder(object));
+        return buildContainer(new ValueHolder<>(object));
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/DatabaseValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/DatabaseValueHolder.java
index a64fb44..d1be9e5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/DatabaseValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/DatabaseValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -33,10 +33,10 @@
  * @see ValueHolderInterface
  * @author    Dorin Sandu
  */
-public abstract class DatabaseValueHolder implements WeavedAttributeValueHolderInterface, Cloneable, Serializable {
+public abstract class DatabaseValueHolder<T> implements WeavedAttributeValueHolderInterface<T>, Cloneable, Serializable {
 
     /** Stores the object after it is read from the database. */
-    protected volatile Object value;
+    protected volatile T value;
 
     /** Indicates whether the object has been read from the database or not. */
     protected volatile boolean isInstantiated;
@@ -56,6 +56,12 @@
      */
     protected boolean isCoordinatedWithProperty = false;
 
+    /**
+     * Default constructor.
+     */
+    protected DatabaseValueHolder() {
+    }
+
     @Override
     public Object clone() {
         try {
@@ -79,7 +85,7 @@
         return session;
     }
 
-    public ValueHolderInterface getWrappedValueHolder() {
+    public ValueHolderInterface<?> getWrappedValueHolder() {
         return null;
     }
 
@@ -87,7 +93,7 @@
      * Return the object.
      */
     @Override
-    public Object getValue() {
+    public T getValue() {
         boolean instantiated = this.isInstantiated;
         if (!instantiated) {
             synchronized (this) {
@@ -108,7 +114,7 @@
      * Process against the UOW and attempt to load a local copy before going to the shared cache
      * If null is returned then the calling UOW will instantiate as normal.
      */
-    public Object getValue(UnitOfWorkImpl uow) {
+    public T getValue(UnitOfWorkImpl uow) {
         //This method simply returns null as this will cause the UOWVH to trigger
         //the relationship normally.
         return null;
@@ -117,7 +123,7 @@
     /**
      * Instantiate the object.
      */
-    protected abstract Object instantiate() throws DatabaseException;
+    protected abstract T instantiate() throws DatabaseException;
 
     /**
      * Triggers UnitOfWork valueholders directly without triggering the wrapped
@@ -131,7 +137,7 @@
      * Note: Implementations of this method are not necessarily thread-safe.  They must
      * be used in a synchronized manner
      */
-    public abstract Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder);
+    public abstract T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder);
 
     /**
      * This method is used as part of the implementation of WeavedAttributeValueHolderInterface
@@ -218,7 +224,7 @@
     /**
      * Set the object. This is used only by the privileged methods. One must be very careful in using this method.
      */
-    public void privilegedSetValue(Object value) {
+    public void privilegedSetValue(T value) {
         this.value = value;
         isCoordinatedWithProperty = false;
     }
@@ -299,7 +305,7 @@
      * Set the object.
      */
     @Override
-    public void setValue(Object value) {
+    public void setValue(T value) {
         this.value = value;
         setInstantiated();
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/EISOneToManyQueryBasedValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/EISOneToManyQueryBasedValueHolder.java
index c882f19..8a6e4ba 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/EISOneToManyQueryBasedValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/EISOneToManyQueryBasedValueHolder.java
@@ -30,7 +30,7 @@
  * For composite source foreign keys EIS 1-m's a query must be performed
  * for each primary key, so a different type of value holder is required.
  */
-public class EISOneToManyQueryBasedValueHolder extends QueryBasedValueHolder {
+public class EISOneToManyQueryBasedValueHolder<T> extends QueryBasedValueHolder<T> {
     private EISOneToManyMapping mapping;
 
     public EISOneToManyQueryBasedValueHolder(EISOneToManyMapping mapping, ReadQuery query, AbstractRecord sourceRow, AbstractSession session) {
@@ -39,12 +39,13 @@
     }
 
     @Override
-    protected Object instantiate(AbstractSession session) throws DatabaseException {
+    protected T instantiate(AbstractSession session) throws DatabaseException {
         Vector<AbstractRecord> rows = this.mapping.getForeignKeyRows(this.getRow(), session);
 
         int size = rows.size();
         ContainerPolicy cp = ((ReadAllQuery)this.getQuery()).getContainerPolicy();
-        Object returnValue = cp.containerInstance(size);
+        @SuppressWarnings({"unchecked"})
+        T returnValue = (T) cp.containerInstance(size);
 
         for (int i = 0; i < size; i++) {
             AbstractRecord nextRow = rows.get(i);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/IndirectionPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/IndirectionPolicy.java
index 3f745a5..a7a12ad 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/IndirectionPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/IndirectionPolicy.java
@@ -26,6 +26,7 @@
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.internal.sessions.remote.RemoteValueHolder;
 import org.eclipse.persistence.mappings.CollectionMapping;
 import org.eclipse.persistence.mappings.DatabaseMapping;
@@ -160,7 +161,7 @@
      * Replace the transient attributes of the remote value holders
      * with client-side objects.
      */
-    public abstract void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session);
+    public abstract void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session);
 
     /**
      * INTERNAL:
@@ -243,14 +244,14 @@
      * Extract and return the appropriate value from the
      * specified remote value holder.
      */
-    public abstract Object getValueFromRemoteValueHolder(RemoteValueHolder remoteValueHolder);
+    public abstract Object getValueFromRemoteValueHolder(RemoteValueHolder<?> remoteValueHolder);
 
     /**
      * INTERNAL:
      * The method validateAttributeOfInstantiatedObject(Object attributeValue) fixes the value of the attributeValue
      * in cases where it is null and indirection requires that it contain some specific data structure.  Return whether this will happen.
      * This method is used to help determine if indirection has been triggered
-     * @see validateAttributeOfInstantiatedObject(Object attributeValue)
+     * @see #validateAttributeOfInstantiatedObject(Object)
      */
     public boolean isAttributeValueFullyBuilt(Object attributeValue){
         return true;
@@ -286,7 +287,7 @@
      * Replace the client value holder with the server value holder,
      * after copying some of the settings from the client value holder.
      */
-    protected void mergeClientIntoServerValueHolder(RemoteValueHolder serverValueHolder, MergeManager mergeManager) {
+    protected void mergeClientIntoServerValueHolder(RemoteValueHolder<?> serverValueHolder, MergeManager mergeManager) {
         serverValueHolder.setMapping(this.mapping);
         serverValueHolder.setSession(mergeManager.getSession());
 
@@ -447,7 +448,7 @@
      * indirection policy. If it is incorrect, add an exception to the
      * integrity checker.
      */
-    public void validateDeclaredAttributeType(Class attributeType, IntegrityChecker checker) throws DescriptorException {
+    public void validateDeclaredAttributeType(Class<?> attributeType, IntegrityChecker checker) throws DescriptorException {
         // by default, do nothing
     }
 
@@ -456,7 +457,7 @@
      * Verify that attributeType is an appropriate collection type for the
      * indirection policy. If it is incorrect, add an exception to the integrity checker.
      */
-    public void validateDeclaredAttributeTypeForCollection(Class attributeType, IntegrityChecker checker) throws DescriptorException {
+    public void validateDeclaredAttributeTypeForCollection(Class<?> attributeType, IntegrityChecker checker) throws DescriptorException {
         // by default, do nothing
     }
 
@@ -466,7 +467,7 @@
      * indirection policy. If it is incorrect, add an exception
      * to the integrity checker.
      */
-    public void validateGetMethodReturnType(Class returnType, IntegrityChecker checker) throws DescriptorException {
+    public void validateGetMethodReturnType(Class<?> returnType, IntegrityChecker checker) throws DescriptorException {
         // by default, do nothing
     }
 
@@ -475,7 +476,7 @@
      * Verify that getter returnType is an appropriate collection type for the
      * indirection policy. If it is incorrect, add an exception to the integrity checker.
      */
-    public void validateGetMethodReturnTypeForCollection(Class returnType, IntegrityChecker checker) throws DescriptorException {
+    public void validateGetMethodReturnTypeForCollection(Class<?> returnType, IntegrityChecker checker) throws DescriptorException {
         // by default, do nothing
     }
 
@@ -485,7 +486,7 @@
      * indirection policy. If it is incorrect, add an exception
      * to the integrity checker.
      */
-    public void validateSetMethodParameterType(Class parameterType, IntegrityChecker checker) throws DescriptorException {
+    public void validateSetMethodParameterType(Class<?> parameterType, IntegrityChecker checker) throws DescriptorException {
         // by default, do nothing
     }
 
@@ -494,7 +495,7 @@
      * Verify that setter parameterType is an appropriate collection type for the
      * indirection policy. If it is incorrect, add an exception to the integrity checker.
      */
-    public void validateSetMethodParameterTypeForCollection(Class parameterType, IntegrityChecker checker) throws DescriptorException {
+    public void validateSetMethodParameterTypeForCollection(Class<?> parameterType, IntegrityChecker checker) throws DescriptorException {
         // by default, do nothing
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/NoIndirectionPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/NoIndirectionPolicy.java
index 94b59e1..f69ce3d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/NoIndirectionPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/NoIndirectionPolicy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -28,6 +28,7 @@
 import org.eclipse.persistence.internal.sessions.AbstractRecord;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.internal.sessions.remote.RemoteValueHolder;
 import org.eclipse.persistence.queries.ObjectLevelReadQuery;
 import org.eclipse.persistence.queries.ReadQuery;
@@ -91,7 +92,7 @@
      * In this case, the type MUST be a Vector (or, in the case of jdk1.2,
      * Collection or Map).
      */
-    protected boolean collectionTypeIsValid(Class collectionType) {
+    protected boolean collectionTypeIsValid(Class<?> collectionType) {
         return getCollectionMapping().getContainerPolicy().isValidContainerType(collectionType);
     }
 
@@ -114,7 +115,7 @@
      * with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         this.mapping.fixRealObjectReferences(object, objectDescriptors, processedObjects, query, session);
     }
 
@@ -155,7 +156,7 @@
      * specified remote value holder.
      */
     @Override
-    public Object getValueFromRemoteValueHolder(RemoteValueHolder remoteValueHolder) {
+    public Object getValueFromRemoteValueHolder(RemoteValueHolder<?> remoteValueHolder) {
         throw DescriptorException.invalidIndirectionPolicyOperation(this, "getValueFromRemoteValueHolder");
     }
 
@@ -203,7 +204,7 @@
      * Return whether the type is appropriate for the indirection policy.
      * In this case, the attribute type CANNOT be ValueHolderInterface.
      */
-    protected boolean typeIsValid(Class attributeType) {
+    protected boolean typeIsValid(Class<?> attributeType) {
         return attributeType != ClassConstants.ValueHolderInterface_Class;
     }
 
@@ -225,7 +226,7 @@
      * In this case, the attribute type CANNOT be ValueHolderInterface.
      */
     @Override
-    public void validateDeclaredAttributeType(Class attributeType, IntegrityChecker checker) throws DescriptorException {
+    public void validateDeclaredAttributeType(Class<?> attributeType, IntegrityChecker checker) throws DescriptorException {
         super.validateDeclaredAttributeType(attributeType, checker);
         if (!this.typeIsValid(attributeType)) {
             checker.handleError(DescriptorException.attributeAndMappingWithoutIndirectionMismatch(this.mapping));
@@ -240,7 +241,7 @@
      * Collection or Map).
      */
     @Override
-    public void validateDeclaredAttributeTypeForCollection(Class attributeType, IntegrityChecker checker) throws DescriptorException {
+    public void validateDeclaredAttributeTypeForCollection(Class<?> attributeType, IntegrityChecker checker) throws DescriptorException {
         super.validateDeclaredAttributeTypeForCollection(attributeType, checker);
         if (!this.collectionTypeIsValid(attributeType)) {
             InterfaceContainerPolicy policy = (InterfaceContainerPolicy)getCollectionMapping().getContainerPolicy();
@@ -256,7 +257,7 @@
      * In this case, the return type CANNOT be ValueHolderInterface.
      */
     @Override
-    public void validateGetMethodReturnType(Class returnType, IntegrityChecker checker) throws DescriptorException {
+    public void validateGetMethodReturnType(Class<?> returnType, IntegrityChecker checker) throws DescriptorException {
         super.validateGetMethodReturnType(returnType, checker);
         if (!this.typeIsValid(returnType)) {
             checker.handleError(DescriptorException.returnAndMappingWithoutIndirectionMismatch(this.mapping));
@@ -271,7 +272,7 @@
      * Collection or Map).
      */
     @Override
-    public void validateGetMethodReturnTypeForCollection(Class returnType, IntegrityChecker checker) throws DescriptorException {
+    public void validateGetMethodReturnTypeForCollection(Class<?> returnType, IntegrityChecker checker) throws DescriptorException {
         super.validateGetMethodReturnTypeForCollection(returnType, checker);
         if (!this.collectionTypeIsValid(returnType)) {
             checker.handleError(DescriptorException.getMethodReturnTypeNotValid(getCollectionMapping()));
@@ -286,7 +287,7 @@
      * In this case, the parameter type CANNOT be ValueHolderInterface.
      */
     @Override
-    public void validateSetMethodParameterType(Class parameterType, IntegrityChecker checker) throws DescriptorException {
+    public void validateSetMethodParameterType(Class<?> parameterType, IntegrityChecker checker) throws DescriptorException {
         super.validateSetMethodParameterType(parameterType, checker);
         if (!this.typeIsValid(parameterType)) {
             checker.handleError(DescriptorException.parameterAndMappingWithoutIndirectionMismatch(this.mapping));
@@ -301,7 +302,7 @@
      * Collection or Map).
      */
     @Override
-    public void validateSetMethodParameterTypeForCollection(Class parameterType, IntegrityChecker checker) throws DescriptorException {
+    public void validateSetMethodParameterTypeForCollection(Class<?> parameterType, IntegrityChecker checker) throws DescriptorException {
         super.validateSetMethodParameterTypeForCollection(parameterType, checker);
         if (!this.collectionTypeIsValid(parameterType)) {
             checker.handleError(DescriptorException.setMethodParameterTypeNotValid(getCollectionMapping()));
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProtectedValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProtectedValueHolder.java
index 793bba8..8ad3052 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProtectedValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProtectedValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2019 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
@@ -28,19 +28,19 @@
  * @author Gordon Yorke
  * @since EclipseLink 2.2
  */
-public class ProtectedValueHolder extends DatabaseValueHolder implements WrappingValueHolder{
+public class ProtectedValueHolder<T> extends DatabaseValueHolder<T> implements WrappingValueHolder<T> {
 
-    protected transient ValueHolderInterface<?> wrappedValueHolder;
+    protected transient ValueHolderInterface<T> wrappedValueHolder;
     protected transient DatabaseMapping mapping;
 
-    public ProtectedValueHolder(ValueHolderInterface<?> attributeValue, DatabaseMapping mapping, AbstractSession cloningSession) {
+    public ProtectedValueHolder(ValueHolderInterface<T> attributeValue, DatabaseMapping mapping, AbstractSession cloningSession) {
         this.wrappedValueHolder = attributeValue;
         this.mapping = mapping;
         this.session = cloningSession;
     }
 
     @Override
-    protected Object instantiate() throws DatabaseException {
+    protected T instantiate() throws DatabaseException {
         if (this.session == null){
             throw ValidationException.instantiatingValueholderWithNullSession();
         }
@@ -48,18 +48,19 @@
         // wrapped valueholder or the ProtectedValueHolder would not have been created.
         Integer refreshCascade = null;
         if (wrappedValueHolder instanceof QueryBasedValueHolder){
-            refreshCascade = ((QueryBasedValueHolder)getWrappedValueHolder()).getRefreshCascadePolicy();
+            refreshCascade = ((QueryBasedValueHolder<T>)getWrappedValueHolder()).getRefreshCascadePolicy();
         }
-        Object clone = mapping.buildCloneForPartObject(this.wrappedValueHolder.getValue(),null, null, null, this.session, refreshCascade, true, true);
+        @SuppressWarnings({"unchecked"})
+        T clone = (T) mapping.buildCloneForPartObject(this.wrappedValueHolder.getValue(),null, null, null, this.session, refreshCascade, true, true);
         // Bug 414801
         if (wrappedValueHolder.isInstantiated() && refreshCascade != null) {
-            ((QueryBasedValueHolder)getWrappedValueHolder()).setRefreshCascadePolicy(null);
+            ((QueryBasedValueHolder<T>)getWrappedValueHolder()).setRefreshCascadePolicy(null);
         }
         return clone;
     }
 
     @Override
-    public Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder) {
+    public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder) {
         throw ValidationException.operationNotSupported("instantiateForUnitOfWorkValueHolder");
     }
 
@@ -69,7 +70,7 @@
     }
 
     @Override
-    public ValueHolderInterface<?> getWrappedValueHolder() {
+    public ValueHolderInterface<T> getWrappedValueHolder() {
         return wrappedValueHolder;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProxyIndirectionHandler.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProxyIndirectionHandler.java
index 52a345f..f52c713 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProxyIndirectionHandler.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProxyIndirectionHandler.java
@@ -40,8 +40,8 @@
  * @author        Rick Barkhouse
  * @since        TopLink 3.0
  */
-public class ProxyIndirectionHandler implements InvocationHandler, Serializable {
-    private ValueHolderInterface<?> valueHolder;
+public class ProxyIndirectionHandler<T> implements InvocationHandler, Serializable {
+    private ValueHolderInterface<T> valueHolder;
 
     // =====================================================================
 
@@ -60,7 +60,7 @@
      *
      * Store the value holder.
      */
-    private ProxyIndirectionHandler(ValueHolderInterface valueHolder) {
+    private ProxyIndirectionHandler(ValueHolderInterface<T> valueHolder) {
         this.valueHolder = valueHolder;
     }
 
@@ -126,7 +126,7 @@
      *
      * Utility method to create a new proxy object.
      */
-    public static Object newProxyInstance(Class anInterface, Class[] interfaces, ValueHolderInterface valueHolder) {
+    public static <T> Object newProxyInstance(Class<?> anInterface, Class<?>[] interfaces, ValueHolderInterface<T> valueHolder) {
         ClassLoader classLoader = null;
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
             try{
@@ -137,7 +137,7 @@
         }else{
             classLoader = PrivilegedAccessHelper.getClassLoaderForClass(anInterface);
         }
-        return Proxy.newProxyInstance(classLoader, interfaces, new ProxyIndirectionHandler(valueHolder));
+        return Proxy.newProxyInstance(classLoader, interfaces, new ProxyIndirectionHandler<>(valueHolder));
     }
 
     // =====================================================================
@@ -147,7 +147,7 @@
      *
      * Get the ValueHolder associated with this handler.
      */
-    public ValueHolderInterface<?> getValueHolder() {
+    public ValueHolderInterface<T> getValueHolder() {
         return this.valueHolder;
     }
 
@@ -158,7 +158,7 @@
      *
      * Set the ValueHolder associated with this handler.
      */
-    public void setValueHolder(ValueHolderInterface<?> value) {
+    public void setValueHolder(ValueHolderInterface<T> value) {
         this.valueHolder = value;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProxyIndirectionPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProxyIndirectionPolicy.java
index 19baa81..baee885 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProxyIndirectionPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/ProxyIndirectionPolicy.java
@@ -59,14 +59,14 @@
  * @since        TopLink 3.0
  */
 public class ProxyIndirectionPolicy extends BasicIndirectionPolicy {
-    private Class[] targetInterfaces;
+    private final Class<?>[] targetInterfaces;
 
-    public ProxyIndirectionPolicy(Class[] targetInterfaces) {
+    public ProxyIndirectionPolicy(Class<?>[] targetInterfaces) {
         this.targetInterfaces = targetInterfaces;
     }
 
     public ProxyIndirectionPolicy() {
-        this.targetInterfaces = new Class[] {  };
+        this.targetInterfaces = new Class<?>[] {  };
     }
 
     /**
@@ -101,7 +101,7 @@
      */
     @Override
     public Object valueFromRow(Object object) {
-        ValueHolderInterface valueHolder = new ValueHolder(object);
+        ValueHolderInterface<?> valueHolder = new ValueHolder<>(object);
 
         return ProxyIndirectionHandler.newProxyInstance(object.getClass(), targetInterfaces, valueHolder);
     }
@@ -124,7 +124,7 @@
         } catch (Exception e) {
             return null;
         }
-        ValueHolderInterface valueHolder = new QueryBasedValueHolder(query, row, session);
+        ValueHolderInterface<?> valueHolder = new QueryBasedValueHolder<>(query, row, session);
 
         return ProxyIndirectionHandler.newProxyInstance(descriptor.getJavaClass(), targetInterfaces, valueHolder);
     }
@@ -137,7 +137,7 @@
      */
     @Override
     public Object valueFromMethod(Object object, AbstractRecord row, AbstractSession session) {
-        ValueHolderInterface valueHolder = new TransformerBasedValueHolder(this.getTransformationMapping().getAttributeTransformer(), object, row, session);
+        ValueHolderInterface<?> valueHolder = new TransformerBasedValueHolder<>(this.getTransformationMapping().getAttributeTransformer(), object, row, session);
 
         return ProxyIndirectionHandler.newProxyInstance(object.getClass(), targetInterfaces, valueHolder);
     }
@@ -159,7 +159,7 @@
                 d = originalQuery.getDescriptor().getInterfacePolicy().getChildDescriptors().get(0);
             }
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                object = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(d.getJavaClass()));
+                object = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(d.getJavaClass()));
             }else{
                 object = PrivilegedAccessHelper.newInstanceFromClass(d.getJavaClass());
             }
@@ -168,7 +168,7 @@
             e.printStackTrace();
             return null;
         }
-        ValueHolderInterface valueHolder = new BatchValueHolder(batchQuery, row, this.getForeignReferenceMapping(), originalQuery, parentCacheKey);
+        ValueHolderInterface<?> valueHolder = new BatchValueHolder<>(batchQuery, row, this.getForeignReferenceMapping(), originalQuery, parentCacheKey);
 
         return ProxyIndirectionHandler.newProxyInstance(object.getClass(), targetInterfaces, valueHolder);
     }
@@ -180,7 +180,7 @@
     @Override
     public boolean objectIsInstantiated(Object object) {
         if (object instanceof Proxy) {
-            ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(object);
+            ProxyIndirectionHandler<?> handler = (ProxyIndirectionHandler<?>)Proxy.getInvocationHandler(object);
             ValueHolderInterface<?> valueHolder = handler.getValueHolder();
             return valueHolder.isInstantiated();
         } else {
@@ -195,10 +195,10 @@
     @Override
     public boolean objectIsEasilyInstantiated(Object object) {
         if (object instanceof Proxy) {
-            ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(object);
+            ProxyIndirectionHandler<?> handler = (ProxyIndirectionHandler<?>)Proxy.getInvocationHandler(object);
             ValueHolderInterface<?> valueHolder = handler.getValueHolder();
             if (valueHolder instanceof DatabaseValueHolder) {
-                return ((DatabaseValueHolder)valueHolder).isEasilyInstantiated();
+                return ((DatabaseValueHolder<?>)valueHolder).isEasilyInstantiated();
             }
         }
         return true;
@@ -232,7 +232,7 @@
     @Override
     public Object getRealAttributeValueFromObject(Object obj, Object object) {
         if (object instanceof Proxy) {
-            ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(object);
+            ProxyIndirectionHandler<?> handler = (ProxyIndirectionHandler<?>)Proxy.getInvocationHandler(object);
             ValueHolderInterface<?> valueHolder = handler.getValueHolder();
             return valueHolder.getValue();
         } else {
@@ -246,7 +246,7 @@
      */
     public static Object getValueFromProxy(Object value) {
         if (Proxy.isProxyClass(value.getClass())) {
-            return ((ProxyIndirectionHandler)Proxy.getInvocationHandler(value)).getValueHolder().getValue();
+            return ((ProxyIndirectionHandler<?>)Proxy.getInvocationHandler(value)).getValueHolder().getValue();
         }
         return value;
     }
@@ -267,10 +267,10 @@
     @Override
     public Object getOriginalIndirectionObject(Object unitOfWorkIndirectionObject, AbstractSession session) {
         if (unitOfWorkIndirectionObject instanceof UnitOfWorkValueHolder) {
-            ValueHolderInterface<?> valueHolder = ((UnitOfWorkValueHolder)unitOfWorkIndirectionObject).getWrappedValueHolder();
+            ValueHolderInterface<?> valueHolder = ((UnitOfWorkValueHolder<?>)unitOfWorkIndirectionObject).getWrappedValueHolder();
             if ((valueHolder == null) && session.isRemoteUnitOfWork()) {
                 RemoteSessionController controller = ((RemoteUnitOfWork)session).getParentSessionController();
-                valueHolder = controller.getRemoteValueHolders().get(((UnitOfWorkValueHolder)unitOfWorkIndirectionObject).getWrappedValueHolderRemoteID());
+                valueHolder = controller.getRemoteValueHolders().get(((UnitOfWorkValueHolder<?>)unitOfWorkIndirectionObject).getWrappedValueHolderRemoteID());
             }
             return valueHolder;
         } else {
@@ -284,7 +284,7 @@
      * remote value holders with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         //org.eclipse.persistence.internal.helper.Helper.toDo("*** Something tells me this isn't going to work. *** [X]");
     }
 
@@ -299,13 +299,13 @@
             return null;
         }
 
-        ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(referenceObject);
+        ProxyIndirectionHandler<?> handler = (ProxyIndirectionHandler<?>)Proxy.getInvocationHandler(referenceObject);
         ValueHolderInterface<?> valueHolder = handler.getValueHolder();
 
         if (valueHolder.isInstantiated()) {
             return null;
         } else {
-            return ((DatabaseValueHolder)valueHolder).getRow();
+            return ((DatabaseValueHolder<?>)valueHolder).getRow();
         }
     }
 
@@ -317,31 +317,32 @@
      *  row, putting it in the shared cache, and then cloning the original.
      */
     @Override
+    @SuppressWarnings({"unchecked"})
     public Object cloneAttribute(Object attributeValue, Object original, CacheKey cacheKey, Object clone, Integer refreshCascade, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
         if (!(attributeValue instanceof Proxy)) {
             boolean isExisting = !cloningSession.isUnitOfWork() || (((UnitOfWorkImpl)cloningSession).isObjectRegistered(clone) && (!((UnitOfWorkImpl)cloningSession).isOriginalNewObject(original)));
             return this.getMapping().buildCloneForPartObject(attributeValue, original, null, clone, cloningSession, refreshCascade, isExisting, !buildDirectlyFromRow);
         }
 
-        ValueHolderInterface newValueHolder;
-        ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(attributeValue);
-        ValueHolderInterface<?> oldValueHolder = handler.getValueHolder();
+        ValueHolderInterface<Object> newValueHolder;
+        ProxyIndirectionHandler<Object> handler = (ProxyIndirectionHandler<Object>)Proxy.getInvocationHandler(attributeValue);
+        ValueHolderInterface<Object> oldValueHolder = handler.getValueHolder();
 
         if (!buildDirectlyFromRow && cloningSession.isUnitOfWork() && ((UnitOfWorkImpl)cloningSession).isOriginalNewObject(original)) {
             // CR#3156435 Throw a meaningful exception if a serialized/dead value holder is detected.
             // This can occur if an existing serialized object is attempt to be registered as new.
             if ((oldValueHolder instanceof DatabaseValueHolder)
                     && (! oldValueHolder.isInstantiated())
-                    && (((DatabaseValueHolder) oldValueHolder).getSession() == null)
-                    && (! ((DatabaseValueHolder) oldValueHolder).isSerializedRemoteUnitOfWorkValueHolder())) {
+                    && (((DatabaseValueHolder<?>) oldValueHolder).getSession() == null)
+                    && (! ((DatabaseValueHolder<?>) oldValueHolder).isSerializedRemoteUnitOfWorkValueHolder())) {
                 throw DescriptorException.attemptToRegisterDeadIndirection(original, getMapping());
             }
-            newValueHolder = new ValueHolder();
+            newValueHolder = new ValueHolder<>();
             newValueHolder.setValue(this.getMapping().buildCloneForPartObject(oldValueHolder.getValue(), original, null, clone, cloningSession, refreshCascade, false, false));
         } else {
             AbstractRecord row = null;
             if (oldValueHolder instanceof DatabaseValueHolder) {
-                row = ((DatabaseValueHolder)oldValueHolder).getRow();
+                row = ((DatabaseValueHolder<?>)oldValueHolder).getRow();
             }
             newValueHolder = this.getMapping().createCloneValueHolder(oldValueHolder, original, clone, row, cloningSession, buildDirectlyFromRow);
         }
@@ -354,20 +355,21 @@
      * Return a backup clone of the attribute.
      */
     @Override
+    @SuppressWarnings({"unchecked"})
     public Object backupCloneAttribute(Object attributeValue, Object clone, Object backup, UnitOfWorkImpl unitOfWork) {
         if (!(attributeValue instanceof Proxy)) {
             return this.getMapping().buildBackupCloneForPartObject(attributeValue, clone, backup, unitOfWork);
         }
-        ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(attributeValue);
-        ValueHolderInterface<?> unitOfWorkValueHolder = handler.getValueHolder();
-        ValueHolderInterface<?> backupValueHolder = null;
+        ProxyIndirectionHandler<Object> handler = (ProxyIndirectionHandler<Object>)Proxy.getInvocationHandler(attributeValue);
+        ValueHolderInterface<Object> unitOfWorkValueHolder = handler.getValueHolder();
+        ValueHolderInterface<Object> backupValueHolder = null;
 
         if ((!(unitOfWorkValueHolder instanceof UnitOfWorkValueHolder)) || unitOfWorkValueHolder.isInstantiated()) {
-            backupValueHolder = (ValueHolderInterface<?>) super.backupCloneAttribute(unitOfWorkValueHolder, clone, backup, unitOfWork);
+            backupValueHolder = (ValueHolderInterface<Object>) super.backupCloneAttribute(unitOfWorkValueHolder, clone, backup, unitOfWork);
         } else {
             // CR#2852176 Use a BackupValueHolder to handle replacing of the original.
-            backupValueHolder = new BackupValueHolder(unitOfWorkValueHolder);
-            ((UnitOfWorkValueHolder)unitOfWorkValueHolder).setBackupValueHolder(backupValueHolder);
+            backupValueHolder = new BackupValueHolder<>(unitOfWorkValueHolder);
+            ((UnitOfWorkValueHolder<Object>)unitOfWorkValueHolder).setBackupValueHolder(backupValueHolder);
         }
 
         return ProxyIndirectionHandler.newProxyInstance(attributeValue.getClass(), targetInterfaces, backupValueHolder);
@@ -380,7 +382,7 @@
     @Override
     public void iterateOnAttributeValue(DescriptorIterator iterator, Object attributeValue) {
         if (attributeValue instanceof Proxy) {
-            ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(attributeValue);
+            ProxyIndirectionHandler<?> handler = (ProxyIndirectionHandler<?>)Proxy.getInvocationHandler(attributeValue);
             ValueHolderInterface<?> valueHolder = handler.getValueHolder();
 
             iterator.iterateValueHolderForMapping(valueHolder, this.getMapping());
@@ -412,7 +414,7 @@
      * integrity checker.  In this case, the attribute type must be contained in targetInterfaces.
      */
     @Override
-    public void validateDeclaredAttributeType(Class attributeType, IntegrityChecker checker) throws DescriptorException {
+    public void validateDeclaredAttributeType(Class<?> attributeType, IntegrityChecker checker) throws DescriptorException {
         if (!isValidType(attributeType)) {
             checker.handleError(DescriptorException.invalidAttributeTypeForProxyIndirection(attributeType, targetInterfaces, getMapping()));
         }
@@ -425,7 +427,7 @@
      * public interface.
      */
     @Override
-    public void validateGetMethodReturnType(Class returnType, IntegrityChecker checker) throws DescriptorException {
+    public void validateGetMethodReturnType(Class<?> returnType, IntegrityChecker checker) throws DescriptorException {
         if (!isValidType(returnType)) {
             checker.handleError(DescriptorException.invalidGetMethodReturnTypeForProxyIndirection(returnType, targetInterfaces, getMapping()));
         }
@@ -438,7 +440,7 @@
      * public interface.
      */
     @Override
-    public void validateSetMethodParameterType(Class parameterType, IntegrityChecker checker) throws DescriptorException {
+    public void validateSetMethodParameterType(Class<?> parameterType, IntegrityChecker checker) throws DescriptorException {
         if (!isValidType(parameterType)) {
             checker.handleError(DescriptorException.invalidSetMethodParameterTypeForProxyIndirection(parameterType, targetInterfaces, getMapping()));
         }
@@ -449,7 +451,7 @@
      * The method validateAttributeOfInstantiatedObject(Object attributeValue) fixes the value of the attributeValue
      * in cases where it is null and indirection requires that it contain some specific data structure.  Return whether this will happen.
      * This method is used to help determine if indirection has been triggered
-     * @see validateAttributeOfInstantiatedObject(Object attributeValue)
+     * @see #validateAttributeOfInstantiatedObject(Object attributeValue)
      */
     @Override
     public boolean isAttributeValueFullyBuilt(Object attributeValue){
@@ -461,7 +463,7 @@
      * Verify that a class type is valid to use for the proxy.  The class must be one of the
      * interfaces in <CODE>targetInterfaces</CODE>.
      */
-    public boolean isValidType(Class attributeType) {
+    public boolean isValidType(Class<?> attributeType) {
         if (!attributeType.isInterface()) {
             return false;
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/QueryBasedValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/QueryBasedValueHolder.java
index f2b9876..bfd5466 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/QueryBasedValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/QueryBasedValueHolder.java
@@ -35,7 +35,7 @@
  * @see ObjectLevelReadQuery
  * @author Dorin Sandu
  */
-public class QueryBasedValueHolder extends DatabaseValueHolder {
+public class QueryBasedValueHolder<T> extends DatabaseValueHolder<T> {
 
     /**
      * Stores the query to be executed.
@@ -54,9 +54,7 @@
         this(query, null, row, session);
     }
 
-    /**
-
-    /**
+    /*
      * Store the uow identity so that it can be used to determine new
      * transaction logic
      */
@@ -99,9 +97,10 @@
      * If null is returned then the calling UOW will instantiate as normal.
      */
     @Override
-    public Object getValue(UnitOfWorkImpl uow) {
+    @SuppressWarnings({"unchecked"})
+    public T getValue(UnitOfWorkImpl uow) {
         if (this.query.isReadObjectQuery()){
-            return this.query.getQueryMechanism().checkCacheForObject(this.query.getTranslationRow(), uow);
+            return (T) this.query.getQueryMechanism().checkCacheForObject(this.query.getTranslationRow(), uow);
         }
         //not able to shortcircuit cache lookup to UOW return null;
         return null;
@@ -119,14 +118,15 @@
     }
 
     @Override
-    protected Object instantiate() throws DatabaseException {
+    protected T instantiate() throws DatabaseException {
         return instantiate(this.session);
     }
 
     /**
      * Instantiate the object by executing the query on the session.
      */
-    protected Object instantiate(AbstractSession session) throws DatabaseException {
+    @SuppressWarnings({"unchecked"})
+    protected T instantiate(AbstractSession session) throws DatabaseException {
         if (session == null) {
             throw ValidationException.instantiatingValueholderWithNullSession();
         }
@@ -136,7 +136,7 @@
         Object result = session.executeQuery(getQuery(), getRow());
         // Bug 489898 - ensure that the query's session is dereferenced, post-execution
         getQuery().setSession(null);
-        return result;
+        return (T) result;
     }
 
     /**
@@ -151,7 +151,7 @@
      * thread-safe. It must be used in a synchronized manner
      */
     @Override
-    public Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder) {
+    public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder) {
         return instantiate(unitOfWorkValueHolder.getUnitOfWork());
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/TransformerBasedValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/TransformerBasedValueHolder.java
index df7b80a..5cf89d8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/TransformerBasedValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/TransformerBasedValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -30,7 +30,7 @@
  *  That Transformer may be a MethodBasedAttributeTransformer or a user defined implementation.
  *
  */
-public class TransformerBasedValueHolder extends DatabaseValueHolder {
+public class TransformerBasedValueHolder<T> extends DatabaseValueHolder<T> {
 
     /**
      * Stores the method to be executed. The method can take
@@ -88,13 +88,14 @@
      * Instantiate the object by executing the method on the transformer.
      */
     @Override
-    protected Object instantiate() throws DescriptorException {
+    protected T instantiate() throws DescriptorException {
         return instantiate(getObject(), getSession());
     }
 
-    protected Object instantiate(Object object, AbstractSession session) throws DescriptorException {
+    @SuppressWarnings({"unchecked"})
+    protected T instantiate(Object object, AbstractSession session) throws DescriptorException {
         try {
-            return transformer.buildAttributeValue(getRow(), object, session);
+            return (T) transformer.buildAttributeValue(getRow(), object, session);
         } catch (DescriptorException ex) {
             Throwable nestedException = ex.getInternalException();
             if (nestedException instanceof IllegalAccessException) {
@@ -121,7 +122,7 @@
      * Note: This method is not thread-safe.  It must be used in a synchronized manner
      */
     @Override
-    public Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder) {
+    public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder) {
         return instantiate(getObject(), unitOfWorkValueHolder.getUnitOfWork());
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/TransparentIndirectionPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/TransparentIndirectionPolicy.java
index 179aa2f..815687c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/TransparentIndirectionPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/TransparentIndirectionPolicy.java
@@ -92,11 +92,11 @@
      * database will these contents be copied to the backup clone.
      */
     protected Object buildBackupClone(IndirectContainer container) {
-        ValueHolderInterface containerValueHolder = container.getValueHolder();
+        ValueHolderInterface<Object> containerValueHolder = container.getValueHolder();
         // CR#2852176 Use a BackupValueHolder to handle replacing of the original.
-        BackupValueHolder backupValueHolder = new BackupValueHolder(containerValueHolder);
+        BackupValueHolder<Object> backupValueHolder = new BackupValueHolder<>(containerValueHolder);
         if (containerValueHolder instanceof UnitOfWorkValueHolder) {
-           ((UnitOfWorkValueHolder) containerValueHolder).setBackupValueHolder(backupValueHolder);
+           ((UnitOfWorkValueHolder<Object>) containerValueHolder).setBackupValueHolder(backupValueHolder);
         }
         return this.buildIndirectContainer(backupValueHolder);
     }
@@ -149,7 +149,7 @@
      */
     @Override
     public Object cloneAttribute(Object attributeValue, Object original, CacheKey cacheKey, Object clone, Integer refreshCascade, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
-        ValueHolderInterface valueHolder = null;
+        ValueHolderInterface<Object> valueHolder = null;
         Object container = null;
         IndirectList indirectList = null;
         IndirectContainer indirectContainer = null;
@@ -165,19 +165,19 @@
             // This can occur if an existing serialized object is attempt to be registered as new.
             if ((valueHolder instanceof DatabaseValueHolder)
                     && (! valueHolder.isInstantiated())
-                    && (((DatabaseValueHolder) valueHolder).getSession() == null)
-                    && (! ((DatabaseValueHolder) valueHolder).isSerializedRemoteUnitOfWorkValueHolder())) {
+                    && (((DatabaseValueHolder<?>) valueHolder).getSession() == null)
+                    && (! ((DatabaseValueHolder<?>) valueHolder).isSerializedRemoteUnitOfWorkValueHolder())) {
                 throw DescriptorException.attemptToRegisterDeadIndirection(original, this.mapping);
             }
             if (this.mapping.getRelationshipPartner() == null) {
                 container = this.mapping.buildCloneForPartObject(attributeValue, original, cacheKey, clone, cloningSession, refreshCascade, false, false);
             } else {
                 if (indirectContainer == null) {
-                    valueHolder = new ValueHolder(attributeValue);
+                    valueHolder = new ValueHolder<>(attributeValue);
                 }
                 AbstractRecord row = null;
                 if (valueHolder instanceof DatabaseValueHolder) {
-                    row = ((DatabaseValueHolder)valueHolder).getRow();
+                    row = ((DatabaseValueHolder<?>)valueHolder).getRow();
                 }
 
                 //If a new object is being cloned then we must build a new UOWValueHolder
@@ -185,7 +185,7 @@
                 // here the code instantiates the valueholder in a privledged manner because a
                 // UOWValueHolder will assume the objects in the collection are existing if the valueholder
                 //  Goes through it's own instantiation process.
-                DatabaseValueHolder newValueHolder = this.mapping.createCloneValueHolder(valueHolder, original, clone, row, cloningSession, buildDirectlyFromRow);
+                DatabaseValueHolder<Object> newValueHolder = this.mapping.createCloneValueHolder(valueHolder, original, clone, row, cloningSession, buildDirectlyFromRow);
                 container = buildIndirectContainer(newValueHolder);
                 Object cloneCollection = this.mapping.buildCloneForPartObject(attributeValue, original, cacheKey, clone, cloningSession, refreshCascade, false, false);
                 newValueHolder.privilegedSetValue(cloneCollection);
@@ -193,13 +193,13 @@
             }
         } else {
             if (indirectContainer == null) {
-                valueHolder = new ValueHolder(attributeValue);
+                valueHolder = new ValueHolder<>(attributeValue);
             }
             AbstractRecord row = null;
             if (valueHolder instanceof DatabaseValueHolder) {
-                row = ((DatabaseValueHolder)valueHolder).getRow();
+                row = ((DatabaseValueHolder<?>)valueHolder).getRow();
             }
-            DatabaseValueHolder uowValueHolder = this.mapping.createCloneValueHolder(valueHolder, original, clone, row, cloningSession, buildDirectlyFromRow);
+            DatabaseValueHolder<?> uowValueHolder = this.mapping.createCloneValueHolder(valueHolder, original, clone, row, cloningSession, buildDirectlyFromRow);
             if ((indirectContainer == null) || !buildDirectlyFromRow) {
                 container = buildIndirectContainer(uowValueHolder);
             } else {
@@ -261,7 +261,7 @@
         if (this.objectIsInstantiated(referenceObject)) {
             return null;
         } else {
-            return ((DatabaseValueHolder)((IndirectContainer)referenceObject).getValueHolder()).getRow();
+            return ((DatabaseValueHolder<?>)((IndirectContainer)referenceObject).getValueHolder()).getRow();
         }
     }
 
@@ -272,10 +272,10 @@
      * with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         Object container = getMapping().getAttributeValueFromObject(object);
         if (container instanceof IndirectContainer && ((((IndirectContainer) container).getValueHolder() instanceof RemoteValueHolder)) ) {
-            RemoteValueHolder valueHolder = (RemoteValueHolder)((IndirectContainer)container).getValueHolder();
+            RemoteValueHolder<?> valueHolder = (RemoteValueHolder)((IndirectContainer)container).getValueHolder();
             valueHolder.setSession(session);
             valueHolder.setMapping(getMapping());
             if ((!query.shouldMaintainCache()) && ((!query.shouldCascadeParts()) || (query.shouldCascadePrivateParts() && (!this.mapping.isPrivateOwned())))) {
@@ -327,7 +327,7 @@
     public Object getOriginalIndirectionObject(Object unitOfWorkIndirectionObject, AbstractSession session) {
         IndirectContainer container = (IndirectContainer)unitOfWorkIndirectionObject;
         if (container.getValueHolder() instanceof UnitOfWorkValueHolder) {
-            return buildIndirectContainer((ValueHolderInterface) getOriginalValueHolder(unitOfWorkIndirectionObject, session));
+            return buildIndirectContainer((ValueHolderInterface<?>) getOriginalValueHolder(unitOfWorkIndirectionObject, session));
         } else {
             return container;
         }
@@ -340,7 +340,7 @@
     @Override
     public Object getOriginalIndirectionObjectForMerge(Object unitOfWorkIndirectionObject, AbstractSession session) {
         IndirectContainer container = (IndirectContainer) getOriginalIndirectionObject(unitOfWorkIndirectionObject, session);
-        DatabaseValueHolder holder = (DatabaseValueHolder)container.getValueHolder();
+        DatabaseValueHolder<?> holder = (DatabaseValueHolder<?>)container.getValueHolder();
         if (holder != null && holder.getSession()!= null){
             holder.setSession(session);
         }
@@ -355,23 +355,23 @@
     @Override
     public Object getOriginalValueHolder(Object unitOfWorkIndirectionObject, AbstractSession session) {
         if (! (unitOfWorkIndirectionObject instanceof IndirectContainer)){
-            return new ValueHolder();
+            return new ValueHolder<>();
         }
         IndirectContainer container = (IndirectContainer)unitOfWorkIndirectionObject;
         if (container.getValueHolder() instanceof WrappingValueHolder) {
-            ValueHolderInterface<?> valueHolder = ((WrappingValueHolder)container.getValueHolder()).getWrappedValueHolder();
+            ValueHolderInterface<?> valueHolder = ((WrappingValueHolder<?>)container.getValueHolder()).getWrappedValueHolder();
             if ((valueHolder == null) && session.isRemoteUnitOfWork()) {
                 RemoteSessionController controller = ((RemoteUnitOfWork)session).getParentSessionController();
-                valueHolder = controller.getRemoteValueHolders().get(((UnitOfWorkValueHolder)container.getValueHolder()).getWrappedValueHolderRemoteID());
+                valueHolder = controller.getRemoteValueHolders().get(((UnitOfWorkValueHolder<?>)container.getValueHolder()).getWrappedValueHolderRemoteID());
             }
             if (!session.isProtectedSession()){
-                while (valueHolder instanceof WrappingValueHolder && ((WrappingValueHolder)valueHolder).getWrappedValueHolder() != null){
-                    valueHolder = ((WrappingValueHolder)valueHolder).getWrappedValueHolder();
+                while (valueHolder instanceof WrappingValueHolder && ((WrappingValueHolder<?>)valueHolder).getWrappedValueHolder() != null){
+                    valueHolder = ((WrappingValueHolder<?>)valueHolder).getWrappedValueHolder();
                 }
             }
             // EL bug 470161
-            if ((valueHolder != null) && (valueHolder instanceof DatabaseValueHolder)) {
-                ((DatabaseValueHolder) valueHolder).releaseWrappedValueHolder(session);
+            if (valueHolder instanceof DatabaseValueHolder) {
+                ((DatabaseValueHolder<?>) valueHolder).releaseWrappedValueHolder(session);
             }
             return valueHolder;
         } else {
@@ -404,7 +404,7 @@
      * The method validateAttributeOfInstantiatedObject(Object attributeValue) fixes the value of the attributeValue
      * in cases where it is null and indirection requires that it contain some specific data structure.  Return whether this will happen.
      * This method is used to help determine if indirection has been triggered
-     * @see validateAttributeOfInstantiatedObject(Object attributeValue)
+     * @see #validateAttributeOfInstantiatedObject(Object)
      */
     @Override
     public boolean isAttributeValueFullyBuilt(Object attributeValue){
@@ -421,7 +421,7 @@
      * specified remote value holder.
      */
     @Override
-    public Object getValueFromRemoteValueHolder(RemoteValueHolder remoteValueHolder) {
+    public Object getValueFromRemoteValueHolder(RemoteValueHolder<?> remoteValueHolder) {
         Object result = remoteValueHolder.getServerIndirectionObject();
         this.getContainerPolicy().sizeFor(result);// forgive me for this hack: but we have to do something to trigger the database read
         return result;
@@ -462,7 +462,7 @@
         if( attributeValue instanceof IndirectContainer) {
             ValueHolderInterface valueHolder = ((IndirectContainer)attributeValue).getValueHolder();
             if (valueHolder instanceof QueryBasedValueHolder) {
-                ((QueryBasedValueHolder)valueHolder).setSourceObject(sourceObject);
+                ((QueryBasedValueHolder<?>)valueHolder).setSourceObject(sourceObject);
             }
         }
     }
@@ -517,7 +517,7 @@
     public void mergeRemoteValueHolder(Object clientSideDomainObject, Object serverSideDomainObject, MergeManager mergeManager) {
         // This will always be a transparent with a remote.
         IndirectContainer serverContainer = (IndirectContainer)getMapping().getAttributeValueFromObject(serverSideDomainObject);
-        RemoteValueHolder serverValueHolder = (RemoteValueHolder)serverContainer.getValueHolder();
+        RemoteValueHolder<?> serverValueHolder = (RemoteValueHolder<?>)serverContainer.getValueHolder();
         mergeClientIntoServerValueHolder(serverValueHolder, mergeManager);
 
         getMapping().setAttributeValueInObject(clientSideDomainObject, serverContainer);
@@ -555,9 +555,9 @@
     @Override
     public boolean objectIsEasilyInstantiated(Object object) {
         if (object instanceof IndirectContainer) {
-            ValueHolderInterface valueHolder = ((IndirectContainer)object).getValueHolder();
+            ValueHolderInterface<?> valueHolder = ((IndirectContainer)object).getValueHolder();
             if (valueHolder instanceof DatabaseValueHolder) {
-                return ((DatabaseValueHolder)valueHolder).isEasilyInstantiated();
+                return ((DatabaseValueHolder<?>)valueHolder).isEasilyInstantiated();
             }
         }
         return true;
@@ -590,7 +590,7 @@
      * declared type [jdk1.1] or the container policy class implements
      * the declared interface [jdk1.2]).
      */
-    protected boolean typeIsValid(Class declaredType) {
+    protected boolean typeIsValid(Class<?> declaredType) {
         if (Helper.classIsSubclass(this.getContainerClass(), declaredType)) {
             return true;
         }
@@ -656,7 +656,7 @@
      * compatible with the one specified by the ContainerPolicy.
      */
     @Override
-    public void validateDeclaredAttributeType(Class attributeType, IntegrityChecker checker) throws DescriptorException {
+    public void validateDeclaredAttributeType(Class<?> attributeType, IntegrityChecker checker) throws DescriptorException {
         super.validateDeclaredAttributeType(attributeType, checker);
         if (!this.typeIsValid(attributeType)) {
             checker.handleError(DescriptorException.attributeAndMappingWithTransparentIndirectionMismatch(this.getMapping(), attributeType, this.validTypeName()));
@@ -672,7 +672,7 @@
      * compatible with the one specified by the ContainerPolicy.
      */
     @Override
-    public void validateGetMethodReturnType(Class returnType, IntegrityChecker checker) throws DescriptorException {
+    public void validateGetMethodReturnType(Class<?> returnType, IntegrityChecker checker) throws DescriptorException {
         super.validateGetMethodReturnType(returnType, checker);
         if (!this.typeIsValid(returnType)) {
             checker.handleError(DescriptorException.returnAndMappingWithTransparentIndirectionMismatch(this.getMapping(), returnType, this.validTypeName()));
@@ -688,7 +688,7 @@
      * compatible with the one specified by the ContainerPolicy.
      */
     @Override
-    public void validateSetMethodParameterType(Class parameterType, IntegrityChecker checker) throws DescriptorException {
+    public void validateSetMethodParameterType(Class<?> parameterType, IntegrityChecker checker) throws DescriptorException {
         super.validateSetMethodParameterType(parameterType, checker);
         if (!this.typeIsValid(parameterType)) {
             checker.handleError(DescriptorException.parameterAndMappingWithTransparentIndirectionMismatch(this.getMapping(), parameterType, this.validTypeName()));
@@ -711,7 +711,7 @@
      */
     @Override
     public Object valueFromBatchQuery(ReadQuery batchQuery, AbstractRecord row, ObjectLevelReadQuery originalQuery, CacheKey parentCacheKey) {
-        return this.buildIndirectContainer(new BatchValueHolder(batchQuery, row, getForeignReferenceMapping(), originalQuery, parentCacheKey));
+        return this.buildIndirectContainer(new BatchValueHolder<>(batchQuery, row, getForeignReferenceMapping(), originalQuery, parentCacheKey));
     }
 
     /**
@@ -734,7 +734,7 @@
      */
     @Override
     public Object valueFromQuery(ReadQuery query, AbstractRecord row, AbstractSession session) {
-        return this.buildIndirectContainer(new QueryBasedValueHolder(query, row, session));
+        return this.buildIndirectContainer(new QueryBasedValueHolder<>(query, row, session));
     }
 
     /**
@@ -745,7 +745,7 @@
      */
     @Override
     public Object valueFromQuery(ReadQuery query, AbstractRecord row, Object object, AbstractSession session) {
-        return this.buildIndirectContainer(new QueryBasedValueHolder(query, object, row, session));
+        return this.buildIndirectContainer(new QueryBasedValueHolder<>(query, object, row, session));
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkQueryValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkQueryValueHolder.java
index fd2c12f..e787efa 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkQueryValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkQueryValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -30,16 +30,16 @@
  *
  * @author    Sati
  */
-public class UnitOfWorkQueryValueHolder extends UnitOfWorkValueHolder {
+public class UnitOfWorkQueryValueHolder<T> extends UnitOfWorkValueHolder<T> {
     protected UnitOfWorkQueryValueHolder() {
         super();
     }
 
-    protected UnitOfWorkQueryValueHolder(ValueHolderInterface attributeValue, Object clone, DatabaseMapping mapping, UnitOfWorkImpl unitOfWork) {
+    protected UnitOfWorkQueryValueHolder(ValueHolderInterface<T> attributeValue, Object clone, DatabaseMapping mapping, UnitOfWorkImpl unitOfWork) {
         super(attributeValue, clone, mapping, unitOfWork);
     }
 
-    public UnitOfWorkQueryValueHolder(ValueHolderInterface attributeValue, Object clone, ForeignReferenceMapping mapping, AbstractRecord row, UnitOfWorkImpl unitOfWork) {
+    public UnitOfWorkQueryValueHolder(ValueHolderInterface<T> attributeValue, Object clone, ForeignReferenceMapping mapping, AbstractRecord row, UnitOfWorkImpl unitOfWork) {
         this(attributeValue, clone, mapping, unitOfWork);
         this.row = row;
     }
@@ -56,15 +56,16 @@
      * Clone the original attribute value.
      */
     @Override
-    public Object buildCloneFor(Object originalAttributeValue) {
+    @SuppressWarnings({"unchecked"})
+    public T buildCloneFor(Object originalAttributeValue) {
         Integer refreshCascade = null;
         if (wrappedValueHolder instanceof QueryBasedValueHolder){
-            refreshCascade = ((QueryBasedValueHolder)getWrappedValueHolder()).getRefreshCascadePolicy();
+            refreshCascade = ((QueryBasedValueHolder<?>)getWrappedValueHolder()).getRefreshCascadePolicy();
         }
-        Object clone = this.mapping.buildCloneForPartObject(originalAttributeValue, null, null, this.relationshipSourceObject, getUnitOfWork(), refreshCascade, true, true);
+        T clone = (T) this.mapping.buildCloneForPartObject(originalAttributeValue, null, null, this.relationshipSourceObject, getUnitOfWork(), refreshCascade, true, true);
         // Bug 414801
         if (wrappedValueHolder.isInstantiated() && refreshCascade != null) {
-            ((QueryBasedValueHolder)getWrappedValueHolder()).setRefreshCascadePolicy(null);
+            ((QueryBasedValueHolder<T>)getWrappedValueHolder()).setRefreshCascadePolicy(null);
         }
         return clone;
     }
@@ -73,12 +74,12 @@
      * Ensure that the backup value holder is populated.
      */
     @Override
-    public void setValue(Object theValue) {
+    public void setValue(T theValue) {
         // Must force instantiation to be able to compare with the old value.
         if (!this.isInstantiated) {
             instantiate();
         }
-        Object oldValue = getValue();
+        T oldValue = getValue();
         super.setValue(theValue);
         updateForeignReferenceSet(theValue, oldValue);
     }
@@ -116,7 +117,7 @@
                 }
                 // PERF: If the collection is not instantiated, then do not instantiated it.
                 if (partner.isCollectionMapping()) {
-                    if ((!(oldParent instanceof IndirectContainer)) || ((IndirectContainer)oldParent).isInstantiated()) {
+                    if ((!(oldParent instanceof IndirectContainer)) || ((IndirectContainer<?>)oldParent).isInstantiated()) {
                         if (!partner.getContainerPolicy().contains(sourceObject, oldParent, getSession())) {
                             // value has already been set
                             return;
@@ -142,7 +143,7 @@
      * We only worry about ObjectReferenceMappings as the collections mappings will be handled by transparentIndirection
      */
     public void updateForeignReferenceSet(Object value, Object oldValue) {
-        if ((value != null) && (value instanceof Collection)) {
+        if (value instanceof Collection) {
             //I'm passing a collection into the valueholder not an object
             return;
         }
@@ -166,7 +167,7 @@
                 }
                 // PERF: If the collection is not instantiated, then do not instantiated it.
                 if (partner.isCollectionMapping()) {
-                    if ((!(oldParent instanceof IndirectContainer)) || ((IndirectContainer)oldParent).isInstantiated()) {
+                    if ((!(oldParent instanceof IndirectContainer)) || ((IndirectContainer<?>)oldParent).isInstantiated()) {
                         if (partner.getContainerPolicy().contains(sourceObject, oldParent, getSession())) {
                             // value has already been set
                             return;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkTransformerValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkTransformerValueHolder.java
index bcb1fb9..0821d5b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkTransformerValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkTransformerValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -30,17 +30,17 @@
  *
  * @author    Sati
  */
-public class UnitOfWorkTransformerValueHolder extends UnitOfWorkValueHolder {
+public class UnitOfWorkTransformerValueHolder<T> extends UnitOfWorkValueHolder<T> {
     protected transient Object cloneOfObject;
     protected transient Object object;
 
-    public UnitOfWorkTransformerValueHolder(ValueHolderInterface attributeValue, Object original, Object clone, AbstractTransformationMapping mapping, UnitOfWorkImpl unitOfWork) {
+    public UnitOfWorkTransformerValueHolder(ValueHolderInterface<T> attributeValue, Object original, Object clone, AbstractTransformationMapping mapping, UnitOfWorkImpl unitOfWork) {
         this(attributeValue, clone, mapping, unitOfWork);
         this.object = original;
         this.cloneOfObject = clone;
     }
 
-    protected UnitOfWorkTransformerValueHolder(ValueHolderInterface attributeValue, Object clone, DatabaseMapping mapping, UnitOfWorkImpl unitOfWork) {
+    protected UnitOfWorkTransformerValueHolder(ValueHolderInterface<T> attributeValue, Object clone, DatabaseMapping mapping, UnitOfWorkImpl unitOfWork) {
         super(attributeValue, clone, mapping, unitOfWork);
     }
 
@@ -56,8 +56,9 @@
      * Clone the original attribute value.
      */
     @Override
-    public Object buildCloneFor(Object originalAttributeValue) {
-        return getMapping().buildCloneForPartObject(originalAttributeValue, getObject(), null, getCloneOfObject(), getUnitOfWork(), null, true, true);
+    @SuppressWarnings({"unchecked"})
+    public T buildCloneFor(Object originalAttributeValue) {
+        return (T) getMapping().buildCloneForPartObject(originalAttributeValue, getObject(), null, getCloneOfObject(), getUnitOfWork(), null, true, true);
     }
 
     protected Object getCloneOfObject() {
@@ -72,7 +73,7 @@
      * Ensure that the backup value holder is populated.
      */
     @Override
-    public void setValue(Object theValue) {
+    public void setValue(T theValue) {
         // Must force instantiation to be able to compare with the old value.
         if (!this.isInstantiated) {
             instantiate();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkValueHolder.java
index 1940648..05b3387 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/UnitOfWorkValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -34,16 +34,16 @@
  *
  * @author    Sati
  */
-public abstract class UnitOfWorkValueHolder extends DatabaseValueHolder implements WrappingValueHolder{
+public abstract class UnitOfWorkValueHolder<T> extends DatabaseValueHolder<T> implements WrappingValueHolder<T> {
 
     /** The value holder in the original object. */
-    protected transient ValueHolderInterface<?> wrappedValueHolder;
+    protected transient ValueHolderInterface<T> wrappedValueHolder;
 
     /** The mapping for the attribute. */
     protected transient DatabaseMapping mapping;
 
     /** The value holder stored in the backup copy, should not be transient. */
-    protected ValueHolderInterface<Object> backupValueHolder;
+    protected ValueHolderInterface<T> backupValueHolder;
 
     /** These cannot be transient because they are required for a remote unit of work.
     When the remote uow is serialized to the server to be committed, these
@@ -63,7 +63,7 @@
         super();
     }
 
-    protected UnitOfWorkValueHolder(ValueHolderInterface attributeValue, Object clone, DatabaseMapping mapping, UnitOfWorkImpl unitOfWork) {
+    protected UnitOfWorkValueHolder(ValueHolderInterface<T> attributeValue, Object clone, DatabaseMapping mapping, UnitOfWorkImpl unitOfWork) {
         this.wrappedValueHolder = attributeValue;
         this.mapping = mapping;
         this.session = unitOfWork;
@@ -72,7 +72,7 @@
 
         if (unitOfWork.isRemoteUnitOfWork()) {
             if (attributeValue instanceof RemoteValueHolder) {
-                this.wrappedValueHolderRemoteID = ((RemoteValueHolder)attributeValue).getID();
+                this.wrappedValueHolderRemoteID = ((RemoteValueHolder<T>)attributeValue).getID();
             }
             this.remoteUnitOfWork = unitOfWork;
             this.sourceObject = clone;
@@ -87,9 +87,9 @@
     /**
      * Clone the original attribute value.
      */
-    public abstract Object buildCloneFor(Object originalAttributeValue);
+    public abstract T buildCloneFor(Object originalAttributeValue);
 
-    protected ValueHolderInterface<Object> getBackupValueHolder() {
+    protected ValueHolderInterface<T> getBackupValueHolder() {
         return backupValueHolder;
     }
 
@@ -123,7 +123,8 @@
      * it needs to be instantiated, then we must find the original
      * object and get the appropriate attribute from it.
      */
-    protected Object getValueFromServerObject() {
+    @SuppressWarnings({"unchecked"})
+    protected T getValueFromServerObject() {
         setSession(getRemoteUnitOfWork());
         Object primaryKey = getSession().getId(getSourceObject());
         Object originalObject = getUnitOfWork().getParent().getIdentityMapAccessor().getFromIdentityMap(primaryKey, getSourceObject().getClass());
@@ -133,7 +134,7 @@
         ClassDescriptor descriptor = getSession().getDescriptor(originalObject);
         DatabaseMapping mapping = descriptor.getObjectBuilder().getMappingForAttributeName(getSourceAttributeName());
         setMapping(mapping);
-        return getMapping().getRealAttributeValueFromObject(originalObject, getSession());
+        return (T) getMapping().getRealAttributeValueFromObject(originalObject, getSession());
     }
 
     /**
@@ -141,13 +142,13 @@
      * The old name is no longer correct, as query based valueholders are now
      * sometimes triggered directly without triggering the underlying valueholder.
      */
-    protected Object instantiateImpl() {
+    protected T instantiateImpl() {
         Object value;
         // Bug 3835202 - Ensure access to valueholders is thread safe.  Several of the methods
         // called below are not threadsafe alone.
         synchronized (this.wrappedValueHolder) {
             if (this.wrappedValueHolder instanceof DatabaseValueHolder) {
-                DatabaseValueHolder wrapped = (DatabaseValueHolder)this.wrappedValueHolder;
+                DatabaseValueHolder<T> wrapped = (DatabaseValueHolder<T>)this.wrappedValueHolder;
                 UnitOfWorkImpl unitOfWork = getUnitOfWork();
                 if (!wrapped.isEasilyInstantiated()) {
                     if (wrapped.isPessimisticLockingValueHolder()) {
@@ -166,7 +167,7 @@
                 if (!wrapped.isInstantiated()){
                     //if not instantiated then try and load the UOW versions to prevent the whole loading from the cache and cloning
                     //process
-                    Object result = wrapped.getValue((UnitOfWorkImpl) this.session);
+                    T result = wrapped.getValue((UnitOfWorkImpl) this.session);
                     if (result != null){
                         return result;
                     }
@@ -204,7 +205,7 @@
     }
 
     @Override
-    public ValueHolderInterface<?> getWrappedValueHolder() {
+    public ValueHolderInterface<T> getWrappedValueHolder() {
         return wrappedValueHolder;
     }
 
@@ -229,9 +230,10 @@
      * if necessary, and clone it.
      */
     @Override
-    protected Object instantiate() {
-        Object originalAttributeValue;
-        Object cloneAttributeValue;
+    @SuppressWarnings({"unchecked"})
+    protected T instantiate() {
+        T originalAttributeValue;
+        T cloneAttributeValue;
         if (isSerializedRemoteUnitOfWorkValueHolder()) {
             originalAttributeValue = getValueFromServerObject();
             cloneAttributeValue = buildCloneFor(originalAttributeValue);
@@ -245,7 +247,7 @@
         // Set the value in the backup clone also.
         // In some cases we may want to force instantiation before the backup is built
         if (this.backupValueHolder != null) {
-            this.backupValueHolder.setValue(buildBackupCloneFor(cloneAttributeValue));
+            this.backupValueHolder.setValue((T)buildBackupCloneFor(cloneAttributeValue));
         }
         return cloneAttributeValue;
     }
@@ -261,7 +263,7 @@
      * and the query.
      */
     @Override
-    public Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder) {
+    public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder) {
         // This abstract method needs to be implemented but is not meaningful for
         // this subclass.
         return instantiate();
@@ -290,7 +292,7 @@
         //do nothing.  nothing should be reset to null;
     }
 
-    public void setBackupValueHolder(ValueHolderInterface backupValueHolder) {
+    public void setBackupValueHolder(ValueHolderInterface<T> backupValueHolder) {
         this.backupValueHolder = backupValueHolder;
     }
 
@@ -314,7 +316,7 @@
         this.relationshipSourceObject = relationshipSourceObject;
     }
 
-    protected void setWrappedValueHolder(DatabaseValueHolder valueHolder) {
+    protected void setWrappedValueHolder(DatabaseValueHolder<T> valueHolder) {
         wrappedValueHolder = valueHolder;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/WeavedObjectBasicIndirectionPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/WeavedObjectBasicIndirectionPolicy.java
index 0166754..1cdc10c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/WeavedObjectBasicIndirectionPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/WeavedObjectBasicIndirectionPolicy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -93,7 +93,7 @@
         if (setMethod == null) {
             ForeignReferenceMapping sourceMapping = (ForeignReferenceMapping)mapping;
             // The parameter type for the set method must always be the return type of the get method.
-            Class[] parameterTypes = new Class[1];
+            Class<?>[] parameterTypes = new Class<?>[1];
             parameterTypes[0] = sourceMapping.getReferenceClass();
 
             try {
@@ -111,7 +111,7 @@
                 }
                 try {
                     // Get the set method type from the get method.
-                    Method getMethod = Helper.getDeclaredMethod(sourceMapping.getDescriptor().getJavaClass(), getGetMethodName(), new Class[0]);
+                    Method getMethod = Helper.getDeclaredMethod(sourceMapping.getDescriptor().getJavaClass(), getGetMethodName(), new Class<?>[0]);
                     parameterTypes[0] = getMethod.getReturnType();
                     setMethod = Helper.getDeclaredMethod(sourceMapping.getDescriptor().getJavaClass(), setMethodName, parameterTypes);
                 } catch (NoSuchMethodException e2) {
@@ -175,7 +175,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
-                    AccessController.doPrivileged(new PrivilegedMethodInvoker(getSetMethod(), target, parameters));
+                    AccessController.doPrivileged(new PrivilegedMethodInvoker<>(getSetMethod(), target, parameters));
                 } catch (PrivilegedActionException exception) {
                     Exception throwableException = exception.getException();
                     if (throwableException instanceof IllegalAccessException) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/WrappingValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/WrappingValueHolder.java
index afe228c..5cc8a46 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/WrappingValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/indirection/WrappingValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2019 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
@@ -24,12 +24,12 @@
  * @see ProtectedValueHolder
  * @author    Gordon Yorke
  */
-public interface WrappingValueHolder {
+public interface WrappingValueHolder<T> {
 
     /**
      * Returns the valueholder that is wrapped by this ValueHolder
      */
-    ValueHolderInterface<?> getWrappedValueHolder();
+    ValueHolderInterface<T> getWrappedValueHolder();
 
 
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/accessor/OrmAttributeAccessor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/accessor/OrmAttributeAccessor.java
index 54c0b48..f834b01 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/accessor/OrmAttributeAccessor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/accessor/OrmAttributeAccessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -61,12 +61,12 @@
     @Override
     public Object getAttributeValueFromObject(Object object) {
         if(isValueHolderProperty) {
-            ValueHolderInterface vh = (ValueHolderInterface)ormAccessor.getAttributeValueFromObject(object);
+            ValueHolderInterface<?> vh = (ValueHolderInterface<?>)ormAccessor.getAttributeValueFromObject(object);
             if(vh != null && !vh.isInstantiated()) {
                 Object value = vh.getValue();
                 oxmAccessor.setAttributeValueInObject(object, value);
                 if(vh instanceof WeavedAttributeValueHolderInterface) {
-                    ((WeavedAttributeValueHolderInterface)vh).setIsCoordinatedWithProperty(true);
+                    ((WeavedAttributeValueHolderInterface<?>)vh).setIsCoordinatedWithProperty(true);
                 }
             }
         }
@@ -83,10 +83,11 @@
             }
         }
         if(isValueHolderProperty) {
-            ValueHolderInterface vh = (ValueHolderInterface)ormAccessor.getAttributeValueFromObject(object);
+            @SuppressWarnings({"unchecked"})
+            ValueHolderInterface<Object> vh = (ValueHolderInterface<Object>)ormAccessor.getAttributeValueFromObject(object);
             if(vh == null) {
-                vh = new ValueHolder();
-                ((ValueHolder)vh).setIsNewlyWeavedValueHolder(true);
+                vh = new ValueHolder<>();
+                ((ValueHolder<?>)vh).setIsNewlyWeavedValueHolder(true);
             }
             vh.setValue(value);
             ormAccessor.setAttributeValueInObject(object, vh);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/mappings/Field.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/mappings/Field.java
index cb6d789..5907698 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/mappings/Field.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/mappings/Field.java
@@ -71,7 +71,7 @@
       */
      QName getSchemaTypeForValue(Object value, CoreAbstractSession session);
 
-     @Override Class getType();
+     @Override Class<?> getType();
 
      /**
       * Return the qualified XML Schema type for a given class
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ArrayListContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ArrayListContainerPolicy.java
index 3ccc1ed..3ffa452 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ArrayListContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ArrayListContainerPolicy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -62,7 +62,7 @@
         }
 
         // Could potentially be another Collection type as well.
-        return new ArrayList((Collection) container);
+        return new ArrayList<>((Collection) container);
     }
 
     /**
@@ -71,7 +71,7 @@
      */
     @Override
     public Object buildContainerFromVector(Vector vector, AbstractSession session) {
-        return new ArrayList(vector);
+        return new ArrayList<>(vector);
     }
 
     /**
@@ -80,7 +80,7 @@
      */
     @Override
     public Object containerInstance() {
-        return new ArrayList();
+        return new ArrayList<>();
     }
 
     /**
@@ -89,6 +89,6 @@
      */
     @Override
     public Object containerInstance(int initialCapacity) {
-        return new ArrayList(initialCapacity);
+        return new ArrayList<>(initialCapacity);
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/VectorContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/VectorContainerPolicy.java
index b539ee1..e0ab8d0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/VectorContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/VectorContainerPolicy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -62,7 +62,7 @@
         }
 
         // Could potentially be another Collection type as well.
-        return new Vector((Collection) container);
+        return new Vector<>((Collection) container);
     }
 
     /**
@@ -80,7 +80,7 @@
      */
     @Override
     public Object containerInstance() {
-        return new Vector();
+        return new Vector<>();
     }
 
     /**
@@ -89,6 +89,6 @@
      */
     @Override
     public Object containerInstance(int initialCapacity) {
-        return new Vector(initialCapacity);
+        return new Vector<>(initialCapacity);
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/AbstractSession.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/AbstractSession.java
index 29b0126..cd0ec69 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/AbstractSession.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/AbstractSession.java
@@ -1167,12 +1167,12 @@
         return getDefaultReadOnlyClasses();
     }
 
-    public DatabaseValueHolder createCloneQueryValueHolder(ValueHolderInterface attributeValue, Object clone, AbstractRecord row, ForeignReferenceMapping mapping) {
-        return new ProtectedValueHolder(attributeValue, mapping, this);
+    public <T> DatabaseValueHolder<T> createCloneQueryValueHolder(ValueHolderInterface<T> attributeValue, Object clone, AbstractRecord row, ForeignReferenceMapping mapping) {
+        return new ProtectedValueHolder<>(attributeValue, mapping, this);
     }
 
-    public DatabaseValueHolder createCloneTransformationValueHolder(ValueHolderInterface attributeValue, Object original, Object clone, AbstractTransformationMapping mapping) {
-        return new ProtectedValueHolder(attributeValue, mapping, this);
+    public <T> DatabaseValueHolder<T> createCloneTransformationValueHolder(ValueHolderInterface<T> attributeValue, Object original, Object clone, AbstractTransformationMapping mapping) {
+        return new ProtectedValueHolder<>(attributeValue, mapping, this);
     }
 
     public <T> InjectionManager<T> createInjectionManager(Object beanManager){
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/MergeManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/MergeManager.java
index 88ff26d..9f4688f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/MergeManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/MergeManager.java
@@ -60,13 +60,13 @@
     protected AbstractSession session;
 
     /** Used only while refreshing objects on remote session */
-    protected Map objectDescriptors;
+    protected Map<Object, ObjectDescriptor> objectDescriptors;
 
     /** Used to unravel recursion. */
     protected Map<AbstractSession, Map<Object, Object>> objectsAlreadyMerged;
 
     /** Used to keep track of merged new objects. */
-    protected IdentityHashMap mergedNewObjects;
+    protected IdentityHashMap<Object, Object> mergedNewObjects;
 
     /** Used to store the list of locks that this merge manager has acquired for this merge */
     protected ArrayList<CacheKey> acquiredLocks;
@@ -115,8 +115,8 @@
 
     public MergeManager(AbstractSession session) {
         this.session = session;
-        this.mergedNewObjects = new IdentityHashMap();
-        this.objectsAlreadyMerged = new IdentityHashMap();
+        this.mergedNewObjects = new IdentityHashMap<>();
+        this.objectsAlreadyMerged = new IdentityHashMap<>();
         this.cascadePolicy = CASCADE_ALL_PARTS;
         this.mergePolicy = WORKING_COPY_INTO_ORIGINAL;
         this.acquiredLocks = new ArrayList<>();
@@ -155,14 +155,14 @@
         return mergePolicy;
     }
 
-    public Map getObjectDescriptors() {
+    public Map<Object, ObjectDescriptor> getObjectDescriptors() {
         if (this.objectDescriptors == null) {
-            this.objectDescriptors = new IdentityHashMap();
+            this.objectDescriptors = new IdentityHashMap<>();
         }
         return this.objectDescriptors;
     }
 
-    public Map getObjectsAlreadyMerged() {
+    public Map<AbstractSession, Map<Object, Object>> getObjectsAlreadyMerged() {
         return objectsAlreadyMerged;
     }
 
@@ -338,7 +338,7 @@
     public void recordMerge(Object key, Object value, AbstractSession targetSession) {
         Map<Object, Object> sessionMap = this.objectsAlreadyMerged.get(targetSession);
         if (sessionMap == null){
-            sessionMap = new IdentityHashMap();
+            sessionMap = new IdentityHashMap<>();
             this.objectsAlreadyMerged.put(targetSession, sessionMap);
         }
         sessionMap.put(key, value);
@@ -371,7 +371,7 @@
         Object clientSideDomainObject = this.session.getIdentityMapAccessorInstance().getFromIdentityMap(primaryKey, serverSideDomainObject.getClass(), descriptor);
         if (clientSideDomainObject == null) {
             //the referenced object came back as null from the cache.
-            ObjectDescriptor objectDescriptor = (ObjectDescriptor)getObjectDescriptors().get(serverSideDomainObject);
+            ObjectDescriptor objectDescriptor = getObjectDescriptors().get(serverSideDomainObject);
             if (objectDescriptor == null){
                 //the object must have been added concurently before serialize generate a new ObjectDescriptor on this side
                 objectDescriptor = new ObjectDescriptor();
@@ -394,7 +394,7 @@
             // merge into the clientSideDomainObject from the serverSideDomainObject;
             // use clientSideDomainObject as the backup, as anything different should be merged
             descriptor.getObjectBuilder().mergeIntoObject(clientSideDomainObject, false, serverSideDomainObject, this, getSession());
-            ObjectDescriptor objectDescriptor = (ObjectDescriptor)getObjectDescriptors().get(serverSideDomainObject);
+            ObjectDescriptor objectDescriptor = getObjectDescriptors().get(serverSideDomainObject);
             if (objectDescriptor == null){
                 //the object must have been added concurently before serialize generate a new ObjectDescriptor on this side
                 objectDescriptor = new ObjectDescriptor();
@@ -436,7 +436,7 @@
             // Iterate over each clone and let the object build merge to clones into the originals.
             this.session.getIdentityMapAccessorInstance().getWriteLockManager().acquireRequiredLocks(this, uowChangeSet);
             Iterator<ObjectChangeSet> objectChangeEnum = uowChangeSet.getAllChangeSets().keySet().iterator();
-            Set<Class> classesChanged = new HashSet<>();
+            Set<Class<?>> classesChanged = new HashSet<>();
             while (objectChangeEnum.hasNext()) {
                 ObjectChangeSet objectChangeSet = objectChangeEnum.next();
                 // Don't read the object here.  If it is null then we won't merge it at this stage, unless it
@@ -462,7 +462,7 @@
                 }
             }
             // Clear the query cache as well.
-            for (Class changedClass : classesChanged) {
+            for (Class<?> changedClass : classesChanged) {
                 this.session.getIdentityMapAccessorInstance().invalidateQueryCache(changedClass);
             }
         } catch (RuntimeException exception) {
@@ -486,7 +486,7 @@
 
         // Determine if the object needs to be registered in the parent's clone mapping,
         // This is required for registered new objects in a nested unit of work.
-        Class localClassType = changeSet.getClassType(session);
+        Class<?> localClassType = changeSet.getClassType(session);
         ClassDescriptor descriptor = session.getDescriptor(localClassType);
 
         // Perform invalidation of a cached object (when set on the ChangeSet) to avoid refreshing or merging
@@ -1003,7 +1003,7 @@
      * The newly merged object will then be added to the cache.
      */
     public Object mergeNewObjectIntoCache(ObjectChangeSet changeSet) {
-        Class localClassType = changeSet.getClassType(session);
+        Class<?> localClassType = changeSet.getClassType(session);
         ClassDescriptor descriptor = this.session.getDescriptor(localClassType);
 
         Object newObject = null;
@@ -1158,11 +1158,11 @@
         this.forceCascade = forceCascade;
     }
 
-    public void setObjectDescriptors(Map objectDescriptors) {
+    public void setObjectDescriptors(Map<Object, ObjectDescriptor> objectDescriptors) {
         this.objectDescriptors = objectDescriptors;
     }
 
-    protected void setObjectsAlreadyMerged(Map objectsAlreadyMerged) {
+    protected void setObjectsAlreadyMerged(Map<AbstractSession, Map<Object, Object>> objectsAlreadyMerged) {
         this.objectsAlreadyMerged = objectsAlreadyMerged;
     }
 
@@ -1290,7 +1290,7 @@
      * registerObjectForMergeCloneIntoWorkingCopy method.
      * @return Map
      */
-    public IdentityHashMap getMergedNewObjects(){
+    public IdentityHashMap<Object, Object> getMergedNewObjects(){
         return mergedNewObjects;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java
index 7d5da5c..6e25b93 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkImpl.java
@@ -6155,13 +6155,13 @@
     }
 
     @Override
-    public DatabaseValueHolder createCloneQueryValueHolder(ValueHolderInterface attributeValue, Object clone, AbstractRecord row, ForeignReferenceMapping mapping) {
-        return new UnitOfWorkQueryValueHolder(attributeValue, clone, mapping, row, this);
+    public <T> DatabaseValueHolder<T> createCloneQueryValueHolder(ValueHolderInterface<T> attributeValue, Object clone, AbstractRecord row, ForeignReferenceMapping mapping) {
+        return new UnitOfWorkQueryValueHolder<>(attributeValue, clone, mapping, row, this);
     }
 
     @Override
-    public DatabaseValueHolder createCloneTransformationValueHolder(ValueHolderInterface attributeValue, Object original, Object clone, AbstractTransformationMapping mapping) {
-        return new UnitOfWorkTransformerValueHolder(attributeValue, original, clone, mapping, this);
+    public <T> DatabaseValueHolder<T> createCloneTransformationValueHolder(ValueHolderInterface<T> attributeValue, Object original, Object clone, AbstractTransformationMapping mapping) {
+        return new UnitOfWorkTransformerValueHolder<>(attributeValue, original, clone, mapping, this);
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/RemoteValueHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/RemoteValueHolder.java
index 1d46d0c..5a4e26e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/RemoteValueHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/RemoteValueHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -28,7 +28,7 @@
  * Remote value holders can be invoked locally and remotely.
  * In both situations the associated indirect object is invoked.
  */
-public class RemoteValueHolder extends DatabaseValueHolder implements Externalizable {
+public class RemoteValueHolder<T> extends DatabaseValueHolder<T> implements Externalizable {
     // This is a unique id for remote value holder.
     protected ObjID id;
 
@@ -38,7 +38,7 @@
     protected transient ObjectLevelReadQuery query;
 
     // The server side original value holder.
-    protected transient ValueHolderInterface<Object> wrappedServerValueHolder;
+    protected transient ValueHolderInterface<T> wrappedServerValueHolder;
 
     // point back to the object holding the remote value holder;
     // for the moment, used only by TransparentIndirection
@@ -74,7 +74,7 @@
             return false;
         }
 
-        return getID().equals(((RemoteValueHolder)object).getID());
+        return getID().equals(((RemoteValueHolder<?>)object).getID());
     }
 
     /**
@@ -149,7 +149,7 @@
      * This is how we know whether the remote value holder is
      * being invoked on the client or on the server.
      */
-    public ValueHolderInterface<Object> getWrappedServerValueHolder() {
+    public ValueHolderInterface<T> getWrappedServerValueHolder() {
         return wrappedServerValueHolder;
     }
 
@@ -165,20 +165,21 @@
      * Return the object.
      */
     @Override
-    public synchronized Object instantiate() {
-        Object valueOfServerValueHolder = null;
+    @SuppressWarnings({"unchecked"})
+    public synchronized T instantiate() {
+        T valueOfServerValueHolder = null;
 
         if (getWrappedServerValueHolder() != null) {// server invocation
             valueOfServerValueHolder = getWrappedServerValueHolder().getValue();
         } else {// client invocation
             // check whether object exists on the client
             if (canDoCacheCheck()) {
-                valueOfServerValueHolder = getObjectFromCache();
+                valueOfServerValueHolder = (T) getObjectFromCache();
             }
 
             // does not exist on the client - so invoke the value holder on the server
             if (valueOfServerValueHolder == null) {
-                valueOfServerValueHolder = ((DistributedSession)getSession()).instantiateRemoteValueHolderOnServer(this);
+                valueOfServerValueHolder = (T) ((DistributedSession)getSession()).instantiateRemoteValueHolderOnServer(this);
             }
         }
         return valueOfServerValueHolder;
@@ -193,7 +194,7 @@
     public boolean isEasilyInstantiated() {
         // Nothing is easily instantiated when on the client side.
         return this.isInstantiated || ((this.wrappedServerValueHolder != null)
-                && (!(this.wrappedServerValueHolder instanceof DatabaseValueHolder) || ((DatabaseValueHolder)this.wrappedServerValueHolder).isEasilyInstantiated()));
+                && (!(this.wrappedServerValueHolder instanceof DatabaseValueHolder) || ((DatabaseValueHolder<T>)this.wrappedServerValueHolder).isEasilyInstantiated()));
     }
 
     /**
@@ -210,7 +211,7 @@
         // This abstract method needs to be implemented but is not meaningfull for
         // this subclass.
         if (getWrappedServerValueHolder() != null) {
-            return ((getWrappedServerValueHolder() instanceof DatabaseValueHolder) && ((DatabaseValueHolder)getWrappedServerValueHolder()).isPessimisticLockingValueHolder());
+            return ((getWrappedServerValueHolder() instanceof DatabaseValueHolder) && ((DatabaseValueHolder<T>)getWrappedServerValueHolder()).isPessimisticLockingValueHolder());
         } else {
             // Pessimistic locking may not be supported on remote sessions, but if
             // it is make every attempt to do the right thing.
@@ -230,9 +231,9 @@
      * Note: This method is not thread-safe.  It must be used in a synchronizaed manner
      */
     @Override
-    public Object instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder unitOfWorkValueHolder) {
+    public T instantiateForUnitOfWorkValueHolder(UnitOfWorkValueHolder<T> unitOfWorkValueHolder) {
         if ((getWrappedServerValueHolder() != null) && (getWrappedServerValueHolder() instanceof DatabaseValueHolder)) {
-            DatabaseValueHolder wrapped = (DatabaseValueHolder)getWrappedServerValueHolder();
+            DatabaseValueHolder<T> wrapped = (DatabaseValueHolder<T>)getWrappedServerValueHolder();
             return wrapped.instantiateForUnitOfWorkValueHolder(unitOfWorkValueHolder);
         }
 
@@ -296,7 +297,7 @@
      * Set the object.
      */
     @Override
-    public void setValue(Object theValue) {
+    public void setValue(T theValue) {
         super.setValue(theValue);
         if (getWrappedServerValueHolder() != null) {
             // This is a local setting of remote value holder
@@ -308,7 +309,7 @@
     /**
      * Set the original value holder.
      */
-    public void setWrappedServerValueHolder(ValueHolderInterface wrappedServerValueHolder) {
+    public void setWrappedServerValueHolder(ValueHolderInterface<T> wrappedServerValueHolder) {
         this.wrappedServerValueHolder = wrappedServerValueHolder;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/Transporter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/Transporter.java
index ae6400c..c04f69e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/Transporter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/Transporter.java
@@ -33,7 +33,7 @@
     public boolean wasOperationSuccessful;
 
     // Changed to public to allow access to TransporterHolder and TransporterHepler in org.eclipse.persistence.sessions.remote.corba.orbix.
-    protected Map objectDescriptors;
+    protected Map<Object, ObjectDescriptor> objectDescriptors;
     protected DatabaseQuery query;
 
     public Transporter() {
@@ -85,7 +85,7 @@
     /**
      * Returns a hashtable of object descriptors.
      */
-    public Map getObjectDescriptors() {
+    public Map<Object, ObjectDescriptor> getObjectDescriptors() {
         return objectDescriptors;
     }
 
@@ -115,7 +115,7 @@
     /**
      * Get object to object descriptor
      */
-    public void setObjectDescriptors(Map objectDescriptors) {
+    public void setObjectDescriptors(Map<Object, ObjectDescriptor> objectDescriptors) {
         this.objectDescriptors = objectDescriptors;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateCollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateCollectionMapping.java
index 15be2c5..0f19c14 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateCollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateCollectionMapping.java
@@ -2203,7 +2203,7 @@
     @Override
     public void mergeChangesIntoObject(Object target, ChangeRecord changeRecord, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation() && !this.isCacheable && !targetSession.isProtectedSession()) {
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         //Check to see if the target has an instantiated collection
@@ -2264,7 +2264,7 @@
     @Override
     public void mergeIntoObject(Object target, boolean isTargetUnInitialized, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation() && !this.isCacheable && !targetSession.isProtectedSession()) {
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         if (isTargetUnInitialized) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateMapping.java
index a49176b..a526f10 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateMapping.java
@@ -41,6 +41,7 @@
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.internal.security.PrivilegedClassForName;
 import org.eclipse.persistence.internal.sessions.*;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.queries.*;
 import org.eclipse.persistence.sessions.remote.*;
 import org.eclipse.persistence.sessions.CopyGroup;
@@ -409,7 +410,7 @@
      * Replace the transient attributes of the remote value holders
      * with client-side objects.
      */
-    protected void fixAttributeValue(Object attributeValue, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    protected void fixAttributeValue(Object attributeValue, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         if (attributeValue == null) {
             return;
         }
@@ -423,7 +424,7 @@
      * with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         Object attributeValue = getAttributeValueFromObject(object);
         fixAttributeValue(attributeValue, objectDescriptors, processedObjects, query, session);
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/CollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/CollectionMapping.java
index cc50897..dd540db 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/CollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/CollectionMapping.java
@@ -1046,7 +1046,7 @@
      * the corresponding object(s) from the remote session.
      */
     @Override
-    public void fixRealObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixRealObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         //bug 4147755 getRealAttribute... / setReal
         Object attributeValue = getRealAttributeValueFromObject(object, session);
 
@@ -1106,7 +1106,7 @@
      * maintaining object identity.
      */
     @Override
-    public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query) {
+    public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query) {
         return session.getObjectsCorrespondingToAll(object, objectDescriptors, processedObjects, query, this.containerPolicy);
     }
 
@@ -1458,7 +1458,7 @@
     @Override
     public void mergeChangesIntoObject(Object target, ChangeRecord chgRecord, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation()&& !this.isCacheable && !targetSession.isProtectedSession()){
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         Object valueOfTarget = null;
@@ -1523,7 +1523,7 @@
     @Override
     public void mergeIntoObject(Object target, boolean isTargetUnInitialized, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation() && !this.isCacheable && !targetSession.isProtectedSession()){
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         if (isTargetUnInitialized) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DatabaseMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DatabaseMapping.java
index 50a3773..0af1fe4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DatabaseMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DatabaseMapping.java
@@ -73,6 +73,7 @@
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.internal.sessions.remote.RemoteSessionController;
 import org.eclipse.persistence.internal.sessions.remote.RemoteValueHolder;
 import org.eclipse.persistence.mappings.converters.Converter;
@@ -588,7 +589,7 @@
      * @param classLoader TODO
      */
     protected void convertConverterClassNamesToClasses(Converter converter, ClassLoader classLoader) {
-        if (converter != null && converter instanceof ClassNameConversionRequired) {
+        if (converter instanceof ClassNameConversionRequired) {
             ((ClassNameConversionRequired)converter).convertClassNamesToClasses(classLoader);
         }
     }
@@ -607,7 +608,7 @@
      * the shared cache, and then cloning the original.
      * @return TODO
      */
-    public DatabaseValueHolder createCloneValueHolder(ValueHolderInterface attributeValue, Object original, Object clone, AbstractRecord row, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
+    public <T> DatabaseValueHolder<T> createCloneValueHolder(ValueHolderInterface<T> attributeValue, Object original, Object clone, AbstractRecord row, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
         throw DescriptorException.invalidMappingOperation(this, "createUnitOfWorkValueHolder");
     }
 
@@ -641,7 +642,7 @@
      * @return TODO
      */
     protected List<Expression> extractNestedExpressions(List<Expression> expressions, ExpressionBuilder newRoot) {
-        List<Expression> nestedExpressions = new ArrayList(expressions.size());
+        List<Expression> nestedExpressions = new ArrayList<>(expressions.size());
 
         /*
          * If the expression closest to to the Builder is for this mapping, that expression is rebuilt using
@@ -685,7 +686,7 @@
      * @return TODO
      */
     protected List<Expression> extractNestedNonAggregateExpressions(List<Expression> expressions, ExpressionBuilder newRoot, boolean rootExpressionsAllowed) {
-        List<Expression> nestedExpressions = new ArrayList(expressions.size());
+        List<Expression> nestedExpressions = new ArrayList<>(expressions.size());
 
         /*
          * need to work on all expressions with at least 2 nestings off the base expression builder, excluding
@@ -777,7 +778,7 @@
      * @param query TODO
      * @param session TODO
      */
-    public abstract void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session);
+    public abstract void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session);
 
     /**
      * INTERNAL:
@@ -792,7 +793,7 @@
      * @param query TODO
      * @param session TODO
      */
-    public void fixRealObjectReferences(Object object, Map objectInformation, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixRealObjectReferences(Object object, Map<Object, ObjectDescriptor> objectInformation, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         // do nothing
     }
 
@@ -996,7 +997,7 @@
      * @param query TODO
      * @return TODO
      */
-    public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query) {
+    public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query) {
         return object;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DirectCollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DirectCollectionMapping.java
index 0f3a177..3e6ff18 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DirectCollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DirectCollectionMapping.java
@@ -91,6 +91,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.internal.sessions.remote.RemoteSessionController;
 import org.eclipse.persistence.mappings.converters.Converter;
 import org.eclipse.persistence.mappings.converters.ObjectTypeConverter;
@@ -1146,7 +1147,7 @@
      * are primitives, so they do not need to be replaced.
      */
     @Override
-    public void fixRealObjectReferences(Object object, Map objectInformation, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixRealObjectReferences(Object object, Map<Object, ObjectDescriptor> objectInformation, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         // do nothing
     }
 
@@ -1282,7 +1283,7 @@
      * maintaining object identity.
      */
     @Override
-    public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query) {
+    public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query) {
         return object;
     }
 
@@ -1973,7 +1974,7 @@
     @Override
     public void mergeChangesIntoObject(Object target, ChangeRecord changeRecord, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation()&& !this.isCacheable && !targetSession.isProtectedSession()){
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         ContainerPolicy containerPolicy = getContainerPolicy();
@@ -2104,7 +2105,7 @@
     @Override
     public void mergeIntoObject(Object target, boolean isTargetUnInitialized, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation() && !this.isCacheable && !targetSession.isProtectedSession()){
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         if (isTargetUnInitialized) {
@@ -3195,7 +3196,7 @@
                 }
                 return result;
             } else if (!this.isCacheable && !isTargetProtected && cacheKey != null) {
-                return this.indirectionPolicy.buildIndirectObject(new ValueHolder(null));
+                return this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null));
             }
         }
         if (row.hasSopObject()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DirectMapMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DirectMapMapping.java
index 8fad0ff..fea4c8e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DirectMapMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/DirectMapMapping.java
@@ -518,7 +518,7 @@
     @Override
     public void mergeChangesIntoObject(Object target, ChangeRecord changeRecord, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation()&& !this.isCacheable && !targetSession.isProtectedSession()){
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         Map valueOfTarget = null;
@@ -585,7 +585,7 @@
     @Override
     public void mergeIntoObject(Object target, boolean isTargetUnInitialized, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation()&& !this.isCacheable && !targetSession.isProtectedSession()){
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         if (isTargetUnInitialized) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ForeignReferenceMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ForeignReferenceMapping.java
index afc1cc3..fed4f9a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ForeignReferenceMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ForeignReferenceMapping.java
@@ -78,6 +78,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.internal.sessions.remote.RemoteSessionController;
 import org.eclipse.persistence.internal.sessions.remote.RemoteValueHolder;
 import org.eclipse.persistence.logging.SessionLog;
@@ -448,10 +449,9 @@
      * Ignore the original object.
      * @param buildDirectlyFromRow indicates that we are building the clone directly
      * from a row as opposed to building the original from the row, putting it in
-     * the shared cache, and then cloning the original.
      */
     @Override
-    public DatabaseValueHolder createCloneValueHolder(ValueHolderInterface attributeValue, Object original, Object clone, AbstractRecord row, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
+    public <T> DatabaseValueHolder<T> createCloneValueHolder(ValueHolderInterface<T> attributeValue, Object original, Object clone, AbstractRecord row, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
         return cloningSession.createCloneQueryValueHolder(attributeValue, clone, row, this);
     }
 
@@ -997,7 +997,7 @@
      * with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         this.indirectionPolicy.fixObjectReferences(object, objectDescriptors, processedObjects, query, session);
     }
 
@@ -1087,7 +1087,7 @@
      * maintaining object identity.
      */
     @Override
-    public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query) {
+    public Object getObjectCorrespondingTo(Object object, DistributedSession session, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query) {
         return session.getObjectCorrespondingTo(object, objectDescriptors, processedObjects, query);
     }
 
@@ -2157,7 +2157,7 @@
                     return getAttributeValueFromObject(cached);
                 }
             } else if (!this.isCacheable && !isTargetProtected && cacheKey != null) {
-                return this.indirectionPolicy.buildIndirectObject(new ValueHolder(null));
+                return this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null));
             }
         }
         if (row.hasSopObject()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ObjectReferenceMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ObjectReferenceMapping.java
index 005ef2c..2ace71d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ObjectReferenceMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ObjectReferenceMapping.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -46,6 +46,7 @@
 import org.eclipse.persistence.internal.sessions.ObjectReferenceChangeRecord;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.queries.DeleteObjectQuery;
 import org.eclipse.persistence.queries.InsertObjectQuery;
 import org.eclipse.persistence.queries.ObjectBuildingQuery;
@@ -320,7 +321,7 @@
      * reference object.
      */
     @Override
-    public void fixRealObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixRealObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         //bug 4147755 getRealAttribute... / setReal...
         Object attributeValue = getRealAttributeValueFromObject(object, session);
         attributeValue = getReferenceDescriptor().getObjectBuilder().unwrapObject(attributeValue, session);
@@ -397,7 +398,7 @@
     @Override
     public void mergeChangesIntoObject(Object target, ChangeRecord changeRecord, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation()&& !this.isCacheable && !targetSession.isProtectedSession()){
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         Object targetValueOfSource = null;
@@ -467,7 +468,7 @@
     @Override
     public void mergeIntoObject(Object target, boolean isTargetUnInitialized, Object source, MergeManager mergeManager, AbstractSession targetSession) {
         if (this.descriptor.getCachePolicy().isProtectedIsolation()&& !this.isCacheable && !targetSession.isProtectedSession()){
-            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder(null)));
+            setAttributeValueInObject(target, this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null)));
             return;
         }
         if (isTargetUnInitialized) {
@@ -1037,8 +1038,8 @@
      * the shared cache, and then cloning the original.
      */
     @Override
-    public DatabaseValueHolder createCloneValueHolder(ValueHolderInterface attributeValue, Object original, Object clone, AbstractRecord row, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
-        DatabaseValueHolder valueHolder = null;
+    public <T> DatabaseValueHolder<T> createCloneValueHolder(ValueHolderInterface<T> attributeValue, Object original, Object clone, AbstractRecord row, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
+        DatabaseValueHolder<T> valueHolder = null;
         //Bug#457480 : If original (from cache) is null, load from row
         if ((row == null && original != null) && (isPrimaryKeyMapping())) {
             // The row must be built if a primary key mapping for remote case.
@@ -1054,7 +1055,7 @@
         // Note that this UOW valueholder starts off as instantiated but that
         // is fine, for the reality is that it is.
         if (buildDirectlyFromRow && attributeValue.isInstantiated()) {
-            Object cloneAttributeValue = attributeValue.getValue();
+            T cloneAttributeValue = attributeValue.getValue();
             valueHolder.privilegedSetValue(cloneAttributeValue);
             valueHolder.setInstantiated();
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/VariableOneToOneMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/VariableOneToOneMapping.java
index 86e7678..9ae73e2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/VariableOneToOneMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/VariableOneToOneMapping.java
@@ -763,7 +763,7 @@
                     return this.getAttributeValueFromObject(cached);
                 }
             } else if (!this.isCacheable && !isTargetProtected && cacheKey != null) {
-                return this.indirectionPolicy.buildIndirectObject(new ValueHolder(null));
+                return this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null));
             }
         }
         if (row.hasSopObject()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractColumnMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractColumnMapping.java
index 437974e..6e62561 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractColumnMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractColumnMapping.java
@@ -37,6 +37,7 @@
 import org.eclipse.persistence.internal.sessions.AbstractRecord;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.converters.Converter;
 import org.eclipse.persistence.queries.ObjectLevelReadQuery;
@@ -180,7 +181,7 @@
      * with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractCompositeCollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractCompositeCollectionMapping.java
index e22a7c0..77b3865 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractCompositeCollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractCompositeCollectionMapping.java
@@ -26,6 +26,7 @@
 import org.eclipse.persistence.internal.identitymaps.CacheKey;
 import org.eclipse.persistence.internal.queries.*;
 import org.eclipse.persistence.internal.sessions.*;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.*;
 import org.eclipse.persistence.mappings.converters.Converter;
 import org.eclipse.persistence.mappings.structures.ArrayCollectionMapping;
@@ -328,7 +329,7 @@
      * with client-side objects.
      */
     @Override
-    protected void fixAttributeValue(Object attributeValue, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    protected void fixAttributeValue(Object attributeValue, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         if (attributeValue == null) {
             return;
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractCompositeDirectCollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractCompositeDirectCollectionMapping.java
index e0d03c1..eb9467b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractCompositeDirectCollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractCompositeDirectCollectionMapping.java
@@ -25,6 +25,7 @@
 import org.eclipse.persistence.internal.oxm.mappings.Field;
 import org.eclipse.persistence.internal.queries.*;
 import org.eclipse.persistence.internal.sessions.*;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.*;
 import org.eclipse.persistence.mappings.converters.*;
 import org.eclipse.persistence.mappings.structures.ArrayCollectionMapping;
@@ -289,7 +290,7 @@
      * with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         // Do nothing....
         // The nested collection should de-serialize without need for any further manipulation.
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractTransformationMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractTransformationMapping.java
index a96f78d..8c4bb49 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractTransformationMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractTransformationMapping.java
@@ -62,6 +62,7 @@
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.TransformationMappingChangeRecord;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.internal.sessions.remote.RemoteValueHolder;
 import org.eclipse.persistence.mappings.Association;
 import org.eclipse.persistence.mappings.DatabaseMapping;
@@ -608,7 +609,7 @@
      * the shared cache, and then cloning the original.
      */
     @Override
-    public DatabaseValueHolder createCloneValueHolder(ValueHolderInterface attributeValue, Object original, Object clone, AbstractRecord row, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
+    public <T> DatabaseValueHolder<T> createCloneValueHolder(ValueHolderInterface<T> attributeValue, Object original, Object clone, AbstractRecord row, AbstractSession cloningSession, boolean buildDirectlyFromRow) {
         return cloningSession.createCloneTransformationValueHolder(attributeValue, original, clone, this);
     }
 
@@ -628,7 +629,7 @@
      * with client-side objects.
      */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         this.indirectionPolicy.fixObjectReferences(object, objectDescriptors, processedObjects, query, session);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/structures/ReferenceMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/structures/ReferenceMapping.java
index 1196391..542f84a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/structures/ReferenceMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/structures/ReferenceMapping.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -313,7 +313,7 @@
                 }
                 return result;
             } else if (!this.isCacheable && !isTargetProtected && cacheKey != null) {
-                return this.indirectionPolicy.buildIndirectObject(new ValueHolder(null));
+                return this.indirectionPolicy.buildIndirectObject(new ValueHolder<>(null));
             }
         }
         AbstractRecord targetRow = null;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyAttributeMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyAttributeMapping.java
index fcde74c..2cba131 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyAttributeMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyAttributeMapping.java
@@ -44,6 +44,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.AttributeAccessor;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.oxm.NamespaceResolver;
@@ -171,7 +172,7 @@
     * with client-side objects.
     */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         throw DescriptorException.invalidMappingOperation(this, "fixObjectReferences");
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyCollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyCollectionMapping.java
index 06888b6..722c1bd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyCollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyCollectionMapping.java
@@ -43,6 +43,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.AttributeAccessor;
 import org.eclipse.persistence.mappings.ContainerMapping;
 import org.eclipse.persistence.mappings.DatabaseMapping;
@@ -264,7 +265,7 @@
     * with client-side objects.
     */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         throw DescriptorException.invalidMappingOperation(this, "fixObjectReferences");
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyObjectMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyObjectMapping.java
index 9efc297..cd47875 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyObjectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAnyObjectMapping.java
@@ -41,6 +41,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.AttributeAccessor;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.oxm.XMLConstants;
@@ -253,7 +254,7 @@
     * with client-side objects.
     */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         throw DescriptorException.invalidMappingOperation(this, "fixObjectReferences");
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceCollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceCollectionMapping.java
index 9f026b1..6f64881 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceCollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceCollectionMapping.java
@@ -55,6 +55,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.AttributeAccessor;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.converters.Converter;
@@ -224,7 +225,7 @@
     * with client-side objects.
     */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         throw DescriptorException.invalidMappingOperation(this, "fixObjectReferences");
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceObjectMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceObjectMapping.java
index b647a13..52170b5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceObjectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceObjectMapping.java
@@ -43,6 +43,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.AttributeAccessor;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.converters.Converter;
@@ -213,7 +214,7 @@
     * with client-side objects.
     */
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, DistributedSession session) {
         throw DescriptorException.invalidMappingOperation(this, "fixObjectReferences");
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLInverseReferenceMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLInverseReferenceMapping.java
index b0c9584..3128a15 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLInverseReferenceMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLInverseReferenceMapping.java
@@ -36,6 +36,7 @@
 import org.eclipse.persistence.internal.sessions.MergeManager;
 import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
+import org.eclipse.persistence.internal.sessions.remote.ObjectDescriptor;
 import org.eclipse.persistence.mappings.AggregateMapping;
 import org.eclipse.persistence.mappings.AttributeAccessor;
 import org.eclipse.persistence.mappings.ContainerMapping;
@@ -220,9 +221,9 @@
     }
 
     @Override
-    public void fixObjectReferences(Object object, Map objectDescriptors,
-            Map processedObjects, ObjectLevelReadQuery query,
-            DistributedSession session) {
+    public void fixObjectReferences(Object object, Map<Object, ObjectDescriptor> objectDescriptors,
+                                    Map<Object, Object> processedObjects, ObjectLevelReadQuery query,
+                                    DistributedSession session) {
     }
 
     @Override
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/xml/XMLPlatformFactory.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/xml/XMLPlatformFactory.java
index 3d5429b..e62c2b3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/xml/XMLPlatformFactory.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/xml/XMLPlatformFactory.java
@@ -106,7 +106,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try{
-                    return (XMLPlatform)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(getXMLPlatformClass()));
+                    return AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(getXMLPlatformClass()));
                 }catch (PrivilegedActionException ex){
                     throw (RuntimeException) ex.getCause();
                 }
@@ -114,9 +114,7 @@
                 return PrivilegedAccessHelper.newInstanceFromClass(getXMLPlatformClass());
 
             }
-        } catch (IllegalAccessException e) {
-            throw XMLPlatformException.xmlPlatformCouldNotInstantiate(getXMLPlatformClass().getName(), e);
-        } catch (InstantiationException e) {
+        } catch (ReflectiveOperationException e) {
             throw XMLPlatformException.xmlPlatformCouldNotInstantiate(getXMLPlatformClass().getName(), e);
         }
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/DistributedSession.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/DistributedSession.java
index 2bcdcfe..d0d39a2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/DistributedSession.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/DistributedSession.java
@@ -270,13 +270,13 @@
      * INTERNAL:
      * Return the corresponding objects from the remote session for the objects read from the server.
      */
-    public abstract Object getObjectCorrespondingTo(Object serverSideDomainObject, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query);
+    public abstract Object getObjectCorrespondingTo(Object serverSideDomainObject, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query);
 
     /**
      * INTERNAL:
      * Return the corresponding objects from the remote session for the objects read from the server.
      */
-    public abstract Object getObjectsCorrespondingToAll(Object serverSideDomainObjects, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, ContainerPolicy containerPolicy);
+    public abstract Object getObjectsCorrespondingToAll(Object serverSideDomainObjects, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, ContainerPolicy containerPolicy);
 
     /**
      * INTERNAL:
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/RemoteSession.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/RemoteSession.java
index 5031eef..b1d1ab4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/RemoteSession.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/RemoteSession.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -168,7 +168,7 @@
      * Return the corresponding objects from the remote session for the objects read from the server.
      */
     @Override
-    public Object getObjectCorrespondingTo(Object serverSideDomainObject, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query) {
+    public Object getObjectCorrespondingTo(Object serverSideDomainObject, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query) {
         if (serverSideDomainObject == null) {
             return null;
         }
@@ -187,7 +187,7 @@
         // with this primary key then that's the corresponding object. Other wise its a new object for the remote
         // session which needs to be registered in the remote sessions identity map and this is also a corresponding
         // object.
-        ObjectDescriptor objectDescriptor = (ObjectDescriptor)objectDescriptors.get(serverSideDomainObject);
+        ObjectDescriptor objectDescriptor = objectDescriptors.get(serverSideDomainObject);
         if (objectDescriptor == null){
             //the object must have been added concurrently before serialize generate a new ObjectDescriptor on this side
             objectDescriptor = new ObjectDescriptor();
@@ -243,7 +243,7 @@
      * Return the corresponding objects from the remote session for the objects read from the server.
      */
     @Override
-    public Object getObjectsCorrespondingToAll(Object serverSideDomainObjects, Map objectDescriptors, Map processedObjects, ObjectLevelReadQuery query, ContainerPolicy containerPolicy) {
+    public Object getObjectsCorrespondingToAll(Object serverSideDomainObjects, Map<Object, ObjectDescriptor> objectDescriptors, Map<Object, Object> processedObjects, ObjectLevelReadQuery query, ContainerPolicy containerPolicy) {
         Object clientSideDomainObjects = containerPolicy.containerInstance(containerPolicy.sizeFor(serverSideDomainObjects));
 
         for (Object iter = containerPolicy.iteratorFor(serverSideDomainObjects);
@@ -264,7 +264,7 @@
         startOperationProfile(SessionProfiler.RemoteLazy, null, SessionProfiler.ALL);
         Transporter transporter = getRemoteConnection().instantiateRemoteValueHolderOnServer(remoteValueHolder);
         endOperationProfile(SessionProfiler.RemoteLazy, null, SessionProfiler.ALL);
-        return remoteValueHolder.getMapping().getObjectCorrespondingTo(transporter.getObject(), this, transporter.getObjectDescriptors(), new IdentityHashMap(), remoteValueHolder.getQuery());
+        return remoteValueHolder.getMapping().getObjectCorrespondingTo(transporter.getObject(), this, transporter.getObjectDescriptors(), new IdentityHashMap<>(), remoteValueHolder.getQuery());
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/SchemaManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/SchemaManager.java
index 839b1a6..bac8d15 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/SchemaManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/SchemaManager.java
@@ -35,6 +35,7 @@
 import org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor;
 import org.eclipse.persistence.internal.helper.Helper;
 import org.eclipse.persistence.internal.sequencing.Sequencing;
+import org.eclipse.persistence.internal.sessions.AbstractRecord;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
 import org.eclipse.persistence.sequencing.DefaultSequence;
@@ -708,7 +709,7 @@
      * @param tableName a table name pattern
      * @return a Vector of Records.
      */
-    public Vector getAllColumnNames(String tableName) throws DatabaseException {
+    public Vector<AbstractRecord> getAllColumnNames(String tableName) throws DatabaseException {
         return getAccessor().getColumnInfo(null, null, tableName, null, getSession());
     }
 
@@ -753,7 +754,7 @@
      * @param tableName a table name pattern
      * @return a Vector of Records.
      */
-    public Vector getAllColumnNames(String creatorName, String tableName) throws DatabaseException {
+    public Vector<AbstractRecord> getAllColumnNames(String creatorName, String tableName) throws DatabaseException {
         return getAccessor().getColumnInfo(null, creatorName, tableName, null, getSession());
     }
 
@@ -776,7 +777,7 @@
      *
      * @return a Vector of Records.
      */
-    public Vector getAllTableNames() throws DatabaseException {
+    public Vector<AbstractRecord> getAllTableNames() throws DatabaseException {
         return getAccessor().getTableInfo(null, null, null, null, getSession());
     }
 
@@ -820,7 +821,7 @@
      * without a schema
      * @return a Vector of Records.
      */
-    public Vector getAllTableNames(String creatorName) throws DatabaseException {
+    public Vector<AbstractRecord> getAllTableNames(String creatorName) throws DatabaseException {
         return getAccessor().getTableInfo(null, creatorName, null, null, getSession());
     }
 
@@ -872,7 +873,7 @@
      * @param columnName a column name pattern
      * @return a Vector of Records.
      */
-    public Vector getColumnInfo(String catalog, String schema, String tableName, String columnName) throws DatabaseException {
+    public Vector<AbstractRecord> getColumnInfo(String catalog, String schema, String tableName, String columnName) throws DatabaseException {
         return getAccessor().getColumnInfo(catalog, schema, tableName, columnName, getSession());
     }
 
@@ -909,7 +910,7 @@
      * @param types a list of table types to include; null returns all types
      * @return a Vector of Records.
      */
-    public Vector getTableInfo(String catalog, String schema, String tableName, String[] types) throws DatabaseException {
+    public Vector<AbstractRecord> getTableInfo(String catalog, String schema, String tableName, String[] types) throws DatabaseException {
         return getAccessor().getTableInfo(catalog, schema, tableName, types, getSession());
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableCreator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableCreator.java
index a29aa03..4e61ba0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableCreator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableCreator.java
@@ -27,6 +27,7 @@
 
 import org.eclipse.persistence.exceptions.DatabaseException;
 import org.eclipse.persistence.internal.helper.DatabaseField;
+import org.eclipse.persistence.internal.sessions.AbstractRecord;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.logging.SessionLog;
 import org.eclipse.persistence.platform.database.DatabasePlatform;
@@ -479,7 +480,7 @@
                     //as it is stored internally.
                     String tableName = table.getTable()==null? table.getName(): table.getTable().getName();
                     final boolean usesDelimiting = (table.getTable()!=null && table.getTable().shouldUseDelimiters());
-                    List<DatabaseRecord> columnInfo = null;
+                    List<AbstractRecord> columnInfo = null;
 
                     //I need the actual table catalog, schema and tableName for getTableInfo.
                     columnInfo = abstractSession.getAccessor().getColumnInfo(null, null, tableName, null, abstractSession);
@@ -496,7 +497,7 @@
                         //Table exists, add individual fields as necessary
 
                         //hash the table's existing columns by name
-                        final Map<DatabaseField, DatabaseRecord> columns = new HashMap<>(columnInfo.size());
+                        final Map<DatabaseField, AbstractRecord> columns = new HashMap<>(columnInfo.size());
                         final DatabaseField columnNameLookupField = new DatabaseField("COLUMN_NAME");
                         final DatabaseField schemaLookupField = new DatabaseField("TABLE_SCHEM");
                         boolean schemaMatchFound = false;
@@ -516,7 +517,7 @@
                             }
                         }
                         final boolean checkSchema = (qualifier != null) && (qualifier.length() > 0);
-                        for (final DatabaseRecord record : columnInfo) {
+                        for (final AbstractRecord record : columnInfo) {
                             final String fieldName = (String)record.get(columnNameLookupField);
                             if (fieldName != null && fieldName.length() > 0) {
                                 final DatabaseField column = new DatabaseField(fieldName);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityClassListener.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityClassListener.java
index 1df7bbf..84b2814 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityClassListener.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityClassListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 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
@@ -35,7 +35,7 @@
     /**
      * INTERNAL:
      */
-    public EntityClassListener(Class entityClass) {
+    public EntityClassListener(Class<?> entityClass) {
         super(entityClass);
     }
 
@@ -57,7 +57,7 @@
      * INTERNAL:
      */
     @Override
-    public Class getListenerClass() {
+    public Class<?> getListenerClass() {
         return getEntityClass();
     }
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java
index d9dd77d..28c73e8 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java
@@ -59,12 +59,12 @@
 
         if (listener == null) {
             if (listenerClassName !=null) {
-                Class listenerClass = getListenerClass(loader);
+                Class<?> listenerClass = getListenerClass(loader);
 
                 if (DescriptorEventListener.class.isAssignableFrom(listenerClass)){
                     listener = (DescriptorEventListener)constructListenerInstance(listenerClass);
                 } else {
-                    EntityListener entityListener = new EntityListener(listenerClass, descriptor.getJavaClass());
+                    EntityListener<?> entityListener = new EntityListener<>(listenerClass, descriptor.getJavaClass());
                     entityListener.setOwningSession(session);
                     if (!(serializableMethods == null)) {
                         //The user class is not a DescriptorEventListener, so wrap it in a JPA EntityListener instance
@@ -76,7 +76,7 @@
 
             } else {
               //it must be an EntityClassListener
-                EntityListener entityListener = new EntityClassListener(descriptor.getJavaClass());
+                EntityListener<?> entityListener = new EntityClassListener<>(descriptor.getJavaClass());
                 entityListener.setAllEventMethods(this.convertToMethods(loader));
                 listener = entityListener;
             }
@@ -94,21 +94,19 @@
 
     }
 
-    protected Object constructListenerInstance(Class listenerClass){
-        Object entityListenerClassInstance = null;
+    protected Object constructListenerInstance(Class<?> listenerClass){
+        Object entityListenerClassInstance;
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    entityListenerClassInstance = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(listenerClass));
+                    entityListenerClassInstance = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(listenerClass));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.errorInstantiatingClass(listenerClass, exception.getException());
                 }
             } else {
                 entityListenerClassInstance = PrivilegedAccessHelper.newInstanceFromClass(listenerClass);
             }
-        } catch (IllegalAccessException exception) {
-            throw ValidationException.errorInstantiatingClass(listenerClass, exception);
-        } catch (InstantiationException exception) {
+        } catch (ReflectiveOperationException exception) {
             throw ValidationException.errorInstantiatingClass(listenerClass, exception);
         }
         return entityListenerClassInstance;
@@ -137,8 +135,8 @@
      * used to return an instance of the listenerClassName
      * @return an instance of listenerClassName
      */
-    private Class getListenerClass(ClassLoader loader){
-        Class entityListenerClass = null;
+    private Class<?> getListenerClass(ClassLoader loader){
+        Class<?> entityListenerClass;
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
@@ -180,7 +178,7 @@
         Map<String,java.util.List<Method>> table = new ConcurrentHashMap<>();
         for (String event: serializableMethods.keySet()){
             java.util.List<MethodSerialImpl> methodList = serializableMethods.get(event);
-            java.util.List<Method> newMethodList = new java.util.ArrayList();
+            java.util.List<Method> newMethodList = new java.util.ArrayList<>();
             for (MethodSerialImpl serializedMethod: methodList) {
                 try {
                     Method method = serializedMethod.convertToMethod(loader);
@@ -196,7 +194,7 @@
 
     public Map<String,java.util.List<MethodSerialImpl>> getMethods() {
         if (serializableMethods == null) {
-            serializableMethods = new ConcurrentHashMap<String, List<MethodSerialImpl>>();
+            serializableMethods = new ConcurrentHashMap<>();
         }
         return serializableMethods;
     }
diff --git a/jpa/org.eclipse.persistence.jpars.server/src/main/java/org/eclipse/persistence/jpa/rs/resources/common/AbstractEntityResource.java b/jpa/org.eclipse.persistence.jpars.server/src/main/java/org/eclipse/persistence/jpa/rs/resources/common/AbstractEntityResource.java
index 9893887..5c0bb55 100644
--- a/jpa/org.eclipse.persistence.jpars.server/src/main/java/org/eclipse/persistence/jpa/rs/resources/common/AbstractEntityResource.java
+++ b/jpa/org.eclipse.persistence.jpars.server/src/main/java/org/eclipse/persistence/jpa/rs/resources/common/AbstractEntityResource.java
@@ -231,7 +231,7 @@
     private void processBidirectionalRelationships(PersistenceContext context, ClassDescriptor descriptor, Object entity) {
         final List<DatabaseMapping> mappings = descriptor.getMappings();
         for (DatabaseMapping mapping : mappings) {
-            if ((mapping != null) && (mapping instanceof ForeignReferenceMapping)) {
+            if (mapping instanceof ForeignReferenceMapping) {
                 final ForeignReferenceMapping jpaMapping = (ForeignReferenceMapping) mapping;
                 final Object attributeValue = mapping.getAttributeAccessor().getAttributeValueFromObject(entity);
                 if (jpaMapping.isCascadePersist()) {
@@ -242,7 +242,7 @@
                             if (inverseMapping != null) {
                                 if (attributeValue != null) {
                                     if (attributeValue instanceof ValueHolder) {
-                                        final ValueHolder holder = (ValueHolder) attributeValue;
+                                        final ValueHolder<?> holder = (ValueHolder<?>) attributeValue;
                                         final Object obj = holder.getValue();
                                         if (obj != null) {
                                             inverseMapping.setAttributeValueInObject(obj, entity);
@@ -287,7 +287,7 @@
                                     final Object value = mapping.getAttributeAccessor().getAttributeValueFromObject(entity);
                                     if (value != null) {
                                         if (value instanceof ValueHolder) {
-                                            final ValueHolder holder = (ValueHolder) value;
+                                            final ValueHolder<?> holder = (ValueHolder<?>) value;
                                             if (holder.getValue() != null) {
                                                 return false;
                                             }
@@ -318,10 +318,8 @@
         final AbstractDirectMapping sequenceMapping = descriptor.getObjectBuilder().getSequenceMapping();
         if (sequenceMapping != null) {
             final Object value = sequenceMapping.getAttributeAccessor().getAttributeValueFromObject(entity);
-            if (descriptor.getObjectBuilder().isPrimaryKeyComponentInvalid(value, descriptor.getPrimaryKeyFields().indexOf(descriptor.getSequenceNumberField()))
-                    || descriptor.getSequence().shouldAlwaysOverrideExistingValue()) {
-                return false;
-            }
+            return !descriptor.getObjectBuilder().isPrimaryKeyComponentInvalid(value, descriptor.getPrimaryKeyFields().indexOf(descriptor.getSequenceNumberField()))
+                    && !descriptor.getSequence().shouldAlwaysOverrideExistingValue();
         }
         return true;
     }
@@ -369,7 +367,7 @@
             Map<String, String> matrixParams = getMatrixParameters(uriInfo, attribute);
             Map<String, Object> queryParams = getQueryParameters(uriInfo);
 
-            if ((queryParams != null) && (!queryParams.isEmpty())) {
+            if (!queryParams.isEmpty()) {
                 listItemId = (String) queryParams.get(QueryParameters.JPARS_LIST_ITEM_ID);
             }