diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/QueryOperation.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/QueryOperation.java
index 8b46418..db03b34 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/QueryOperation.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/QueryOperation.java
@@ -641,12 +641,12 @@
                             Object xmlTypeFactory;
                             Method getStringMethod;
                             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                                oracleOPAQUE = AccessController.doPrivileged(new PrivilegedClassForName(IORACLEOPAQUE_STR, true, this.getClass().getClassLoader()));
-                                xmlTypeFactoryClass = AccessController.doPrivileged(new PrivilegedClassForName(XMLTYPEFACTORY_STR, true, this.getClass().getClassLoader()));
-                                xmlTypeFactoryConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(xmlTypeFactoryClass, new Class[0], true));
-                                xmlTypeFactory = AccessController.doPrivileged(new PrivilegedInvokeConstructor(xmlTypeFactoryConstructor, new Object[0]));
+                                oracleOPAQUE = AccessController.doPrivileged(new PrivilegedClassForName<>(IORACLEOPAQUE_STR, true, this.getClass().getClassLoader()));
+                                xmlTypeFactoryClass = AccessController.doPrivileged(new PrivilegedClassForName<>(XMLTYPEFACTORY_STR, true, this.getClass().getClassLoader()));
+                                xmlTypeFactoryConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(xmlTypeFactoryClass, new Class[0], true));
+                                xmlTypeFactory = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(xmlTypeFactoryConstructor, new Object[0]));
                                 getStringMethod = AccessController.doPrivileged(new PrivilegedGetDeclaredMethod(xmlTypeFactoryClass, GETSTRING_METHOD, new Class[] {oracleOPAQUE}));
-                                fieldValue = AccessController.doPrivileged(new PrivilegedMethodInvoker(getStringMethod, fieldValue, new Object[] {}));
+                                fieldValue = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(getStringMethod, fieldValue, new Object[] {}));
                             } else {
                                 oracleOPAQUE = PrivilegedAccessHelper.getClassForName(IORACLEOPAQUE_STR, false, this.getClass().getClassLoader());
                                 xmlTypeFactoryClass = PrivilegedAccessHelper.getClassForName(XMLTYPEFACTORY_STR, true, this.getClass().getClassLoader());
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/Util.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/Util.java
index b790aeb..a054da2 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/Util.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/Util.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
@@ -26,7 +26,6 @@
 import static org.eclipse.persistence.internal.helper.ClassConstants.FLOAT;
 import static org.eclipse.persistence.internal.helper.ClassConstants.INTEGER;
 import static org.eclipse.persistence.internal.helper.ClassConstants.LONG;
-import static org.eclipse.persistence.internal.helper.ClassConstants.Object_Class;
 import static org.eclipse.persistence.internal.helper.ClassConstants.SHORT;
 import static org.eclipse.persistence.internal.helper.ClassConstants.STRING;
 import static org.eclipse.persistence.internal.oxm.Constants.ANY_SIMPLE_TYPE_QNAME;
@@ -67,6 +66,7 @@
 import javax.xml.namespace.QName;
 
 // EclipseLink imports
+import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.databaseaccess.DatabasePlatform;
 import org.eclipse.persistence.platform.xml.XMLPlatform;
 import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
@@ -434,7 +434,7 @@
     public static Class<?> getClassFromJDBCType(String typeName, DatabasePlatform databasePlatform) {
         Class<?> clz = databasePlatform.getClassTypes().get(typeName);
         if (clz == null) {
-            return Object_Class;
+            return CoreClassConstants.OBJECT;
         }
         return clz;
     }
@@ -444,7 +444,7 @@
     public static final Map<QName, Class<?>> SCHEMA_2_CLASS;
     static {
       SCHEMA_2_CLASS = Collections.unmodifiableMap(new HashMap<QName, Class<?>>() {{
-            put(ANY_SIMPLE_TYPE_QNAME,Object_Class);
+            put(ANY_SIMPLE_TYPE_QNAME,CoreClassConstants.OBJECT);
             put(BASE_64_BINARY_QNAME, APBYTE);
             put(BOOLEAN_QNAME, BOOLEAN);
             put(BYTE_QNAME, BYTE);
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/XRServiceFactory.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/XRServiceFactory.java
index 3ef1161..6d3b7c7 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/XRServiceFactory.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/XRServiceFactory.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
@@ -387,7 +387,7 @@
                     }
                 }
                 // convert class names to classes on the associated OR descriptor
-                ClassDescriptor odesc = (ClassDescriptor) orProject.getAliasDescriptors().get(alias);
+                ClassDescriptor odesc = orProject.getAliasDescriptors().get(alias);
                 if (odesc != null)  {  // shouldn't be null...
                     // step three:  align OR alias and ordered descriptors (alias names and mappings)
                     ClassDescriptor orderedDescriptor = getDescriptorForClassName(orProject, odesc.getJavaClassName());
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/resources/MetadataResource.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/resources/MetadataResource.java
index b4639ce..6e63c55 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/resources/MetadataResource.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/resources/MetadataResource.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -268,7 +268,7 @@
         final MetadataCatalog result = new MetadataCatalog();
 
         // Entities
-        final Map<Class, ClassDescriptor> descriptors = context.getServerSession().getDescriptors();
+        final Map<Class<?>, ClassDescriptor> descriptors = context.getServerSession().getDescriptors();
         for (ClassDescriptor descriptor : descriptors.values()) {
 
             // Skip embeddables
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/resources/common/AbstractPersistenceUnitResource.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/resources/common/AbstractPersistenceUnitResource.java
index 13b61cc..5224a46 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/resources/common/AbstractPersistenceUnitResource.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/resources/common/AbstractPersistenceUnitResource.java
@@ -138,9 +138,9 @@
             PersistenceContext context = getPersistenceContext(persistenceUnit, null, baseURI, version, null);
             PersistenceUnit pu = new PersistenceUnit();
             pu.setPersistenceUnitName(persistenceUnit);
-            Map<Class, ClassDescriptor> descriptors = context.getServerSession().getDescriptors();
+            Map<Class<?>, ClassDescriptor> descriptors = context.getServerSession().getDescriptors();
             String mediaType = StreamingOutputMarshaller.mediaType(headers.getAcceptableMediaTypes()).toString();
-            Iterator<Class> contextIterator = descriptors.keySet().iterator();
+            Iterator<Class<?>> contextIterator = descriptors.keySet().iterator();
             while (contextIterator.hasNext()) {
                 ClassDescriptor descriptor = descriptors.get(contextIterator.next());
                 String alias = descriptor.getAlias();
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapter.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapter.java
index b4aff92..cbde40b 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapter.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapter.java
@@ -77,7 +77,7 @@
         ClassLoader cl = jpaSession.getDatasourcePlatform().getConversionManager().getLoader();
         DefaultXMLNameTransformer xmlNameTransformer = new DefaultXMLNameTransformer();
         for (Object descriptorAlias : project.getAliasDescriptors().keySet()) {
-            ClassDescriptor descriptor = (ClassDescriptor) project.getAliasDescriptors().get(descriptorAlias);
+            ClassDescriptor descriptor = project.getAliasDescriptors().get(descriptorAlias);
 
             if (!PersistenceWeavedRest.class.isAssignableFrom(descriptor.getJavaClass())) {
                 continue;
@@ -190,7 +190,7 @@
         }
 
         for (Object descriptorAlias : project.getAliasDescriptors().keySet()) {
-            ClassDescriptor descriptor = (ClassDescriptor) project.getAliasDescriptors().get(descriptorAlias);
+            ClassDescriptor descriptor = project.getAliasDescriptors().get(descriptorAlias);
             ClassDescriptor jpaDescriptor = jpaSession.getDescriptorForAlias(descriptor.getAlias());
             Vector<DatabaseMapping> descriptorMappings = (Vector<DatabaseMapping>) descriptor.getMappings().clone();
 
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapterV2.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapterV2.java
index a80436a..d2378a7 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapterV2.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/jpa/rs/util/PreLoginMappingAdapterV2.java
@@ -42,7 +42,7 @@
         final Project project = event.getSession().getProject();
         final DefaultXMLNameTransformer xmlNameTransformer = new DefaultXMLNameTransformer();
         for (Object descriptorAlias : project.getAliasDescriptors().keySet()) {
-            final ClassDescriptor descriptor = (ClassDescriptor) project.getAliasDescriptors().get(descriptorAlias);
+            final ClassDescriptor descriptor = project.getAliasDescriptors().get(descriptorAlias);
 
             if (!PersistenceWeavedRest.class.isAssignableFrom(descriptor.getJavaClass())) {
                 continue;
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/employee/domain/Employee.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/employee/domain/Employee.java
index 319b27a..8ae67c7 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/employee/domain/Employee.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/employee/domain/Employee.java
@@ -183,12 +183,12 @@
 
         /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
         try {
-            hours[0] = (Time) session.getDatasourcePlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
-            hours[1] = (Time) session.getDatasourcePlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
+            hours[0] = session.getDatasourcePlatform().convertObject(row.get("START_TIME"), Time.class);
+            hours[1] = session.getDatasourcePlatform().convertObject(row.get("END_TIME"), Time.class);
         } catch (Throwable in904) {
             // Allow performance tests to be run in 904.
-            hours[0] = (Time)ConversionManager.getDefaultManager().convertObject(row.get("START_TIME"), java.sql.Time.class);
-            hours[1] = (Time)ConversionManager.getDefaultManager().convertObject(row.get("END_TIME"), java.sql.Time.class);
+            hours[0] = ConversionManager.getDefaultManager().convertObject(row.get("START_TIME"), Time.class);
+            hours[1] = ConversionManager.getDefaultManager().convertObject(row.get("END_TIME"), Time.class);
         }
         return hours;
     }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/Computer.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/Computer.java
index 4ccf4d2..9addf16 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/Computer.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/Computer.java
@@ -17,10 +17,8 @@
 import java.io.*;
 import java.util.Enumeration;
 import org.eclipse.persistence.descriptors.*;
-import org.eclipse.persistence.sessions.*;
 import org.eclipse.persistence.mappings.*;
 import org.eclipse.persistence.tools.schemaframework.*;
-import org.eclipse.persistence.testing.models.inheritance.PC;
 
 public class Computer implements Serializable {
     public int id;
@@ -35,7 +33,7 @@
         // As a result, we check for the mapping before adding it.
         // The reason this mapping is not added in the project is that some Mapping Workbench
         // tests rely on the ammendment method.
-        Enumeration mappings = descriptor.getMappings().elements();
+        Enumeration<DatabaseMapping> mappings = descriptor.getMappings().elements();
         while (mappings.hasMoreElements()) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
             if (mapping.isTransformationMapping()) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/PC.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/PC.java
index 7be1b67..b104f6d 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/PC.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/PC.java
@@ -31,7 +31,7 @@
         // As a result, we check for the mapping before adding it.
         // The reason this mapping is not added in the project is that some Mapping Workbench
         // tests rely on the ammendment method.
-        Enumeration mappings = descriptor.getMappings().elements();
+        Enumeration<DatabaseMapping> mappings = descriptor.getMappings().elements();
         while (mappings.hasMoreElements()) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
             if (mapping.isTransformationMapping()) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/mapping/Employee.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/mapping/Employee.java
index 1e6a71f..087e075 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/mapping/Employee.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/mapping/Employee.java
@@ -558,8 +558,8 @@
     }
 
     public java.util.Date setDateAndTime(org.eclipse.persistence.sessions.Record row, org.eclipse.persistence.sessions.Session session) {
-        java.sql.Date sqlDateOfBirth = (java.sql.Date)ConversionManager.getDefaultManager().convertObject(row.get("BDAY"), java.sql.Date.class);
-        java.sql.Time timeOfBirth = (java.sql.Time)session.getLogin().getPlatform().convertObject(row.get("BTIME"), java.sql.Time.class);
+        java.sql.Date sqlDateOfBirth = ConversionManager.getDefaultManager().convertObject(row.get("BDAY"), java.sql.Date.class);
+        java.sql.Time timeOfBirth = session.getLogin().getPlatform().convertObject(row.get("BTIME"), java.sql.Time.class);
         if ((timeOfBirth == null) || (sqlDateOfBirth == null)) {
             return null;
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/aggregate/AgentBuilderHelper.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/aggregate/AgentBuilderHelper.java
index e14f137..f9f502c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/aggregate/AgentBuilderHelper.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/aggregate/AgentBuilderHelper.java
@@ -32,7 +32,7 @@
 public class AgentBuilderHelper {
 
     public static List getCustomers(Object object) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             return ((Agent)object).getCustomers();
         } else if (Builder.class.equals(cls)) {
@@ -43,7 +43,7 @@
     }
 
     public static List getHouses(Object object) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             return ((Agent)object).getHouses();
         } else if (Builder.class.equals(cls)) {
@@ -74,7 +74,7 @@
     }
 
     public static String getLastName(Object object) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             return ((Agent)object).getLastName();
         } else if (Builder.class.equals(cls)) {
@@ -85,7 +85,7 @@
     }
 
     public static void setLastName(Object object, String lastName) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             ((Agent)object).setLastName(lastName);
         } else if (Builder.class.equals(cls)) {
@@ -96,7 +96,7 @@
     }
 
     public static String getFirstName(Object object) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             return ((Agent)object).getFirstName();
         } else if (Builder.class.equals(cls)) {
@@ -107,7 +107,7 @@
     }
 
     public static void setFirstName(Object object, String firstName) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             ((Agent)object).setFirstName(firstName);
         } else if (Builder.class.equals(cls)) {
@@ -118,7 +118,7 @@
     }
 
     public static void addCustomer(Object object, Customer customer) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             ((Agent)object).addCustomer(customer);
         } else if (Builder.class.equals(cls)) {
@@ -129,7 +129,7 @@
     }
 
     public static void addHouse(Object object, House house) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             ((Agent)object).addHouse(house);
         } else if (Builder.class.equals(cls)) {
@@ -140,7 +140,7 @@
     }
 
     public static void removeCustomer(Object object, Customer customer) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             ((Agent)object).removeCustomer(customer);
         } else if (Builder.class.equals(cls)) {
@@ -151,7 +151,7 @@
     }
 
     public static void removeHouse(Object object, House house) {
-        Class cls = object.getClass();
+        Class<? extends Object> cls = object.getClass();
         if(Agent.class.equals(cls)) {
             ((Agent)object).removeHouse(house);
         } else if (Builder.class.equals(cls)) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/aggregate/AggregateTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/aggregate/AggregateTestModel.java
index 7ed0aa6..5607c00 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/aggregate/AggregateTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/aggregate/AggregateTestModel.java
@@ -147,8 +147,8 @@
         suite.setName("AggregateCheckForNullUnitOfWorkTestSuite");
         suite.setDescription("This suite tests updating objects with UOW in the aggregate model.");
 
-        Class employeeClass = Employee.class;
-        Class clientClass = Client.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<Client> clientClass = Client.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new CheckForNullUnitOfWorkTest(manager.getObject(employeeClass, "example1")));
@@ -171,9 +171,9 @@
         suite.setName("AggregateDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the aggregate model.");
 
-        Class employeeClass = Employee.class;
-        Class clientClass = Client.class;
-        Class evaluationClientClass = EvaluationClient.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<Client> clientClass = Client.class;
+        Class<EvaluationClient> evaluationClientClass = EvaluationClient.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new DeleteObjectTest(manager.getObject(employeeClass, "example1")));
@@ -386,12 +386,12 @@
         suite.setDescription("This suite test the reading of each object in the aggregate model.");
 
         //=====================================
-        Class employee1Class = Employee1.class;
+        Class<Employee1> employee1Class = Employee1.class;
 
         //======================================
-        Class employeeClass = Employee.class;
-        Class clientClass = Client.class;
-        Class evaluationClientClass = EvaluationClient.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<Client> clientClass = Client.class;
+        Class<EvaluationClient> evaluationClientClass = EvaluationClient.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         //===============================================================================
@@ -432,7 +432,7 @@
         suite.setName("AggregateUnitOfWorkCommitResumeTestSuite");
         suite.setDescription("This suite tests updating objects with UOW in the aggregate model using the commitAndResume method.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new BatchReadingWithAggregateCollectionMapping(Agent.class));
@@ -462,8 +462,8 @@
         suite.setName("AggregateUnitOfWorkTestSuite");
         suite.setDescription("This suite tests updating objects with UOW in the aggregate model.");
 
-        Class employeeClass = Employee.class;
-        Class clientClass = Client.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<Client> clientClass = Client.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new UnitOfWorkTest(manager.getObject(employeeClass, "example1")));
@@ -505,10 +505,10 @@
         suite.setName("AggregateUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the aggregate model.");
 
-        Class employee1Class = Employee1.class;
-        Class employeeClass = Employee.class;
-        Class clientClass = Client.class;
-        Class evaluationClientClass = EvaluationClient.class;
+        Class<Employee1> employee1Class = Employee1.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<Client> clientClass = Client.class;
+        Class<EvaluationClient> evaluationClientClass = EvaluationClient.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         //=================================================================================
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/CMServer.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/CMServer.java
index 68600b2..2c37eb9 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/CMServer.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/CMServer.java
@@ -15,6 +15,8 @@
 package org.eclipse.persistence.testing.tests.clientserver;
 
 import java.util.*;
+
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.sessions.*;
 import org.eclipse.persistence.sessions.DatabaseLogin;
 
@@ -29,7 +31,7 @@
 
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext();) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext();) {
             descriptors.addElement(iterator.next());
         }
         serverSession.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/Server.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/Server.java
index 65b3459..e6452db 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/Server.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/Server.java
@@ -15,6 +15,8 @@
 package org.eclipse.persistence.testing.tests.clientserver;
 
 import java.util.*;
+
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.sessions.*;
 import org.eclipse.persistence.sessions.DatabaseLogin;
 import org.eclipse.persistence.sessions.server.ConnectionPool;
@@ -42,7 +44,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext();) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext();) {
             descriptors.addElement(iterator.next());
         }
         serverSession.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/Server1.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/Server1.java
index 3fb87dd..d38cc81 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/Server1.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/Server1.java
@@ -15,6 +15,8 @@
 package org.eclipse.persistence.testing.tests.clientserver;
 
 import java.util.*;
+
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.sessions.*;
 import org.eclipse.persistence.sessions.server.ConnectionPool;
 
@@ -40,7 +42,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext();) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext();) {
             descriptors.addElement(iterator.next());
         }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/ConvertByteCharArrayToStringTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/ConvertByteCharArrayToStringTest.java
index a2e95aa..b73ba10 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/ConvertByteCharArrayToStringTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/ConvertByteCharArrayToStringTest.java
@@ -46,10 +46,10 @@
     @Override
     public void test() {
         //Convert back to a string
-        byteString = (String)ConversionManager.getDefaultManager().convertObject(byteArray, ClassConstants.STRING);
-        byteOString = (String)ConversionManager.getDefaultManager().convertObject(byteOArray, ClassConstants.STRING);
-        charString = (String)ConversionManager.getDefaultManager().convertObject(charArray, ClassConstants.STRING);
-        charOString = (String)ConversionManager.getDefaultManager().convertObject(charOArray, ClassConstants.STRING);
+        byteString = ConversionManager.getDefaultManager().convertObject(byteArray, ClassConstants.STRING);
+        byteOString = ConversionManager.getDefaultManager().convertObject(byteOArray, ClassConstants.STRING);
+        charString = ConversionManager.getDefaultManager().convertObject(charArray, ClassConstants.STRING);
+        charOString = ConversionManager.getDefaultManager().convertObject(charOArray, ClassConstants.STRING);
     }
 
     @Override
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/customsqlstoredprocedures/CustomSQLTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/customsqlstoredprocedures/CustomSQLTestModel.java
index ac3dfdc..fe9aca2 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/customsqlstoredprocedures/CustomSQLTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/customsqlstoredprocedures/CustomSQLTestModel.java
@@ -88,7 +88,7 @@
         suite.setName("CustomSQLDeleteObjectTestSuite");
         suite.setDescription("This suite tests delete SQL.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0001")));
@@ -138,7 +138,7 @@
         suite.setName("CustomSQLReadObjectTestSuite");
         suite.setDescription("This suite test read sql.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -156,7 +156,7 @@
         TestSuite suite = new TestSuite();
         suite.setName("RefreshObjectTestSuite");
         suite.setDescription("This Suite contains tests that verify that Refreshing of Objects is working correctly");
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
         suite.addTest(new ReadObjectQueryTest((Employee)manager.getObject(employeeClass, "0003")));
         return suite;
@@ -180,7 +180,7 @@
         suite.setName("CustomSQLStoredProcedureTestSuite");
         suite.setDescription("This suite tests certains aspects of StoredProcedures");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new CacheHitTest(manager.getObject(employeeClass, "0003")));
@@ -239,7 +239,7 @@
         suite.setName("CustomSQLUpdateObjectTestSuite");
         suite.setDescription("This suite tests update sql.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/DistributedServer.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/DistributedServer.java
index e9a04a2..e5afa63 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/DistributedServer.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/DistributedServer.java
@@ -18,7 +18,6 @@
 
 import java.util.Iterator;
 
-import org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.sessions.broker.SessionBroker;
 import org.eclipse.persistence.sessions.DatabaseSession;
@@ -43,7 +42,7 @@
         super();
         if (testSssion.isSessionBroker()) {
             this.session = new SessionBroker();
-            Iterator enumtr = ((SessionBroker)testSssion).getSessionsByName().keySet().iterator();
+            Iterator<String> enumtr = ((SessionBroker)testSssion).getSessionsByName().keySet().iterator();
             while (enumtr.hasNext()) {
                 String name = (String)enumtr.next();
                 DatabaseSession newMemberSession = ((SessionBroker)testSssion).getSessionForName(name).getProject().createDatabaseSession();
@@ -55,7 +54,7 @@
         this.session.setSessionLog(testSssion.getSessionLog());
         this.session.login();
         if (testSssion.isSessionBroker()) {
-            Iterator enumtr = ((SessionBroker)testSssion).getSessionsByName().keySet().iterator();
+            Iterator<String> enumtr = ((SessionBroker)testSssion).getSessionsByName().keySet().iterator();
             while (enumtr.hasNext()) {
                 String name = (String)enumtr.next();
                 Session oldMemberSession = ((SessionBroker)testSssion).getSessionForName(name);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/UpdateChangeObjectWithOptimisticLockTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/UpdateChangeObjectWithOptimisticLockTest.java
index 6786e39..1218f9a 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/UpdateChangeObjectWithOptimisticLockTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/UpdateChangeObjectWithOptimisticLockTest.java
@@ -66,8 +66,8 @@
         // Because it seems there is no way to write object with version without transaction,
         // let's compare versions directly
         Employee remoteEmp = (Employee)remoteServer.executeQuery(this.query);
-        long remoteVersion = (Long)remoteServer.getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(remoteEmp, remoteEmp.getId(), (AbstractSession)remoteServer);
-        long writtenVersion = (Long)getUnitOfWork().getParent().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(objectToBeWritten, ((Employee)objectToBeWritten).getId(), getUnitOfWork().getParent());
+        long remoteVersion = remoteServer.getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(remoteEmp, remoteEmp.getId(), (AbstractSession)remoteServer);
+        long writtenVersion = getUnitOfWork().getParent().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(objectToBeWritten, ((Employee)objectToBeWritten).getId(), getUnitOfWork().getParent());
         if (remoteVersion != writtenVersion) {
             throw new TestErrorException("Failed to copy the version number to the remote system");
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/VerifyAggregateCollectionObjectsDeletedFromCacheTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/VerifyAggregateCollectionObjectsDeletedFromCacheTest.java
index 0098a49..bf64362 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/VerifyAggregateCollectionObjectsDeletedFromCacheTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/VerifyAggregateCollectionObjectsDeletedFromCacheTest.java
@@ -51,7 +51,7 @@
         List customers = AgentBuilderHelper.getCustomers(object);
 
         Customer customerx = (Customer)customers.get(0);
-        Vector dependants = customerx.getDependants();
+        Vector<Dependant> dependants = customerx.getDependants();
         customerx.removeDependant((Dependant)dependants.lastElement());
         AgentBuilderHelper.removeCustomer(object, (Customer)customers.get(customers.size()-1));
     }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/rcm/NewObjectWithOptimisticLockingTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/rcm/NewObjectWithOptimisticLockingTest.java
index deba87f..4c1afdf 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/rcm/NewObjectWithOptimisticLockingTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/rcm/NewObjectWithOptimisticLockingTest.java
@@ -76,7 +76,7 @@
         }
 
         boolean found = false;
-        Iterator i = holder.getItems().iterator();
+        Iterator<ListItem> i = holder.getItems().iterator();
         while (i.hasNext()){
             ListItem item = (ListItem)i.next();
             if (item.getDescription() != null && item.getDescription().equals("test2")){
@@ -93,7 +93,7 @@
     public void reset(){
         UnitOfWork uow = getSession().acquireUnitOfWork();
         holder = (ListHolder)uow.readObject(ListHolder.class);
-        Iterator i = holder.getItems().iterator();
+        Iterator<ListItem> i = holder.getItems().iterator();
         while (i.hasNext()){
             uow.deleteObject(i.next());
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/rcm/OrderedListNewObjectTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/rcm/OrderedListNewObjectTest.java
index ef382bd..0edce96 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/rcm/OrderedListNewObjectTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/distributedservers/rcm/OrderedListNewObjectTest.java
@@ -93,7 +93,7 @@
     public void reset(){
         UnitOfWork uow = getSession().acquireUnitOfWork();
         ListHolder holder = (ListHolder)uow.readObject(ListHolder.class);
-        Iterator i = holder.getItems().iterator();
+        Iterator<ListItem> i = holder.getItems().iterator();
         while (i.hasNext()){
             uow.deleteObject(i.next());
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/employee/AddDescriptorsTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/employee/AddDescriptorsTest.java
index f3eea37..95665d8 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/employee/AddDescriptorsTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/employee/AddDescriptorsTest.java
@@ -20,6 +20,8 @@
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.testing.framework.*;
 
+import java.util.Iterator;
+
 // To make this test fail, comment a single line of code:
 //   session.clearLastDescriptorAccessed();
 // in org.eclipse.persistence.descriptors.ClassDescriptor.preInterfaceInitialization() method.
@@ -37,7 +39,7 @@
             // The test has failed - at least one "old" descriptor is referenced by a new descriptor.
             // To ensure consistency, remove EmployeeSystem interface descriptors first,
             // then add all EmployeeSystem descriptors again
-            java.util.Iterator iterator = getSession().getDescriptors().keySet().iterator();
+            Iterator<Class<?>> iterator = getSession().getDescriptors().keySet().iterator();
             while (iterator.hasNext()) {
                 Class cls = (Class)iterator.next();
                 String packageName = Helper.getPackageName(cls);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/employee/EmployeeBasicTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/employee/EmployeeBasicTestModel.java
index d74c739..0babde8 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/employee/EmployeeBasicTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/employee/EmployeeBasicTestModel.java
@@ -85,9 +85,9 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
-        Class largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
-        Class smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
+        Class<Employee> employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+        Class<LargeProject> largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
+        Class<SmallProject> smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0001")));
@@ -179,9 +179,9 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
-        Class largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
-        Class smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
+        Class<Employee> employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+        Class<LargeProject> largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
+        Class<SmallProject> smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -226,9 +226,9 @@
         suite.setName("EmployeeUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the employee demo.");
 
-        Class employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
-        Class largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
-        Class smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
+        Class<Employee> employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+        Class<LargeProject> largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
+        Class<SmallProject> smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/AddDescriptorsTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/AddDescriptorsTest.java
index 372fca0..e4d5403 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/AddDescriptorsTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/AddDescriptorsTest.java
@@ -21,6 +21,8 @@
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.testing.framework.*;
 
+import java.util.Iterator;
+
 // To make this test fail, comment a single line of code:
 //   session.clearLastDescriptorAccessed();
 // in org.eclipse.persistence.descriptors.ClassDescriptor.preInterfaceInitialization() method.
@@ -38,7 +40,7 @@
             // The test has failed - at least one "old" descriptor is referenced by a new descriptor.
             // To ensure consistency, remove EmployeeSystem interface descriptors first,
             // then add all EmployeeSystem descriptors again
-            java.util.Iterator iterator = getSession().getDescriptors().keySet().iterator();
+            Iterator<Class<?>> iterator = getSession().getDescriptors().keySet().iterator();
             while (iterator.hasNext()) {
                 Class cls = (Class)iterator.next();
                 String packageName = Helper.getPackageName(cls);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/ContainerCloningTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/ContainerCloningTest.java
index 72a93b8..7d9093f 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/ContainerCloningTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/ContainerCloningTest.java
@@ -39,7 +39,7 @@
     public void test() {
         ContainerPolicy cp = new CollectionContainerPolicy();
         cp.setContainerClass(ClassConstants.ArrayList_class);
-        Collection originalC = java.util.Arrays.asList(new Employee());
+        Collection<Employee> originalC = java.util.Arrays.asList(new Employee());
         Collection cloneC = (Collection)cp.cloneFor(originalC);
 
         cp = new MapContainerPolicy();
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/ExceptionHandlerLoginIntegrityTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/ExceptionHandlerLoginIntegrityTest.java
index dd2ba72..7b61139 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/ExceptionHandlerLoginIntegrityTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/feature/ExceptionHandlerLoginIntegrityTest.java
@@ -19,6 +19,8 @@
 import org.eclipse.persistence.testing.models.employee.relational.*;
 import org.eclipse.persistence.mappings.*;
 
+import java.util.Map;
+
 /**
  * To test the functionality of ExceptionHandler.
  * ExceptionHandler can catch errors that occur on queries or during database access.
@@ -63,7 +65,7 @@
         login = getSession().getLogin();
         project = new EmployeeProject();
         project.setLogin(login);
-        java.util.Map descriptors = project.getDescriptors();
+        Map<Class<?>, ClassDescriptor> descriptors = project.getDescriptors();
 
         //java.util.Enumeration e =ht.elements();(Descriptor)e.nextElement();
         ClassDescriptor descriptor = (ClassDescriptor)descriptors.get(org.eclipse.persistence.testing.models.employee.domain.Employee.class);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/history/HistoricalQualifiedTableEmployeeSystem.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/history/HistoricalQualifiedTableEmployeeSystem.java
index a39c307..f3d911f 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/history/HistoricalQualifiedTableEmployeeSystem.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/history/HistoricalQualifiedTableEmployeeSystem.java
@@ -46,20 +46,20 @@
 
         ManyToManyMapping mapping = (ManyToManyMapping)empDescriptor.getMappingForAttributeName("projects");
         String oldRelationTableName = mapping.getRelationTableName();
-        List oldHistoricalTableNames = mapping.getHistoryPolicy().getHistoryTableNames();
+        List<String> oldHistoricalTableNames = mapping.getHistoryPolicy().getHistoryTableNames();
         mapping.getHistoryPolicy().setHistoricalTables(new Vector(1));
         for (int i = 0; i < oldHistoricalTableNames.size(); i++) {
             mapping.getHistoryPolicy().addHistoryTableName(user + "." + oldHistoricalTableNames.get(i));
         }
         mapping.setRelationTableName(user + "." + oldRelationTableName);
 
-        Vector targetRelationKeyFields = mapping.getTargetKeyFields();
+        Vector<DatabaseField> targetRelationKeyFields = mapping.getTargetKeyFields();
         for (int i = 0; i < targetRelationKeyFields.size(); i++) {
             String oldName = ((DatabaseField)targetRelationKeyFields.get(i)).getTable().getName();
             ((DatabaseField)targetRelationKeyFields.get(i)).setTableName(user + "." + oldName);
         }
 
-        Vector sourceRelationKeyFields = mapping.getSourceRelationKeyFields();
+        Vector<DatabaseField> sourceRelationKeyFields = mapping.getSourceRelationKeyFields();
         for (int i = 0; i < sourceRelationKeyFields.size(); i++) {
             String oldName = ((DatabaseField)sourceRelationKeyFields.get(i)).getTable().getName();
             ((DatabaseField)sourceRelationKeyFields.get(i)).setTableName(user + "." + oldName);
@@ -67,7 +67,7 @@
 
         DirectCollectionMapping dcmapping = (DirectCollectionMapping)empDescriptor.getMappingForAttributeName("responsibilitiesList");
         String oldReferenceTableName = dcmapping.getReferenceTableName();
-        List oldDCHistoricalTableNames = dcmapping.getHistoryPolicy().getHistoryTableNames();
+        List<String> oldDCHistoricalTableNames = dcmapping.getHistoryPolicy().getHistoryTableNames();
         dcmapping.getHistoryPolicy().setHistoricalTables(new Vector(1));
         for (int i = 0; i < oldDCHistoricalTableNames.size(); i++) {
             dcmapping.getHistoryPolicy().addHistoryTableName(user + "." + oldDCHistoricalTableNames.get(i));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/history/IsolatedSessionHistoricalTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/history/IsolatedSessionHistoricalTest.java
index 88920fc..4983d4e 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/history/IsolatedSessionHistoricalTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/history/IsolatedSessionHistoricalTest.java
@@ -16,6 +16,7 @@
 
 import java.util.*;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.testing.framework.*;
 import org.eclipse.persistence.queries.*;
 import org.eclipse.persistence.history.*;
@@ -40,7 +41,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             descriptors.addElement(iterator.next());
         }
         this.server.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/CleanupCacheKeyCorrectnessTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/CleanupCacheKeyCorrectnessTest.java
index 31d89f7..a259974 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/CleanupCacheKeyCorrectnessTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/CleanupCacheKeyCorrectnessTest.java
@@ -69,7 +69,7 @@
 
     @Override
     public void test() {
-        List employees = new ArrayList<Employee>(numberOfObjectsToCreate);
+        List<Employee> employees = new ArrayList<>(numberOfObjectsToCreate);
 
         UnitOfWork uow = getSession().acquireUnitOfWork();
         for (int i = 0; i < numberOfObjectsToCreate; i++) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ConcurrentIdentityMapKeyEnumerationTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ConcurrentIdentityMapKeyEnumerationTest.java
index 91f9a85..e1adb2b 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ConcurrentIdentityMapKeyEnumerationTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ConcurrentIdentityMapKeyEnumerationTest.java
@@ -48,7 +48,7 @@
             @Override
             public void run() {
                 while (shouldRun) {
-                    Enumeration keys = identityMap.keys();
+                    Enumeration<CacheKey> keys = identityMap.keys();
                     while (keys.hasMoreElements()) {
                         try {
                             Object key = keys.nextElement();
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ConcurrentReadBigBadObjectTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ConcurrentReadBigBadObjectTest.java
index b68d685..0569a42 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ConcurrentReadBigBadObjectTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ConcurrentReadBigBadObjectTest.java
@@ -56,7 +56,7 @@
         ClassDescriptor d = (server.serverSession).getClassDescriptor(BigBadObject.class);
         DatabaseMapping m;
 
-        Vector v = d.getMappings();
+        Vector<DatabaseMapping> v = d.getMappings();
         int mappings = v.size();
         int i = 0;
         while (i < mappings) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/InsertWeakIdentityMapTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/InsertWeakIdentityMapTest.java
index ad591e0..68dec72 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/InsertWeakIdentityMapTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/InsertWeakIdentityMapTest.java
@@ -92,8 +92,8 @@
         }
         // Check that all the CacheReferences (WeakCacheReferences) are null, since
         // they all should have been garbage collected.
-        Map cache = getIdentityMap().getCacheKeys();
-        for (Iterator iterator = cache.values().iterator(); iterator.hasNext(); ) {
+        Map<Object, CacheKey> cache = getIdentityMap().getCacheKeys();
+        for (Iterator<CacheKey> iterator = cache.values().iterator(); iterator.hasNext(); ) {
             CacheKey key = (CacheKey)iterator.next();
             if (key.getObject() != null) {
                 throw new TestErrorException("A WeakCacheKey with a non-empty WeakReference was found. The garbage collection did not clear the cache as expected.");
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ReadSoftCacheWeakIdentityMapTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ReadSoftCacheWeakIdentityMapTest.java
index a464669..6567bfb 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ReadSoftCacheWeakIdentityMapTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ReadSoftCacheWeakIdentityMapTest.java
@@ -62,9 +62,9 @@
     public void verify() {
         // Ensure that some ref have garbage collected,
         // if not all through warning as different VM have different gc behavior.
-        Map cache = getIdentityMap().getCacheKeys();
+        Map<Object, CacheKey> cache = getIdentityMap().getCacheKeys();
         int numObjects = 0;
-        for (Iterator iterator = cache.values().iterator(); iterator.hasNext();) {
+        for (Iterator<CacheKey> iterator = cache.values().iterator(); iterator.hasNext();) {
             CacheKey key = (CacheKey)iterator.next();
             if (key.getObject() != null) {
                 numObjects++;
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ReadWeakIdentityMapTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ReadWeakIdentityMapTest.java
index a958852..e3b43bb 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ReadWeakIdentityMapTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/ReadWeakIdentityMapTest.java
@@ -79,9 +79,9 @@
 
             // Ensure that some ref have garbage collected,
             // if not all through warning as different VM have different gc behavior.
-            Map cache = getIdentityMap().getCacheKeys();
+            Map<Object, CacheKey> cache = getIdentityMap().getCacheKeys();
             numObjects = 0;
-            for (Iterator iterator = cache.values().iterator(); iterator.hasNext();) {
+            for (Iterator<CacheKey> iterator = cache.values().iterator(); iterator.hasNext();) {
                 CacheKey key = (CacheKey)iterator.next();
                 if (key.getObject() != null) {
                     numObjects++;
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cache/ConcurrentReadBigBadObjectTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cache/ConcurrentReadBigBadObjectTest.java
index 26a0865..58f8564 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cache/ConcurrentReadBigBadObjectTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cache/ConcurrentReadBigBadObjectTest.java
@@ -56,7 +56,7 @@
         ClassDescriptor d = (server.serverSession).getClassDescriptor(BigBadObject.class);
         DatabaseMapping m;
 
-        Vector v = d.getMappings();
+        Vector<DatabaseMapping> v = d.getMappings();
         int mappings = v.size();
         int i =0;
         while (i<mappings){
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cacheinvalidation/CacheExpiryReadAllQueryTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cacheinvalidation/CacheExpiryReadAllQueryTest.java
index fe52136..831b59a 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cacheinvalidation/CacheExpiryReadAllQueryTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cacheinvalidation/CacheExpiryReadAllQueryTest.java
@@ -56,7 +56,7 @@
         }
 
         // Changed the names of all the employees in the cache
-        Enumeration employeeMap = ((AbstractSession)getSession()).getIdentityMapAccessorInstance().getIdentityMap(Employee.class).keys();
+        Enumeration<CacheKey> employeeMap = ((AbstractSession)getSession()).getIdentityMapAccessorInstance().getIdentityMap(Employee.class).keys();
         while (employeeMap.hasMoreElements()) {
             Employee employee = (Employee)((CacheKey)employeeMap.nextElement()).getObject();
             employee.setFirstName(employee.getFirstName() + "-mutated");
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cacheinvalidation/UnitOfWorkRefreshAfterInvalidationTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cacheinvalidation/UnitOfWorkRefreshAfterInvalidationTest.java
index 4d80b61..669755a 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cacheinvalidation/UnitOfWorkRefreshAfterInvalidationTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/identitymaps/cacheinvalidation/UnitOfWorkRefreshAfterInvalidationTest.java
@@ -76,7 +76,7 @@
     @Override
     public void verify() {
         // check for duplicates
-        List statements = this.sqlTracker.getSqlStatements();
+        List<String> statements = this.sqlTracker.getSqlStatements();
         Vector errors = new Vector();
         for (int i = 0; i < statements.size(); i++) {
             String statement = (String)statements.get(i);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/InheritanceTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/InheritanceTestModel.java
index b2f91f1..437d887 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/InheritanceTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/InheritanceTestModel.java
@@ -375,8 +375,8 @@
         suite.setName("InheritanceUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the inheritance model.");
 
-        Class companyClass = Company.class;
-        Class personClass = Person.class;
+        Class<Company> companyClass = Company.class;
+        Class<Person> personClass = Person.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(Cat.class, "catExample1")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/STI_JoinedAttributeTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/STI_JoinedAttributeTest.java
index 44d8302..db7a7c9 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/STI_JoinedAttributeTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/STI_JoinedAttributeTest.java
@@ -79,7 +79,7 @@
     private static boolean isTestMethod(Method m) {
         String name= m.getName();
         Class[] parameters= m.getParameterTypes();
-        Class returnType= m.getReturnType();
+        Class<?> returnType= m.getReturnType();
         return parameters.length == 0 && name.startsWith("test") && returnType.equals(Void.TYPE);
      }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/insurance/InsuranceBasicTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/insurance/InsuranceBasicTestModel.java
index a570888..d7e80ea 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/insurance/InsuranceBasicTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/insurance/InsuranceBasicTestModel.java
@@ -78,7 +78,7 @@
         suite.setName("InsuranceDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the insurance demo.");
 
-        Class holderClass = PolicyHolder.class;
+        Class<PolicyHolder> holderClass = PolicyHolder.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new DeleteObjectTest(manager.getObject(holderClass, "example1")));
@@ -130,7 +130,7 @@
         suite.setName("InsuranceReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the insurance demo.");
 
-        Class holderClass = PolicyHolder.class;
+        Class<PolicyHolder> holderClass = PolicyHolder.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(holderClass, "example1")));
@@ -146,7 +146,7 @@
         suite.setName("InsuranceUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the insurance demo.");
 
-        Class holderClass = PolicyHolder.class;
+        Class<PolicyHolder> holderClass = PolicyHolder.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(holderClass, "example1")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/interfaces/DescriptorInitTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/interfaces/DescriptorInitTest.java
index d4a8087..6c488f2 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/interfaces/DescriptorInitTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/interfaces/DescriptorInitTest.java
@@ -19,6 +19,8 @@
 import org.eclipse.persistence.testing.framework.*;
 import org.eclipse.persistence.testing.models.interfaces.*;
 
+import java.util.Iterator;
+
 public class DescriptorInitTest extends TestCase {
     public Project project;
     public DatabaseSession dbsession;
@@ -48,7 +50,7 @@
 
     @Override
     public void test() {
-        for (java.util.Iterator iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
             String className = descriptor.getJavaClass().toString();
 
@@ -81,7 +83,7 @@
     @Override
     public void verify() {
         //Make sure all Descriptors have been initialized.
-        for (java.util.Iterator iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
             if (!descriptor.isFullyInitialized()) {
                 throw new TestErrorException("Descriptor \"" + descriptor + "\" is NOT INITIALIZED");
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ClientServerTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ClientServerTest.java
index 40084fe..2d821f8 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ClientServerTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ClientServerTest.java
@@ -57,7 +57,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             ClassDescriptor desc = (ClassDescriptor)iterator.next();
             descriptors.addElement(desc);
             // it's an isolated descriptor, but the test requires no isolation.
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ExceptionOnIsolatedReference.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ExceptionOnIsolatedReference.java
index 52e03e3..cdd9da8 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ExceptionOnIsolatedReference.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ExceptionOnIsolatedReference.java
@@ -32,7 +32,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             descriptors.addElement(iterator.next());
         }
         this.server.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ExclusiveConnectionClosedExceptionTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ExclusiveConnectionClosedExceptionTest.java
index 6519485..3333a7f 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ExclusiveConnectionClosedExceptionTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/ExclusiveConnectionClosedExceptionTest.java
@@ -16,6 +16,7 @@
 
 import java.util.*;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.testing.framework.*;
 import org.eclipse.persistence.queries.*;
 import org.eclipse.persistence.sessions.*;
@@ -58,7 +59,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             descriptors.addElement(iterator.next());
         }
         this.server.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/IsolatedEmployee.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/IsolatedEmployee.java
index d11ce53..d4cd001 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/IsolatedEmployee.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/IsolatedEmployee.java
@@ -178,8 +178,8 @@
         Time[] hours = new Time[2];
 
         /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-        hours[0] = (Time)session.getDatasourcePlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
-        hours[1] = (Time)session.getDatasourcePlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
+        hours[0] = session.getDatasourcePlatform().convertObject(row.get("START_TIME"), Time.class);
+        hours[1] = session.getDatasourcePlatform().convertObject(row.get("END_TIME"), Time.class);
         return hours;
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/IsolatedQueryTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/IsolatedQueryTest.java
index 33734f6..24ef0d0 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/IsolatedQueryTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/IsolatedQueryTest.java
@@ -16,6 +16,7 @@
 
 import java.util.*;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.testing.framework.*;
 import org.eclipse.persistence.queries.*;
 import org.eclipse.persistence.sessions.*;
@@ -37,7 +38,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             descriptors.addElement(iterator.next());
         }
         this.server.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/NoRowsUpdatedTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/NoRowsUpdatedTest.java
index ef9f82d..70e1bb6 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/NoRowsUpdatedTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/NoRowsUpdatedTest.java
@@ -16,6 +16,7 @@
 
 import java.util.*;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.testing.framework.*;
 import org.eclipse.persistence.queries.SQLCall;
 import org.eclipse.persistence.sessions.*;
@@ -37,7 +38,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             descriptors.addElement(iterator.next());
         }
         this.server.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/VPDSupportTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/VPDSupportTest.java
index 34191ad..9155c7b 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/VPDSupportTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/isolatedsession/VPDSupportTest.java
@@ -16,6 +16,7 @@
 
 import java.util.*;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.testing.framework.*;
 import org.eclipse.persistence.queries.SQLCall;
 import org.eclipse.persistence.sessions.*;
@@ -36,7 +37,7 @@
     public void copyDescriptors(Session session) {
         Vector descriptors = new Vector();
 
-        for (Iterator iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             descriptors.addElement(iterator.next());
         }
         this.server.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/ComplexReverseSqrtTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/ComplexReverseSqrtTest.java
index 2753fc7..e4a5131 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/ComplexReverseSqrtTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/ComplexReverseSqrtTest.java
@@ -24,8 +24,8 @@
         Employee emp2 = (Employee)getTestEmployees().lastElement();
 
         String ejbqlString;
-        double salarySquareRoot1 = Math.sqrt(((double) emp1.getSalary()));
-        double salarySquareRoot2 = Math.sqrt(((double) emp2.getSalary()));
+        double salarySquareRoot1 = Math.sqrt(emp1.getSalary());
+        double salarySquareRoot2 = Math.sqrt(emp2.getSalary());
 
         ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
         ejbqlString = ejbqlString + salarySquareRoot1;
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/ComplexSqrtTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/ComplexSqrtTest.java
index 2c8f94a..ba4284c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/ComplexSqrtTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/ComplexSqrtTest.java
@@ -24,8 +24,8 @@
         Employee emp2 = (Employee)getTestEmployees().lastElement();
 
         String ejbqlString;
-        double salarySquareRoot1 = Math.sqrt(((double) emp1.getSalary()));
-        double salarySquareRoot2 = Math.sqrt(((double) emp2.getSalary()));
+        double salarySquareRoot1 = Math.sqrt(emp1.getSalary());
+        double salarySquareRoot2 = Math.sqrt(emp2.getSalary());
 
         ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
         ejbqlString = ejbqlString + "(SQRT(emp.salary) = ";
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectComplexReverseSqrtTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectComplexReverseSqrtTest.java
index 9427935..43669ce 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectComplexReverseSqrtTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectComplexReverseSqrtTest.java
@@ -24,8 +24,8 @@
         Employee emp2 = (Employee)getTestEmployees().lastElement();
 
         String ejbqlString;
-        double salarySquareRoot1 = Math.sqrt(((double) emp1.getSalary()));
-        double salarySquareRoot2 = Math.sqrt(((double) emp2.getSalary()));
+        double salarySquareRoot1 = Math.sqrt(emp1.getSalary());
+        double salarySquareRoot2 = Math.sqrt(emp2.getSalary());
 
         ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
         ejbqlString = ejbqlString + salarySquareRoot1;
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectComplexSqrtTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectComplexSqrtTest.java
index a3396ee..d221a55 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectComplexSqrtTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectComplexSqrtTest.java
@@ -24,8 +24,8 @@
         Employee emp2 = (Employee)getTestEmployees().lastElement();
 
         String ejbqlString;
-        double salarySquareRoot1 = Math.sqrt(((double) emp1.getSalary()));
-        double salarySquareRoot2 = Math.sqrt(((double) emp2.getSalary()));
+        double salarySquareRoot1 = Math.sqrt(emp1.getSalary());
+        double salarySquareRoot2 = Math.sqrt(emp2.getSalary());
 
         ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
         ejbqlString = ejbqlString + "(SQRT(emp.salary) = ";
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectSimpleReverseSqrtTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectSimpleReverseSqrtTest.java
index a0009d8..0b9b9c4 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectSimpleReverseSqrtTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectSimpleReverseSqrtTest.java
@@ -22,7 +22,7 @@
         setTestEmployees(getExtraEmployees());
         Employee emp = (Employee)getTestEmployees().firstElement();
 
-        double salarySquareRoot = Math.sqrt(((double) emp.getSalary()));
+        double salarySquareRoot = Math.sqrt(emp.getSalary());
         String ejbqlString;
 
         ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectSimpleSqrtTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectSimpleSqrtTest.java
index 35c7271..1e8ac82 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectSimpleSqrtTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SelectSimpleSqrtTest.java
@@ -22,7 +22,7 @@
         setTestEmployees(getExtraEmployees());
         Employee emp = (Employee)getTestEmployees().firstElement();
 
-        double salarySquareRoot = Math.sqrt(((double) emp.getSalary()));
+        double salarySquareRoot = Math.sqrt(emp.getSalary());
         String ejbqlString;
 
         ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SimpleReverseSqrtTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SimpleReverseSqrtTest.java
index d49b922..e142ce7 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SimpleReverseSqrtTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SimpleReverseSqrtTest.java
@@ -22,7 +22,7 @@
         setTestEmployees(getExtraEmployees());
         Employee emp = (Employee)getTestEmployees().firstElement();
 
-        double salarySquareRoot = Math.sqrt(((double) emp.getSalary()));
+        double salarySquareRoot = Math.sqrt(emp.getSalary());
         String ejbqlString;
 
         ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SimpleSqrtTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SimpleSqrtTest.java
index fa492bf..b5f5769 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SimpleSqrtTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/jpql/SimpleSqrtTest.java
@@ -22,7 +22,7 @@
         setTestEmployees(getExtraEmployees());
         Employee emp = (Employee)getTestEmployees().firstElement();
 
-        double salarySquareRoot = Math.sqrt(((double) emp.getSalary()));
+        double salarySquareRoot = Math.sqrt(emp.getSalary());
         String ejbqlString;
 
         ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/legacy/LegacyTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/legacy/LegacyTestModel.java
index c5ddb4b..d7f75ad 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/legacy/LegacyTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/legacy/LegacyTestModel.java
@@ -59,7 +59,7 @@
         suite.setName("LegacyDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the mapping model.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new DeleteObjectTest(manager.getObject(employeeClass, "example1")));
@@ -96,7 +96,7 @@
         suite.setName("LegacyReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the mapping model.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "example1")));
@@ -111,7 +111,7 @@
         suite.setName("LegacyUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the mapping model.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "example1")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployee.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployee.java
index f543640..9c8c63e 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployee.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployee.java
@@ -131,8 +131,8 @@
         Time[] hours = new Time[2];
 
         /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-        hours[0] = (Time)session.getPlatform().convertObject(row.get("\u3066\u3068\u3042\u3064\u3068_\u3068\u3051\u3059\u304a"), java.sql.Time.class);
-        hours[1] = (Time)session.getPlatform().convertObject(row.get("\u304a\u305b\u3048_\u3068\u3051\u3059\u304a"), java.sql.Time.class);
+        hours[0] = session.getPlatform().convertObject(row.get("\u3066\u3068\u3042\u3064\u3068_\u3068\u3051\u3059\u304a"), Time.class);
+        hours[1] = session.getPlatform().convertObject(row.get("\u304a\u305b\u3048_\u3068\u3051\u3059\u304a"), Time.class);
         return hours;
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployeeBasicTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployeeBasicTestModel.java
index f821e9a..0bba589 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployeeBasicTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployeeBasicTestModel.java
@@ -26,7 +26,6 @@
 import org.eclipse.persistence.testing.framework.WriteObjectTest;
 import org.eclipse.persistence.testing.models.employee.domain.*;
 import org.eclipse.persistence.testing.models.employee.relational.EmployeeSystem;
-import org.eclipse.persistence.testing.tests.nls.japanese.NLSEmployee;
 
 /**
  * This model tests reading/writing/deleting through using the employee demo.
@@ -55,10 +54,10 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("[NLS_Japanese] This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = NLSEmployee.class;
+        Class<NLSEmployee> employeeClass = NLSEmployee.class;
 
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new NLSEmployeeDeleteTest(manager.getObject(employeeClass, "0001")));
@@ -122,9 +121,9 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("[NLS_Japanese] This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = NLSEmployee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<NLSEmployee> employeeClass = NLSEmployee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -161,9 +160,9 @@
         suite.setName("EmployeeUpdateObjectTestSuite");
         suite.setDescription("[NLS_Japanese] This suite tests the updating of each object in the employee demo.");
 
-        Class employeeClass = NLSEmployee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<NLSEmployee> employeeClass = NLSEmployee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/onetoonejointable/OneToOneJoinTableEmployeeBasicTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/onetoonejointable/OneToOneJoinTableEmployeeBasicTestModel.java
index ece665c..2b5803b 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/onetoonejointable/OneToOneJoinTableEmployeeBasicTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/onetoonejointable/OneToOneJoinTableEmployeeBasicTestModel.java
@@ -86,9 +86,9 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0001")));
@@ -185,9 +185,9 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -234,9 +234,9 @@
         suite.setName("EmployeeUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
@@ -764,7 +764,7 @@
         @Override
         protected void testBatchAttributes() {
             Vector result = (Vector) this.objectsFromDatabase;
-            List children = ((Employee) result.elementAt(0)).getChildren();
+            List<Child> children = ((Employee) result.elementAt(0)).getChildren();
             ((Employee) result.elementAt(0)).getResponsibilitiesList().size();
             ((Employee) result.elementAt(0)).getProjects().size();
             if ((children == null) || (children.size() == 0)) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/orderedlist/OrderListTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/orderedlist/OrderListTestModel.java
index 6496885..317fd05 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/orderedlist/OrderListTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/orderedlist/OrderListTestModel.java
@@ -25,6 +25,7 @@
 import org.eclipse.persistence.annotations.OrderCorrectionType;
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.descriptors.changetracking.AttributeChangeTrackingPolicy;
+import org.eclipse.persistence.descriptors.changetracking.ObjectChangePolicy;
 import org.eclipse.persistence.descriptors.changetracking.ObjectChangeTrackingPolicy;
 import org.eclipse.persistence.exceptions.QueryException;
 import org.eclipse.persistence.expressions.Expression;
@@ -358,7 +359,7 @@
         if(!isTopLevel) {
             if(changeTracking == ChangeTracking.ATTRIBUTE) {
                 // Save change policies for the all employee demo class in order to restore them at reset time.
-                Map originalChangeTrackingPolicies = new HashMap<Class, ObjectChangeTrackingPolicy>();
+                Map<Class, ObjectChangePolicy> originalChangeTrackingPolicies = new HashMap<>();
 
                 originalChangeTrackingPolicies.put(Employee.class, getSession().getDescriptor(Employee.class).getObjectChangePolicy());
                 getSession().getDescriptor(Employee.class).setObjectChangePolicy(new AttributeChangeTrackingPolicy());
@@ -1598,7 +1599,7 @@
                     addTo(managerClone, create("temp", 2));
                 }
             }
-            List list = createList();
+            List<List> list = createList();
             addTo(list, create("new", 0));
             addTo(list, create("new", 1));
             setListInto(managerClone, list);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/ownership/OwnershipTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/ownership/OwnershipTestModel.java
index 3c080ff..e4b742c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/ownership/OwnershipTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/ownership/OwnershipTestModel.java
@@ -46,7 +46,7 @@
         suite.setName("OwnershipDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the ownership model.");
 
-        Class objectAClass = ObjectA.class;
+        Class<ObjectA> objectAClass = ObjectA.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new DeleteObjectTest(manager.getObject(objectAClass, "example1")));
@@ -87,7 +87,7 @@
         suite.setName("OwnershipReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the ownership model.");
 
-        Class objectAClass = ObjectA.class;
+        Class<ObjectA> objectAClass = ObjectA.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(objectAClass, "example1")));
@@ -102,7 +102,7 @@
         suite.setName("OwnershipUnitOfWorkTestSuite");
         suite.setDescription("This suite verifies that UOW works in the ownership model");
 
-        Class objectAClass = ObjectA.class;
+        Class<ObjectA> objectAClass = ObjectA.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new UnitOfWorkTest(manager.getObject(objectAClass, "example1")));
@@ -117,7 +117,7 @@
         suite.setName("OwnershipUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the ownership model.");
 
-        Class objectAClass = ObjectA.class;
+        Class<ObjectA> objectAClass = ObjectA.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(objectAClass, "example1")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/concurrent/IsolatedConcurrentRegressionTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/concurrent/IsolatedConcurrentRegressionTest.java
index 229e4d0..2119fc3 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/concurrent/IsolatedConcurrentRegressionTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/concurrent/IsolatedConcurrentRegressionTest.java
@@ -33,8 +33,8 @@
     @Override
     public void setup() {
         super.setup();
-        for (Iterator descriptors = getServerSession().getDescriptors().values().iterator();
-                 descriptors.hasNext();) {
+        for (Iterator<ClassDescriptor> descriptors = getServerSession().getDescriptors().values().iterator();
+             descriptors.hasNext();) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.ISOLATED);
         }
@@ -47,8 +47,8 @@
     @Override
     public void reset() {
         super.reset();
-        for (Iterator descriptors = getServerSession().getDescriptors().values().iterator();
-                 descriptors.hasNext();) {
+        for (Iterator<ClassDescriptor> descriptors = getServerSession().getDescriptors().values().iterator();
+             descriptors.hasNext();) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.SHARED);
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/concurrent/IsolatedConcurrentTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/concurrent/IsolatedConcurrentTest.java
index be3e569..efe760d 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/concurrent/IsolatedConcurrentTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/concurrent/IsolatedConcurrentTest.java
@@ -33,8 +33,8 @@
     @Override
     public void setup() {
         super.setup();
-        for (Iterator descriptors = getServerSession().getDescriptors().values().iterator();
-                 descriptors.hasNext();) {
+        for (Iterator<ClassDescriptor> descriptors = getServerSession().getDescriptors().values().iterator();
+             descriptors.hasNext();) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.ISOLATED);
         }
@@ -47,8 +47,8 @@
     @Override
     public void reset() {
         super.reset();
-        for (Iterator descriptors = getServerSession().getDescriptors().values().iterator();
-                 descriptors.hasNext();) {
+        for (Iterator<ClassDescriptor> descriptors = getServerSession().getDescriptors().values().iterator();
+             descriptors.hasNext();) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.SHARED);
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/ClassForNameTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/ClassForNameTest.java
index 7c1a133..a25c08f 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/ClassForNameTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/ClassForNameTest.java
@@ -14,13 +14,14 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.testing.tests.performance.java;
 
+import org.eclipse.persistence.Version;
 import org.eclipse.persistence.testing.framework.*;
 
 /**
  * This test compares the performance between .class and a static variable.
  */
 public class ClassForNameTest extends PerformanceComparisonTestCase {
-    public static Class TOPLINK = org.eclipse.persistence.Version.class;
+    public static Class<Version> TOPLINK = org.eclipse.persistence.Version.class;
 
     public ClassForNameTest() {
         setName("static vs class forName PerformanceComparisonTest");
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/DoPrivilegedTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/DoPrivilegedTest.java
index 5271c5c..5befd09 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/DoPrivilegedTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/DoPrivilegedTest.java
@@ -145,16 +145,16 @@
         String fieldValue = "TopLink Blah";
         String methodName = "setProduct";
 
-        Class clazz = null;
+        Class<?> clazz = null;
         Version version = null;
         Method method = null;
         try {
-            clazz = AccessController.doPrivileged(new PrivilegedClassForName(className));
-            Class[] methodParameterTypes = { AccessController.doPrivileged(new PrivilegedClassForName("java.lang.String")) };
+            clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(className));
+            Class<?>[] methodParameterTypes = { AccessController.doPrivileged(new PrivilegedClassForName<>("java.lang.String")) };
             ClassLoader clazzloader = AccessController.doPrivileged(new PrivilegedGetClassLoaderForClass(clazz));
             ClassLoader classloader = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-            AccessController.doPrivileged(new PrivilegedClassForName(className, true, clazzloader));
-            version = (Version)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(clazz));
+            AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, clazzloader));
+            version = (Version)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(clazz));
 
             Field[] fields = AccessController.doPrivileged(new PrivilegedGetFields(clazz));
             Field field = AccessController.doPrivileged(new PrivilegedGetDeclaredField(clazz, fieldName, true));
@@ -176,7 +176,7 @@
             Object[] parameters = { "TopLink Blah." };
             AccessController.doPrivileged(new PrivilegedMethodInvoker(method, version, parameters));
 
-            Constructor constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(clazz, null, true));
+            Constructor<?> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(clazz, null, true));
             Constructor declaredConstructor = AccessController.doPrivileged(new PrivilegedGetDeclaredConstructorFor(clazz, null, true));
             AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, null));
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/FieldTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/FieldTest.java
index 4e941f9..267921b 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/FieldTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/performance/java/FieldTest.java
@@ -72,7 +72,7 @@
         PerformanceComparisonTestCase test = new PerformanceComparisonTestCase() {
             protected Object variable;
 
-            public Class object = Object.class;
+            public Class<Object> object = Object.class;
 
             @Override
             public void test() {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/plsql/PLSQLTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/plsql/PLSQLTest.java
index 02ebf23..df60c66 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/plsql/PLSQLTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/plsql/PLSQLTest.java
@@ -78,7 +78,7 @@
         if (this.result instanceof DatabaseRecord) {
             DatabaseRecord record = (DatabaseRecord)this.result;
             DatabaseRecord queryRecord = (DatabaseRecord)queryResult;
-            for (Iterator iterator = record.getFields().iterator(); iterator.hasNext(); ) {
+            for (Iterator<DatabaseField> iterator = record.getFields().iterator(); iterator.hasNext(); ) {
                 DatabaseField field = (DatabaseField)iterator.next();
                 Object value = record.get(field);
                 Object queryValue = queryRecord.get(field);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/ObjectLevelReadQueryTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/ObjectLevelReadQueryTest.java
index 6d64137..0fb01a3 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/ObjectLevelReadQueryTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/ObjectLevelReadQueryTest.java
@@ -50,7 +50,7 @@
     protected Session session;
 
     /** Some entity to be used in query. */
-    protected final Class entity = Employee.class;
+    protected final Class<Employee> entity = Employee.class;
 
     /** Some SQL call to be used in query. */
     protected final SQLCall call = new SQLCall("SELECT t0.EMP_ID FROM EMPLOYEE t0");
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/QueryFrameworkTestSuite.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/QueryFrameworkTestSuite.java
index e15d557..95581d7 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/QueryFrameworkTestSuite.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/QueryFrameworkTestSuite.java
@@ -15,11 +15,12 @@
 package org.eclipse.persistence.testing.tests.queries;
 
 import java.util.*;
+
+import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.testing.models.employee.domain.*;
 import org.eclipse.persistence.testing.models.employee.domain.Project;
 import org.eclipse.persistence.sessions.*;
 import org.eclipse.persistence.expressions.*;
-import org.eclipse.persistence.internal.sessions.*;
 import org.eclipse.persistence.queries.*;
 import org.eclipse.persistence.sessions.Record;
 import org.eclipse.persistence.testing.framework.*;
@@ -689,7 +690,7 @@
                 ComplexQueryResult result = (ComplexQueryResult) getSession().executeQuery(query);
                 DatabaseRecord record = (DatabaseRecord)((List)result.getData()).get(0);
                 Iterator keySetKeys = record.keySet().iterator();
-                Iterator keys = record.getFields().iterator();
+                Iterator<DatabaseField> keys = record.getFields().iterator();
                 while (keys.hasNext() || keySetKeys.hasNext()) {
                     if (keys.next() != keySetKeys.next()) {
                         throwError("KeySet is incorrect.");
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/CountReportQueryTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/CountReportQueryTest.java
index b6bd55f..3e9240a 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/CountReportQueryTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/CountReportQueryTest.java
@@ -57,8 +57,8 @@
         }
         BigDecimal expected = (BigDecimal)((ReportQueryResult)expectedResults.firstElement()).getByIndex(0);
         BigDecimal result =
-            (BigDecimal)ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0),
-                                                                            BigDecimal.class);
+                ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0),
+                                                                                BigDecimal.class);
         if (!Helper.compareBigDecimals(expected, result)) {
             throw new TestErrorException("ReportQuery test failed: The results did not match (" + expected + ", " +
                                          result + ")");
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/ParameterizedSubqueryTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/ParameterizedSubqueryTest.java
index 8f78c02..a929db1 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/ParameterizedSubqueryTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/ParameterizedSubqueryTest.java
@@ -96,7 +96,7 @@
     @Override
     public void test() {
         try {
-            List arguments = new ArrayList<Object>();
+            List<Object> arguments = new ArrayList<>();
             arguments.add(employeeId);
             arguments.add(projectName);
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9a.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9a.java
index b6adaf5..299830b 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9a.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9a.java
@@ -51,7 +51,7 @@
             throw new TestErrorException("ReportQuery test failed: The result size are different");
         }
         BigDecimal expected = (BigDecimal)((ReportQueryResult)expectedResults.firstElement()).getByIndex(0);
-        BigDecimal result = (BigDecimal)ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
+        BigDecimal result = ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
         if (!Helper.compareBigDecimals(expected, result)) {
             throw new TestErrorException("ReportQuery test failed: The results did not match (" + expected + ", " + result + ")");
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9b.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9b.java
index 7cd068e..74f287c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9b.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9b.java
@@ -55,7 +55,7 @@
             throw new TestErrorException("ReportQuery test failed: The result size are different");
         }
         BigDecimal expected = (BigDecimal)((ReportQueryResult)expectedResults.firstElement()).getByIndex(0);
-        BigDecimal result = (BigDecimal)ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
+        BigDecimal result = ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
         if (!Helper.compareBigDecimals(expected, result)) {
             throw new TestErrorException("ReportQuery test failed: The results did not match (" + expected + ", " + result + ")");
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9c.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9c.java
index 15056cb..879d5a6 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9c.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9c.java
@@ -56,7 +56,7 @@
             throw new TestErrorException("ReportQuery test failed: The result size are different");
         }
         BigDecimal expected = (BigDecimal)((ReportQueryResult)expectedResults.firstElement()).getByIndex(0);
-        BigDecimal result = (BigDecimal)ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
+        BigDecimal result = ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
         if (!Helper.compareBigDecimals(expected, result)) {
             throw new TestErrorException("ReportQuery test failed: The results did not match (" + expected + ", " + result + ")");
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9d.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9d.java
index c9df6c2..e0c9565 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9d.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9d.java
@@ -58,7 +58,7 @@
             throw new TestErrorException("ReportQuery test failed: The result size are different");
         }
         BigDecimal expected = (BigDecimal)((ReportQueryResult)expectedResults.firstElement()).getByIndex(0);
-        BigDecimal result = (BigDecimal)ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
+        BigDecimal result = ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
         if (!Helper.compareBigDecimals(expected, result)) {
             throw new TestErrorException("ReportQuery test failed: The results did not match (" + expected + ", " + result + ")");
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9e.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9e.java
index 98ebe3d..a8e1398 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9e.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9e.java
@@ -58,7 +58,7 @@
             throw new TestErrorException("ReportQuery test failed: The result size are different");
         }
         BigDecimal expected = (BigDecimal)((ReportQueryResult)expectedResults.firstElement()).getByIndex(0);
-        BigDecimal result = (BigDecimal)ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
+        BigDecimal result = ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
         if (!Helper.compareBigDecimals(expected, result)) {
             throw new TestErrorException("ReportQuery test failed: The results did not match (" + expected + ", " + result + ")");
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9j.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9j.java
index 3b4c8f8..07f053b 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9j.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/report/Scenario1_9j.java
@@ -51,7 +51,7 @@
             throw new TestErrorException("ReportQuery test failed: The result size are different");
         }
         BigDecimal expected = (BigDecimal)((ReportQueryResult)expectedResults.firstElement()).getByIndex(0);
-        BigDecimal result = (BigDecimal)ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
+        BigDecimal result = ConversionManager.getDefaultManager().convertObject(((ReportQueryResult)results.firstElement()).getByIndex(0), BigDecimal.class);
         if (!Helper.compareBigDecimals(expected, result)) {
             throw new TestErrorException("ReportQuery test failed: The results did not match (" + expected + ", " + result + ")");
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/remote/RMIServerManagerController.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/remote/RMIServerManagerController.java
index b31ddcd..a9593dc 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/remote/RMIServerManagerController.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/remote/RMIServerManagerController.java
@@ -54,9 +54,9 @@
             }
         } else {
             try {
-                Class cls = Class.forName(controllerClassName);
+                Class<?> cls = Class.forName(controllerClassName);
                 Class[] parameterTypes = { org.eclipse.persistence.sessions.Session.class };
-                Constructor constructor = cls.getConstructor(parameterTypes);
+                Constructor<?> constructor = cls.getConstructor(parameterTypes);
                 Object[] params = { getSession() };
                 controller = (RMIRemoteSessionController)constructor.newInstance(params);
             } catch (Exception exception) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/remote/RemoteConnectionExceptionsTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/remote/RemoteConnectionExceptionsTest.java
index fb00680..5d9e5bf 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/remote/RemoteConnectionExceptionsTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/remote/RemoteConnectionExceptionsTest.java
@@ -51,7 +51,7 @@
     protected Vector args;
 
     protected void setRemoteConnection(RemoteConnection remoteConnection) {
-        Class cls = remoteConnection.getClass();
+        Class<? extends RemoteConnection> cls = remoteConnection.getClass();
         if (!remoteConnectionClass.equals(cls)) {
             throw new TestProblemException("remoteConnection's type is different from the type used to create the test");
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/InsertUpdateStoredProcedureAdapter.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/InsertUpdateStoredProcedureAdapter.java
index 014cc85..190f6c8 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/InsertUpdateStoredProcedureAdapter.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/InsertUpdateStoredProcedureAdapter.java
@@ -70,7 +70,7 @@
 
     protected int removeOptimisticLocking(Project project) {
         int removed = 0;
-        Iterator descriptors = project.getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = project.getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
             ClassDescriptor desc = (ClassDescriptor)descriptors.next();
             if (desc.getOptimisticLockingPolicy() != null) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/StoredProcedureGeneratorForAdapter.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/StoredProcedureGeneratorForAdapter.java
index 6da1deb..2f5a42c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/StoredProcedureGeneratorForAdapter.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/StoredProcedureGeneratorForAdapter.java
@@ -58,8 +58,8 @@
      */
     public void generateInsertStoredProceduresDefinitionsForProject(Project project) {
         verifyProject(project);
-        Map descrpts = project.getDescriptors();
-        Iterator iterator = descrpts.keySet().iterator();
+        Map<Class<?>, ClassDescriptor> descrpts = project.getDescriptors();
+        Iterator<Class<?>> iterator = descrpts.keySet().iterator();
         ClassDescriptor desc;
         while (iterator.hasNext()) {
             desc = (ClassDescriptor)descrpts.get(iterator.next());
@@ -78,8 +78,8 @@
 
     public void generateUpdateStoredProceduresDefinitionsForProject(Project project) {
         verifyProject(project);
-        Map descrpts = project.getDescriptors();
-        Iterator iterator = descrpts.keySet().iterator();
+        Map<Class<?>, ClassDescriptor> descrpts = project.getDescriptors();
+        Iterator<Class<?>> iterator = descrpts.keySet().iterator();
         ClassDescriptor desc;
         while (iterator.hasNext()) {
             desc = (ClassDescriptor)descrpts.get(iterator.next());
@@ -101,7 +101,7 @@
     }
 
     protected StoredProcedureDefinition generateStoredProcedureDefinition(ClassDescriptor desc, DatabaseQuery query, String namePrefix) {
-        Vector fields = desc.getFields();
+        Vector<DatabaseField> fields = desc.getFields();
         Hashtable namesNewToNames = null;
         if (shouldCapitalizeNames()) {
             namesNewToNames = new Hashtable();
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/SubstituteSequencingWithReturningPolicyAdapter.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/SubstituteSequencingWithReturningPolicyAdapter.java
index ccf7a29..4893340 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/SubstituteSequencingWithReturningPolicyAdapter.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/SubstituteSequencingWithReturningPolicyAdapter.java
@@ -74,7 +74,7 @@
 
     @Override
     public void updateProject(Project project, Session session) {
-        Iterator it = project.getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> it = project.getDescriptors().values().iterator();
         while (it.hasNext()) {
             ClassDescriptor desc = (ClassDescriptor)it.next();
             if (desc.isAggregateDescriptor()) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/model/AdapterWithReturnObjectControl.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/model/AdapterWithReturnObjectControl.java
index 35b5f3b..4aabca2 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/model/AdapterWithReturnObjectControl.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/model/AdapterWithReturnObjectControl.java
@@ -73,7 +73,7 @@
     }
 
     public void getChange(org.eclipse.persistence.sessions.Record row, Session session, Object object1, Object object2, ClassDescriptor desc, boolean useUOW, WriteType writeType) {
-        for (Enumeration mappings = desc.getMappings().elements(); mappings.hasMoreElements(); ) {
+        for (Enumeration<DatabaseMapping> mappings = desc.getMappings().elements(); mappings.hasMoreElements(); ) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
             if (!mapping.isReadOnly()) {
                 getChange(row, mapping, session, object1, object2, useUOW, writeType);
@@ -126,7 +126,7 @@
         Object object = desc.getObjectBuilder().buildNewInstance();
         ReadObjectQuery query = new ReadObjectQuery();
         query.setSession((AbstractSession)session);
-        for (Enumeration mappings = desc.getMappings().elements(); mappings.hasMoreElements(); ) {
+        for (Enumeration<DatabaseMapping> mappings = desc.getMappings().elements(); mappings.hasMoreElements(); ) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
             mapping.readFromRowIntoObject((DatabaseRecord)row, query.getJoinedAttributeManager(), object, null, query, query.getSession(), true);
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/model/BaseClass.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/model/BaseClass.java
index a7c02c7..aa5b87d 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/model/BaseClass.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/returning/model/BaseClass.java
@@ -80,8 +80,8 @@
 
     public BigDecimal[] build_a_plus_minus_b_BigDecimal(org.eclipse.persistence.sessions.Record row, Session session) {
         BigDecimal[] a_plus_minus_b_BigDecimal = new BigDecimal[2];
-        BigDecimal a = (BigDecimal)session.getDatasourcePlatform().convertObject(row.get(getFieldAName()), BigDecimal.class);
-        BigDecimal b = (BigDecimal)session.getDatasourcePlatform().convertObject(row.get(getFieldBName()), BigDecimal.class);
+        BigDecimal a = session.getDatasourcePlatform().convertObject(row.get(getFieldAName()), BigDecimal.class);
+        BigDecimal b = session.getDatasourcePlatform().convertObject(row.get(getFieldBName()), BigDecimal.class);
         if (a == null || b == null) {
             a_plus_minus_b_BigDecimal[0] = null;
             a_plus_minus_b_BigDecimal[1] = null;
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionbroker/VerifyClientBrokerCreationTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionbroker/VerifyClientBrokerCreationTest.java
index e165bda..41f1fdf 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionbroker/VerifyClientBrokerCreationTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionbroker/VerifyClientBrokerCreationTest.java
@@ -102,7 +102,7 @@
             throw new TestErrorException("Incorrect number of sessions in client broker");
 
         }
-        Iterator i = serverBroker.getSessionsByName().keySet().iterator();
+        Iterator<String> i = serverBroker.getSessionsByName().keySet().iterator();
         while (i.hasNext()){
             String key = (String)i.next();
             if (clientBroker.getSessionForName(key) == null) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionsxml/SessionsXMLBasicTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionsxml/SessionsXMLBasicTestModel.java
index 5be0553..6f7cfd8 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionsxml/SessionsXMLBasicTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionsxml/SessionsXMLBasicTestModel.java
@@ -80,9 +80,9 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0001")));
@@ -144,9 +144,9 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -177,9 +177,9 @@
         suite.setName("EmployeeUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
@@ -215,9 +215,9 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0001")));
@@ -283,9 +283,9 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -318,9 +318,9 @@
         suite.setName("EmployeeUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionsxml/SessionsXMLTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionsxml/SessionsXMLTestModel.java
index a5599de..2758de3 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionsxml/SessionsXMLTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/sessionsxml/SessionsXMLTestModel.java
@@ -116,7 +116,7 @@
     public void addSessionsXMLSchemaWriteTest(TestSuite suite){
 
         try{
-            Class testCaseClass = Class.forName("org.eclipse.persistence.testing.tests.sessionsxml.SessionsXMLSchemaWriteTest");
+            Class<?> testCaseClass = Class.forName("org.eclipse.persistence.testing.tests.sessionsxml.SessionsXMLSchemaWriteTest");
             junit.framework.Test testCase = (junit.framework.Test)testCaseClass.getConstructor().newInstance();
             suite.addTest(testCase);
         } catch (Exception e){
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/DescriptorQueryManagerMultithreadedTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/DescriptorQueryManagerMultithreadedTest.java
index 46e6cc4..958b229 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/DescriptorQueryManagerMultithreadedTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/DescriptorQueryManagerMultithreadedTest.java
@@ -100,7 +100,7 @@
         super.setup();
         // save the current queries
         ClassDescriptor descriptor = getSession().getClassDescriptor(Employee.class);
-        Map queryTable = descriptor.getQueryManager().getQueries();
+        Map<String, List<DatabaseQuery>> queryTable = descriptor.getQueryManager().getQueries();
         if (queryTable != null) {
             queries = (Vector)queryTable.get(QUERY_STRING);
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/MultithreadTestCase.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/MultithreadTestCase.java
index dd8c472..c2b5bd7 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/MultithreadTestCase.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/MultithreadTestCase.java
@@ -16,6 +16,8 @@
 
 import java.io.*;
 import java.util.*;
+
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.internal.helper.*;
 import org.eclipse.persistence.sessions.*;
 import org.eclipse.persistence.sessions.server.*;
@@ -238,8 +240,8 @@
             serverSession.login();
 
             Vector descriptors = new Vector();
-            for (Iterator iterator = databaseSession.getDescriptors().values().iterator();
-                     iterator.hasNext();) {
+            for (Iterator<ClassDescriptor> iterator = databaseSession.getDescriptors().values().iterator();
+                 iterator.hasNext();) {
                 descriptors.addElement(iterator.next());
             }
             serverSession.addDescriptors(descriptors);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/SimultaneousTestsModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/SimultaneousTestsModel.java
index 051e446..0ce90de 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/SimultaneousTestsModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/simultaneous/SimultaneousTestsModel.java
@@ -16,6 +16,9 @@
 
 import java.util.Vector;
 import org.eclipse.persistence.sessions.*;
+import org.eclipse.persistence.testing.models.employee.domain.Employee;
+import org.eclipse.persistence.testing.models.employee.domain.LargeProject;
+import org.eclipse.persistence.testing.models.employee.domain.SmallProject;
 import org.eclipse.persistence.tools.schemaframework.PopulationManager;
 import org.eclipse.persistence.testing.framework.*;
 import org.eclipse.persistence.testing.models.employee.relational.EmployeeSystem;
@@ -81,9 +84,9 @@
         suite.setDescription("This suite tests the reading of all the objects of each class in the employee demo.");
 
         Vector tests = new Vector();
-        Class employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
-        Class largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
-        Class smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
+        Class<Employee> employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+        Class<LargeProject> largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
+        Class<SmallProject> smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         tests.add(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/tableswithspacesmodel/EmployeeWithSpacesTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/tableswithspacesmodel/EmployeeWithSpacesTestModel.java
index 133af20..cfbd46c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/tableswithspacesmodel/EmployeeWithSpacesTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/tableswithspacesmodel/EmployeeWithSpacesTestModel.java
@@ -70,9 +70,9 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new EmployeeWithSpacesDeleteTest(manager.getObject(employeeClass, "0001")));
@@ -162,9 +162,9 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -203,9 +203,9 @@
         suite.setName("EmployeeUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/transactions/ReadingThroughWriteConnectionInTransactionTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/transactions/ReadingThroughWriteConnectionInTransactionTest.java
index 906c408..698e787 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/transactions/ReadingThroughWriteConnectionInTransactionTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/transactions/ReadingThroughWriteConnectionInTransactionTest.java
@@ -282,7 +282,7 @@
         if (getBackupReadConnections() != null) {
             return;
         }
-        List readConnections = getServerSession().getReadConnectionPool().getConnectionsAvailable();
+        List<Accessor> readConnections = getServerSession().getReadConnectionPool().getConnectionsAvailable();
         setBackupReadConnections(new Vector(readConnections));
         readConnections.clear();
         readConnections.add(null);
@@ -312,7 +312,7 @@
             // as the result the write connection pool is not shutdown and the connections are leaked.
             // Let's close these connections here.
             try {
-                for (Iterator poolsEnum = ((ServerSession)getServerSession()).getConnectionPools().values().iterator(); poolsEnum.hasNext();) {
+                for (Iterator<ConnectionPool> poolsEnum = ((ServerSession)getServerSession()).getConnectionPools().values().iterator(); poolsEnum.hasNext();) {
                     ((ConnectionPool)poolsEnum.next()).shutDown();
                 }
             } catch (Exception ex) {
@@ -340,7 +340,7 @@
      */
     private void restoreServerReadConnections() {
         if (getBackupReadConnections() != null) {
-            List readConnections = getServerSession().getReadConnectionPool().getConnectionsAvailable();
+            List<Accessor> readConnections = getServerSession().getReadConnectionPool().getConnectionsAvailable();
             readConnections.clear();
             readConnections.addAll(getBackupReadConnections());
             setBackupReadConnections(null);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unidirectional/UnidirectionalEmployeeBasicTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unidirectional/UnidirectionalEmployeeBasicTestModel.java
index 0e35776..fb0039c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unidirectional/UnidirectionalEmployeeBasicTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unidirectional/UnidirectionalEmployeeBasicTestModel.java
@@ -67,7 +67,7 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = org.eclipse.persistence.testing.models.unidirectional.Employee.class;
+        Class<Employee> employeeClass = org.eclipse.persistence.testing.models.unidirectional.Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new DeleteObjectTest(manager.getObject(employeeClass, "0001")));
@@ -124,7 +124,7 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -148,7 +148,7 @@
         suite.setName("EmployeeComplexUpdateTestSuite");
         suite.setDescription("This suite tests the updating of each an employee by adding and/or removing managed employees and/or phones.");
 
-        Class employeeClass = Employee.class;
+        Class<Employee> employeeClass = Employee.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
         Employee originalEmployee = (Employee)manager.getObject(employeeClass, "0001");
         Employee otherEmployee = (Employee)manager.getObject(employeeClass, "0002");
@@ -378,7 +378,7 @@
             uow.registerObject(employee);
             uow.commit();
 
-            version[0] = (Long) getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
+            version[0] = getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
 
             // test1 - add managed employee, manager's version should increment.
             uow = getSession().acquireUnitOfWork();
@@ -386,14 +386,14 @@
             Employee employeeClone = (Employee)uow.registerObject(employee);
             managerClone.addManagedEmployee(employeeClone);
             uow.commit();
-            version[1] = (Long) getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
+            version[1] = getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
 
             // test2 - alter managed employee, manager's version should NOT increment.
             uow = getSession().acquireUnitOfWork();
             employeeClone = (Employee)uow.registerObject(employee);
             employeeClone.setFirstName("Altered");
             uow.commit();
-            version[2] = (Long) getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
+            version[2] = getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
 
             // test3- remove managed employee, manager's version should increment.
             uow = getSession().acquireUnitOfWork();
@@ -401,7 +401,7 @@
             employeeClone = (Employee)uow.registerObject(employee);
             managerClone.removeManagedEmployee(employeeClone);
             uow.commit();
-            version[3] = (Long) getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
+            version[3] = getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
 
             PhoneNumber phone = new PhoneNumber("home", "613", "1111111");
 
@@ -411,14 +411,14 @@
             PhoneNumber phoneClone = (PhoneNumber)uow.registerObject(phone);
             managerClone.addPhoneNumber(phoneClone);
             uow.commit();
-            version[4] = (Long) getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
+            version[4] = getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
 
             // test5- alter phone, manager's version should increment.
             uow = getSession().acquireUnitOfWork();
             phoneClone = (PhoneNumber)uow.registerObject(phone);
             phoneClone.setType("work");
             uow.commit();
-            version[5] = (Long) getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
+            version[5] = getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
 
             // test6- remove phone, manager's version should increment.
             uow = getSession().acquireUnitOfWork();
@@ -426,7 +426,7 @@
             phoneClone = (PhoneNumber)uow.registerObject(phone);
             managerClone.removePhoneNumber(phoneClone);
             uow.commit();
-            version[6] = (Long) getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
+            version[6] = getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(manager, manager.getId(), getAbstractSession());
         }
         @Override
         public void verify() {
@@ -598,7 +598,7 @@
             super();
         }
         long getVersion(Employee emp) {
-            return (Long) getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(emp, emp.getId(), getAbstractSession());
+            return getSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(emp, emp.getId(), getAbstractSession());
         }
         @Override
         public void reset() {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/MutableAttributeObject.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/MutableAttributeObject.java
index 845d75b..18de696 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/MutableAttributeObject.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/MutableAttributeObject.java
@@ -17,6 +17,7 @@
 import java.util.Vector;
 
 import org.eclipse.persistence.descriptors.*;
+import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.foundation.*;
 import org.eclipse.persistence.tools.schemaframework.TableDefinition;
 
@@ -154,7 +155,7 @@
         descriptor.addDirectMapping("utilDate", "UTIL_DATE");
 
         /* Configure all of the mappings as mutable, except the id mapping */
-        Vector mappings = descriptor.getMappings();
+        Vector<DatabaseMapping> mappings = descriptor.getMappings();
         for (int i = 0; i < mappings.size(); i++) {
             AbstractDirectMapping mapping = (AbstractDirectMapping)mappings.get(i);
             if (!mapping.getAttributeName().equalsIgnoreCase("id")) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/NoIdentityMergeCloneTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/NoIdentityMergeCloneTest.java
index 0e75bcd..524e011 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/NoIdentityMergeCloneTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/NoIdentityMergeCloneTest.java
@@ -66,7 +66,7 @@
         // because it may not be the same for all descriptors.
         this.checkCacheState = new Hashtable(10);
         this.identityMapTypes = new Hashtable(10);
-        Iterator iterator = getSession().getProject().getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> iterator = getSession().getProject().getDescriptors().values().iterator();
         while (iterator.hasNext()) {
             ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
             checkCacheState.put(descriptor,
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkIsolatedAlwaysTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkIsolatedAlwaysTestModel.java
index 6109986..407a9a2 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkIsolatedAlwaysTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkIsolatedAlwaysTestModel.java
@@ -34,7 +34,7 @@
 
     @Override
     public void setup() {
-        for (Iterator descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
+        for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setUnitOfWorkCacheIsolationLevel(ClassDescriptor.ISOLATE_CACHE_ALWAYS);
         }
@@ -43,7 +43,7 @@
 
     @Override
     public void reset() {
-        for (Iterator descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
+        for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setUnitOfWorkCacheIsolationLevel(ClassDescriptor.ISOLATE_NEW_DATA_AFTER_TRANSACTION);
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkIsolatedClientSessionTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkIsolatedClientSessionTestModel.java
index 58ff443..60a6a66 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkIsolatedClientSessionTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkIsolatedClientSessionTestModel.java
@@ -35,7 +35,7 @@
 
     @Override
     public void setup() {
-        for (Iterator descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
+        for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.ISOLATED);
         }
@@ -45,7 +45,7 @@
 
     @Override
     public void reset() {
-        for (Iterator descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
+        for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.SHARED);
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkSynchNewObjectsClientSessionTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkSynchNewObjectsClientSessionTestModel.java
index 618cb33..e1fe75f 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkSynchNewObjectsClientSessionTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/UnitOfWorkSynchNewObjectsClientSessionTestModel.java
@@ -27,7 +27,7 @@
 
     @Override
     public void setup() {
-        for (Iterator descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
+        for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setCacheSynchronizationType(ClassDescriptor.SEND_NEW_OBJECTS_WITH_CHANGES);
         }
@@ -36,7 +36,7 @@
 
     @Override
     public void reset() {
-        for (Iterator descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
+        for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             descriptor.setCacheSynchronizationType(ClassDescriptor.SEND_OBJECT_CHANGES);
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/changeflag/EmployeeChangeFlagBasicTestModel.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/changeflag/EmployeeChangeFlagBasicTestModel.java
index d7e073e..fe797b2 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/changeflag/EmployeeChangeFlagBasicTestModel.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/changeflag/EmployeeChangeFlagBasicTestModel.java
@@ -102,9 +102,9 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
-        Class largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
-        Class smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
+        Class<Employee> employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+        Class<LargeProject> largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
+        Class<SmallProject> smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new EmployeeDeleteTest(manager.getObject(employeeClass, "0001")));
@@ -169,9 +169,9 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
-        Class largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
-        Class smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
+        Class<Employee> employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+        Class<LargeProject> largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
+        Class<SmallProject> smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -221,9 +221,9 @@
         suite.setName("EmployeeUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the employee demo.");
 
-        Class employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
-        Class largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
-        Class smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
+        Class<Employee> employeeClass = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+        Class<LargeProject> largeProjectClass = org.eclipse.persistence.testing.models.employee.domain.LargeProject.class;
+        Class<SmallProject> smallProjectClass = org.eclipse.persistence.testing.models.employee.domain.SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/transactionisolation/TransactionIsolationBuildObjectCacheHitTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/transactionisolation/TransactionIsolationBuildObjectCacheHitTest.java
index 2dc05aa..7114c1d 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/transactionisolation/TransactionIsolationBuildObjectCacheHitTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/unitofwork/transactionisolation/TransactionIsolationBuildObjectCacheHitTest.java
@@ -77,7 +77,7 @@
     @Override
     public void verify() {
         // check for duplicates
-        List statements = sqlTracker.getSqlStatements();
+        List<String> statements = sqlTracker.getSqlStatements();
         Vector errors = new Vector();
         for (int i = 0; i < statements.size(); i++) {
             String statement = (String)statements.get(i);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ClientServerTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ClientServerTest.java
index 310cb63..0251df6 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ClientServerTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ClientServerTest.java
@@ -18,6 +18,7 @@
 import java.util.List;
 
 import org.eclipse.persistence.exceptions.ValidationException;
+import org.eclipse.persistence.internal.databaseaccess.Accessor;
 import org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor;
 import org.eclipse.persistence.sessions.DatabaseLogin;
 import org.eclipse.persistence.sessions.DatabaseSession;
@@ -117,8 +118,8 @@
         try {
             int counter = 0;
             ConnectionPool pool = server.serverSession.getConnectionPools().get("default");
-            List connections = pool.getConnectionsAvailable();
-            for (Iterator iterator = connections.iterator(); iterator.hasNext(); ) {
+            List<Accessor> connections = pool.getConnectionsAvailable();
+            for (Iterator<Accessor> iterator = connections.iterator(); iterator.hasNext(); ) {
                 if (((DatabaseAccessor)iterator.next()).isConnected()) {
                     counter = counter + 1;
                 }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ConstructingDescriptorExceptionTests.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ConstructingDescriptorExceptionTests.java
index 75e30ed..5f16c84 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ConstructingDescriptorExceptionTests.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ConstructingDescriptorExceptionTests.java
@@ -50,7 +50,7 @@
     @Override
     public void test() throws NoSuchMethodException {
         try {
-            Class javaClass = ConstructingDescriptorExceptionTests.class;
+            Class<ConstructingDescriptorExceptionTests> javaClass = ConstructingDescriptorExceptionTests.class;
             RelationalDescriptor descriptor = new RelationalDescriptor();
             descriptor.setJavaClass(javaClass);
             TestErrorException dummyException = new TestErrorException("no ERROR");
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/EmployeeWithProblems.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/EmployeeWithProblems.java
index d5fef5c..e36d3ed 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/EmployeeWithProblems.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/EmployeeWithProblems.java
@@ -80,8 +80,8 @@
         Time[] hours = new Time[2];
 
         /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-        hours[0] = (Time)session.getPlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
-        hours[1] = (Time)session.getPlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
+        hours[0] = session.getPlatform().convertObject(row.get("START_TIME"), Time.class);
+        hours[1] = session.getPlatform().convertObject(row.get("END_TIME"), Time.class);
         //    return hours;
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/GetTableNameTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/GetTableNameTest.java
index bedd208..423a845 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/GetTableNameTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/GetTableNameTest.java
@@ -18,6 +18,8 @@
 import org.eclipse.persistence.exceptions.EclipseLinkException;
 import org.eclipse.persistence.testing.framework.TestErrorException;
 
+import java.util.Iterator;
+
 
 public class GetTableNameTest extends ExceptionTest {
     public GetTableNameTest() {
@@ -34,7 +36,7 @@
     public void test() {
         try { //test if getTableName() throws casting exception
             org.eclipse.persistence.testing.models.employee.relational.EmployeeProject project = new org.eclipse.persistence.testing.models.employee.relational.EmployeeProject();
-            java.util.Iterator iterator = project.getDescriptors().values().iterator();
+            Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator();
             while (iterator.hasNext()) {
                 ((ClassDescriptor)iterator.next()).getTableName();
             }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidAttributeTypeForProxyIndirectionTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidAttributeTypeForProxyIndirectionTest.java
index a8f6487..fcc8e9e 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidAttributeTypeForProxyIndirectionTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidAttributeTypeForProxyIndirectionTest.java
@@ -20,6 +20,7 @@
 import org.eclipse.persistence.exceptions.EclipseLinkException;
 import org.eclipse.persistence.internal.indirection.ProxyIndirectionPolicy;
 import org.eclipse.persistence.mappings.OneToManyMapping;
+import org.eclipse.persistence.testing.models.employee.domain.Employee;
 
 
 //Created by Ian Reid
@@ -32,7 +33,7 @@
     }
 
     IntegrityChecker orgIntegrityChecker;
-    Class attributeType = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+    Class<Employee> attributeType = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
     Class[] targetInterfaces = { InvalidAttributeTypeForProxyIndirectionTest.class };
     OneToManyMapping mapping = new OneToManyMapping();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidGetMethodReturnTypeForProxyIndirectionTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidGetMethodReturnTypeForProxyIndirectionTest.java
index 5e08243..9c5504b 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidGetMethodReturnTypeForProxyIndirectionTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidGetMethodReturnTypeForProxyIndirectionTest.java
@@ -20,6 +20,7 @@
 import org.eclipse.persistence.exceptions.EclipseLinkException;
 import org.eclipse.persistence.internal.indirection.ProxyIndirectionPolicy;
 import org.eclipse.persistence.mappings.OneToManyMapping;
+import org.eclipse.persistence.testing.models.employee.domain.Employee;
 
 
 //Created by Ian Reid
@@ -32,7 +33,7 @@
     }
 
     IntegrityChecker orgIntegrityChecker;
-    Class attributeType = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+    Class<Employee> attributeType = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
     Class[] targetInterfaces = { InvalidAttributeTypeForProxyIndirectionTest.class };
     OneToManyMapping mapping = new OneToManyMapping();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidSetMethodParameterTypeForProxyIndirectionTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidSetMethodParameterTypeForProxyIndirectionTest.java
index 347d456..0485e20 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidSetMethodParameterTypeForProxyIndirectionTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/InvalidSetMethodParameterTypeForProxyIndirectionTest.java
@@ -20,6 +20,7 @@
 import org.eclipse.persistence.exceptions.EclipseLinkException;
 import org.eclipse.persistence.internal.indirection.ProxyIndirectionPolicy;
 import org.eclipse.persistence.mappings.OneToManyMapping;
+import org.eclipse.persistence.testing.models.employee.domain.Employee;
 
 
 //Created by Ian Reid
@@ -31,7 +32,7 @@
     }
 
     IntegrityChecker orgIntegrityChecker;
-    Class attributeType = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
+    Class<Employee> attributeType = org.eclipse.persistence.testing.models.employee.domain.Employee.class;
     Class[] targetInterfaces = { InvalidAttributeTypeForProxyIndirectionTest.class };
     OneToManyMapping mapping = new OneToManyMapping();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ServerSessionReadPoolTypeTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ServerSessionReadPoolTypeTest.java
index 5a2cdb9..61376b0 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ServerSessionReadPoolTypeTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/validation/ServerSessionReadPoolTypeTest.java
@@ -41,7 +41,7 @@
 
     @Override
     public void verify() {
-        Class readPoolClass = serverSession.getReadConnectionPool().getClass();
+        Class<? extends ConnectionPool> readPoolClass = serverSession.getReadConnectionPool().getClass();
         String readPoolClassName = Helper.getShortClassName(readPoolClass);
         if (serverSession.getLogin().shouldUseExternalConnectionPooling()) {
             if (!readPoolClass.equals(ExternalConnectionPool.class)) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/CollectionMappingIsMapPolicyTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/CollectionMappingIsMapPolicyTest.java
index 6b7a748..f20d802 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/CollectionMappingIsMapPolicyTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/CollectionMappingIsMapPolicyTest.java
@@ -21,7 +21,6 @@
 import org.eclipse.persistence.internal.queries.MapContainerPolicy;
 import org.eclipse.persistence.mappings.CollectionMapping;
 import org.eclipse.persistence.mappings.DatabaseMapping;
-import org.eclipse.persistence.mappings.ForeignReferenceMapping;
 import org.eclipse.persistence.testing.models.employee.domain.Employee;
 
 
@@ -46,7 +45,7 @@
 
         descriptorToModify = project.getDescriptors().get(Employee.class);
         policy = new MapContainerPolicy();
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/EmployeeWorkbenchIntegrationSystem.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/EmployeeWorkbenchIntegrationSystem.java
index b2465c3..b011853 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/EmployeeWorkbenchIntegrationSystem.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/EmployeeWorkbenchIntegrationSystem.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
@@ -78,7 +78,7 @@
 
     protected void buildInitialProject() {
         initialProject = new EmployeeProject();
-        Map<Class, ClassDescriptor> descriptors = initialProject.getDescriptors();
+        Map<Class<?>, ClassDescriptor> descriptors = initialProject.getDescriptors();
 
         // Amend the employee descriptor
         ClassDescriptor employeeDescriptor = descriptors.get(Employee.class);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/GetRelationshipPartnerAttributeNameIsNotNullTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/GetRelationshipPartnerAttributeNameIsNotNullTest.java
index 0a944e3..227d570 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/GetRelationshipPartnerAttributeNameIsNotNullTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/GetRelationshipPartnerAttributeNameIsNotNullTest.java
@@ -41,7 +41,7 @@
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
 
         descriptorToModify = project.getDescriptors().get(Employee.class);
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/InheritanceWorkbenchIntegrationSystem.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/InheritanceWorkbenchIntegrationSystem.java
index e71fc5f..c9892b3 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/InheritanceWorkbenchIntegrationSystem.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/InheritanceWorkbenchIntegrationSystem.java
@@ -32,7 +32,7 @@
 
         // Must clear 1-way transformation added in amendment, otherwise will be added twice.
         ClassDescriptor descriptor = project.getDescriptor(Animal.class);
-        for (Iterator mappings = descriptor.getMappings().iterator(); mappings.hasNext(); ) {
+        for (Iterator<DatabaseMapping> mappings = descriptor.getMappings().iterator(); mappings.hasNext(); ) {
             DatabaseMapping mapping = (DatabaseMapping) mappings.next();
             if (mapping.isWriteOnly()) {
                 descriptor.getMappings().remove(mapping);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/MappingIsReadOnlyTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/MappingIsReadOnlyTest.java
index 3c9f94b..bb76ef0 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/MappingIsReadOnlyTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/MappingIsReadOnlyTest.java
@@ -38,7 +38,7 @@
     protected void setup() {
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
         descriptorToModify = project.getDescriptors().get(Employee.class);
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
             mappingToModify.readOnly();
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/OneToOneMappingShouldUseJoiningTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/OneToOneMappingShouldUseJoiningTest.java
index bc02d06..c93c970 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/OneToOneMappingShouldUseJoiningTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/OneToOneMappingShouldUseJoiningTest.java
@@ -39,7 +39,7 @@
     protected void setup() {
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
         descriptorToModify = project.getDescriptors().get(Employee.class);
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/OneToOneMappingShouldVerifyDeleteTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/OneToOneMappingShouldVerifyDeleteTest.java
index ed8c1ab..131d22e 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/OneToOneMappingShouldVerifyDeleteTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/OneToOneMappingShouldVerifyDeleteTest.java
@@ -41,7 +41,7 @@
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
 
         descriptorToModify = project.getDescriptors().get(Employee.class);
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ProjectClassGeneratorUnicodeTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ProjectClassGeneratorUnicodeTest.java
index ec55c9c..4a5de02 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ProjectClassGeneratorUnicodeTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ProjectClassGeneratorUnicodeTest.java
@@ -48,7 +48,7 @@
                throw new TestErrorException("Project class generation compile failed. This could either be a legitimate compile " +
                         "failure, or could result if you do not have the tools.jar from your JDK on the classpath.");
             }
-            Class projectClass = Class.forName(PROJECT_FILE);
+            Class<?> projectClass = Class.forName(PROJECT_FILE);
             unicodeProject = (org.eclipse.persistence.sessions.Project)projectClass.getConstructor().newInstance();
         } catch (Exception exception) {
             throw new RuntimeException("Project class generation failed.It may be possible to solve this issue by adding the tools.jar from your JDK to the classpath.", exception);
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ProjectClassGeneratorWithCMPDescriptorTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ProjectClassGeneratorWithCMPDescriptorTest.java
index e8e2b62..5119d01 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ProjectClassGeneratorWithCMPDescriptorTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ProjectClassGeneratorWithCMPDescriptorTest.java
@@ -89,7 +89,7 @@
                          "failure, or could result if you do not have the tools.jar from your JDK on the classpath.");
             }
             //Class projectClass = (Class) getSession().getPlatform().getConversionManager().convertObject(projectShortClassName, ClassConstants.CLASS);
-            Class projectClass = Class.forName(projectShortClassName);
+            Class<?> projectClass = Class.forName(projectShortClassName);
             generatedProject = (org.eclipse.persistence.sessions.Project)projectClass.getConstructor().newInstance();
         } catch (Exception exception) {
             throw new TestErrorException("Failed obtain new project instance from the generated and compiled project. " +
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ShouldUseBatchReadingOnMappingTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ShouldUseBatchReadingOnMappingTest.java
index d434728..32331f6 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ShouldUseBatchReadingOnMappingTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ShouldUseBatchReadingOnMappingTest.java
@@ -40,7 +40,7 @@
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
 
         descriptorToModify = project.getDescriptors().get(Employee.class);
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ShouldUseCacheIdentityMapTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ShouldUseCacheIdentityMapTest.java
index 6bff8b2..e710be1 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ShouldUseCacheIdentityMapTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/ShouldUseCacheIdentityMapTest.java
@@ -36,7 +36,7 @@
     protected void setup() {
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
 
-        for (Iterator iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
+        for (Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
             descriptorToModify = (ClassDescriptor)iterator.next();
             descriptorToModify.useCacheIdentityMap();
         }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/TransformationMappingUsesBasicIndirectionTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/TransformationMappingUsesBasicIndirectionTest.java
index 2064bdb..41fa1e7 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/TransformationMappingUsesBasicIndirectionTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/TransformationMappingUsesBasicIndirectionTest.java
@@ -40,7 +40,7 @@
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
 
         descriptorToModify = project.getDescriptors().get(Employee.class);
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/TransparentIndirectionPolicyInstanceTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/TransparentIndirectionPolicyInstanceTest.java
index 42250d3..4da49af 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/TransparentIndirectionPolicyInstanceTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/TransparentIndirectionPolicyInstanceTest.java
@@ -42,7 +42,7 @@
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
 
         descriptorToModify = project.getDescriptors().get(Employee.class);
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/UseTransparentMapOnCollectionMapping.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/UseTransparentMapOnCollectionMapping.java
index ce65335..316dd60 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/UseTransparentMapOnCollectionMapping.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/UseTransparentMapOnCollectionMapping.java
@@ -49,7 +49,7 @@
         descriptorToModify = project.getDescriptors().get(Employee.class);
         policy = new TransparentIndirectionPolicy();
         mapPolicy = new MapContainerPolicy();
-        for (Enumeration mappingsEnum = (descriptorToModify.getMappings()).elements();
+        for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
             mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/WorkbenchIntegrationSystemHelper.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/WorkbenchIntegrationSystemHelper.java
index de8a088..99d04d5 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/WorkbenchIntegrationSystemHelper.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/workbenchintegration/WorkbenchIntegrationSystemHelper.java
@@ -41,7 +41,7 @@
                 throw new TestErrorException("Project class generation compile failed. This could either be a legitimate compile " +
                          "failure, or could result if you do not have the tools.jar from your JDK on the classpath.");
             }
-            Class projectClass = Class.forName(filename);
+            Class<?> projectClass = Class.forName(filename);
             return (Project) projectClass.getConstructor().newInstance();
         } catch (Exception exception) {
             throw new RuntimeException("Project class generation failed.It may be possible to solve this issue by adding the tools.jar from your JDK to the classpath.", exception);
diff --git a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/platform/server/wls/WebLogic_12_PlatformTest.java b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/platform/server/wls/WebLogic_12_PlatformTest.java
index 234183b..baefacc 100644
--- a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/platform/server/wls/WebLogic_12_PlatformTest.java
+++ b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/platform/server/wls/WebLogic_12_PlatformTest.java
@@ -142,7 +142,7 @@
         Field instanceField = null;
         Object ctxHelperInstance = null;
         try {
-            Class ctxHelperClass = Class.forName("org.eclipse.persistence.platform.server.wls.WebLogic_12_Platform$ContextHelper");
+            Class<?> ctxHelperClass = Class.forName("org.eclipse.persistence.platform.server.wls.WebLogic_12_Platform$ContextHelper");
             c = ctxHelperClass.getDeclaredConstructors()[0];
             c.setAccessible(true);
             ctxHelperInstance = c.newInstance(imgr.getClass(), ICtx.class.getName());
diff --git a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/security/JCEEncryptionTest.java b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/security/JCEEncryptionTest.java
index 5bf2dc5..a916f28 100644
--- a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/security/JCEEncryptionTest.java
+++ b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/security/JCEEncryptionTest.java
@@ -46,7 +46,7 @@
     private Securable convertToEncryptionObject(String encryptionClassName) {
         try {
             ConversionManager cm = ConversionManager.getDefaultManager();
-            Class securableClass = (Class)cm.convertObject(encryptionClassName, Class.class);
+            Class securableClass = cm.convertObject(encryptionClassName, Class.class);
             return (Securable)securableClass.getConstructor().newInstance();
         } catch (Throwable e) {
             return null;
diff --git a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectListTest.java b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectListTest.java
index 362fc90..d9240d3 100644
--- a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectListTest.java
+++ b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectListTest.java
@@ -275,7 +275,7 @@
     public void testIterator() {
         int i = 0;
 
-        for (Iterator stream = testList.iterator(); stream.hasNext(); i++) {
+        for (Iterator<String> stream = testList.iterator(); stream.hasNext(); i++) {
             stream.next();
         }
         assertEquals(list.size(), i);
@@ -306,7 +306,7 @@
     public void testListIterator1() {
         int i = 0;
 
-        for (ListIterator stream = testList.listIterator(); stream.hasNext(); i++) {
+        for (ListIterator<String> stream = testList.listIterator(); stream.hasNext(); i++) {
             stream.next();
         }
         assertEquals(list.size(), i);
@@ -317,7 +317,7 @@
     public void testListIterator2() {
         int i = 0;
 
-        for (ListIterator stream = testList.listIterator(2); stream.hasNext(); i++) {
+        for (ListIterator<String> stream = testList.listIterator(2); stream.hasNext(); i++) {
             stream.next();
         }
         assertEquals(list.size(), i + 2);
diff --git a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectMapTest.java b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectMapTest.java
index f852fa6..6fd9c0d 100644
--- a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectMapTest.java
+++ b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectMapTest.java
@@ -533,10 +533,10 @@
         map.putAll(temp);
         testMap.putAll(temp);
         assertEquals(map, testMap);
-        for (Enumeration stream = temp.keys(); stream.hasMoreElements();) {
+        for (Enumeration<String> stream = temp.keys(); stream.hasMoreElements();) {
             assertTrue(testMap.containsKey(stream.nextElement()));
         }
-        for (Enumeration stream = temp.elements(); stream.hasMoreElements();) {
+        for (Enumeration<String> stream = temp.elements(); stream.hasMoreElements();) {
             assertTrue(testMap.contains(stream.nextElement()));
         }
         assertAddEvents(2);
@@ -564,7 +564,7 @@
     public void testValues() {
         assertEquals(map.size(), testMap.values().size());
 
-        for (Iterator stream = testMap.values().iterator(); stream.hasNext();) {
+        for (Iterator<String> stream = testMap.values().iterator(); stream.hasNext();) {
             assertTrue(map.contains(stream.next()));
         }
         map.values().removeAll(testMap.values());
diff --git a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectSetTest.java b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectSetTest.java
index b408cf5..1e71623 100644
--- a/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectSetTest.java
+++ b/foundation/eclipselink.core.test/src/test/java/org/eclipse/persistence/testing/tests/junit/transparentindirection/IndirectSetTest.java
@@ -182,7 +182,7 @@
     @Test
     public void testIterator() {
         int i = 0;
-        for (Iterator stream = testList.iterator(); stream.hasNext(); i++) {
+        for (Iterator<String> stream = testList.iterator(); stream.hasNext(); i++) {
             stream.next();
         }
         assertEquals(list.size(), i);
diff --git a/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/remote/rmi/IIOP/RMIServerManagerController.java b/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/remote/rmi/IIOP/RMIServerManagerController.java
index c8eb254..b26aa60 100644
--- a/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/remote/rmi/IIOP/RMIServerManagerController.java
+++ b/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/remote/rmi/IIOP/RMIServerManagerController.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
@@ -54,7 +54,7 @@
             }
         } else {
             try {
-                Class cls = Class.forName(controllerClassName);
+                Class<?> cls = Class.forName(controllerClassName);
                 Class[] parameterTypes = { org.eclipse.persistence.sessions.Session.class };
                 Constructor constructor = cls.getConstructor(parameterTypes);
                 Object[] params = { getSession() };
diff --git a/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/remote/suncorba/CORBAServerManagerController.java b/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/remote/suncorba/CORBAServerManagerController.java
index 5b70904..ec833f8 100644
--- a/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/remote/suncorba/CORBAServerManagerController.java
+++ b/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/remote/suncorba/CORBAServerManagerController.java
@@ -47,7 +47,7 @@
             controller = new CORBARemoteSessionControllerDispatcher((getSession()));
         } else {
             try {
-                Class cls = Class.forName(controllerClassName);
+                Class<?> cls = Class.forName(controllerClassName);
                 Class[] parameterTypes = { org.eclipse.persistence.sessions.Session.class };
                 Constructor constructor = cls.getConstructor(parameterTypes);
                 java.lang.Object[] params = { getSession() };
diff --git a/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/internal/sessions/coordination/corba/sun/_SunCORBAConnectionImplBase.java b/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/internal/sessions/coordination/corba/sun/_SunCORBAConnectionImplBase.java
index 2d0278a..c65b2da 100644
--- a/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/internal/sessions/coordination/corba/sun/_SunCORBAConnectionImplBase.java
+++ b/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/internal/sessions/coordination/corba/sun/_SunCORBAConnectionImplBase.java
@@ -35,7 +35,7 @@
     public _SunCORBAConnectionImplBase() {
     }
 
-    private static Hashtable _methods = new Hashtable();
+    private static Hashtable<String, Integer> _methods = new Hashtable<>();
 
     static {
         _methods.put("executeCommand", 0);
diff --git a/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/remote/corba/sun/CORBAConnection.java b/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/remote/corba/sun/CORBAConnection.java
index ba61cb5..c2d6674 100644
--- a/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/remote/corba/sun/CORBAConnection.java
+++ b/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/remote/corba/sun/CORBAConnection.java
@@ -142,15 +142,16 @@
             throw transporter.getException();
         }
 
-        Vector serverNextPageObjects = (Vector)transporter.getObject();
+        @SuppressWarnings({"unchecked"})
+        Vector<Object> serverNextPageObjects = (Vector<Object>)transporter.getObject();
         if (serverNextPageObjects == null) {
             cursoredStreamClose(remoteCursoredStream.getID());
             return null;
         }
-        Vector clientNextPageObjects = serverNextPageObjects;
+        Vector<Object> clientNextPageObjects = serverNextPageObjects;
         if (query.isReadAllQuery() && (!query.isReportQuery())) {// could be DataReadQuery
-            clientNextPageObjects = new Vector(serverNextPageObjects.size());
-            for (Enumeration objEnum = serverNextPageObjects.elements(); objEnum.hasMoreElements();) {
+            clientNextPageObjects = new Vector<>(serverNextPageObjects.size());
+            for (Enumeration<Object> objEnum = serverNextPageObjects.elements(); objEnum.hasMoreElements();) {
                 // 2612538 - the default size of Map (32) is appropriate
                 Object clientObject = session.getObjectCorrespondingTo(objEnum.nextElement(), transporter.getObjectDescriptors(), new IdentityHashMap(), (ObjectLevelReadQuery)query);
                 clientNextPageObjects.addElement(clientObject);
diff --git a/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/remote/rmi/iiop/RMIConnection.java b/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/remote/rmi/iiop/RMIConnection.java
index 1eddea8..4249ad4 100644
--- a/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/remote/rmi/iiop/RMIConnection.java
+++ b/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/remote/rmi/iiop/RMIConnection.java
@@ -191,15 +191,16 @@
             throw transporter.getException();
         }
 
-        Vector serverNextPageObjects = (Vector)transporter.getObject();
+        @SuppressWarnings({"unchecked"})
+        Vector<Object> serverNextPageObjects = (Vector<Object>)transporter.getObject();
         if (serverNextPageObjects == null) {
             cursoredStreamClose(remoteCursoredStream.getID());
             return null;
         }
-        Vector clientNextPageObjects = serverNextPageObjects;
+        Vector<Object> clientNextPageObjects = serverNextPageObjects;
         if (query.isReadAllQuery() && (!query.isReportQuery())) {// could be DataReadQuery
-            clientNextPageObjects = new Vector(serverNextPageObjects.size());
-            for (Enumeration objEnum = serverNextPageObjects.elements(); objEnum.hasMoreElements();) {
+            clientNextPageObjects = new Vector<>(serverNextPageObjects.size());
+            for (Enumeration<Object> objEnum = serverNextPageObjects.elements(); objEnum.hasMoreElements();) {
                 // 2612538 - the default size of Map (32) is appropriate
                 Object clientObject = session.getObjectCorrespondingTo(objEnum.nextElement(), transporter.getObjectDescriptors(), new IdentityHashMap(), (ObjectLevelReadQuery)query);
                 clientNextPageObjects.addElement(clientObject);
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/DeleteAllQueryTestHelper.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/DeleteAllQueryTestHelper.java
index a2be2a0..28d36d8 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/DeleteAllQueryTestHelper.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/DeleteAllQueryTestHelper.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
@@ -167,7 +167,7 @@
 
         if(handleChildren) {
             if(descriptor.hasInheritance() && descriptor.getInheritancePolicy().hasChildren()) {
-                Iterator it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
+                Iterator<ClassDescriptor> it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
                 while(it.hasNext()) {
                     ClassDescriptor childDescriptor = (ClassDescriptor)it.next();
                     Class childReferenceClass = childDescriptor.getJavaClass();
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/JUnitTestCase.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/JUnitTestCase.java
index fcb84e6..2498ddf 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/JUnitTestCase.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/JUnitTestCase.java
@@ -14,6 +14,8 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.testing.framework;
 
+import junit.framework.Test;
+
 import java.lang.reflect.*;
 import java.util.Enumeration;
 import java.util.Vector;
@@ -124,7 +126,7 @@
             throw new TestProblemException("suite method failed on class " + junitTestCaseClass.getName() + " with: " + exception.toString(), exception);
         }
         Vector testsOut = new Vector(suite.countTestCases());
-        Enumeration tests = suite.tests();
+        Enumeration<Test> tests = suite.tests();
         while (tests.hasMoreElements()) {
             junit.framework.TestCase testCaseToAdd = (junit.framework.TestCase)tests.nextElement();
             testsOut.addElement(new JUnitTestCase(testCaseToAdd));
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/JoinedAttributeTestHelper.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/JoinedAttributeTestHelper.java
index 8d019cb..5060f02 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/JoinedAttributeTestHelper.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/JoinedAttributeTestHelper.java
@@ -31,7 +31,6 @@
 import java.util.*;
 import org.eclipse.persistence.internal.identitymaps.CacheKey;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
-import org.eclipse.persistence.mappings.CollectionMapping;
 import org.eclipse.persistence.mappings.ForeignReferenceMapping;
 import org.eclipse.persistence.queries.ObjectLevelReadQuery;
 import org.eclipse.persistence.queries.InMemoryQueryIndirectionPolicy;
@@ -99,7 +98,7 @@
         for (Iterator iterator = collectionResult.iterator(); iterator.hasNext(); ) {
             Object object = iterator.next();
             boolean remove = false;
-            for (Iterator joinsIterator = queryWithJoins.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinsIterator.hasNext(); ) {
+            for (Iterator<Expression> joinsIterator = queryWithJoins.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinsIterator.hasNext(); ) {
                 Expression joinExpression = (Expression)joinsIterator.next();
                 joinExpression.getBuilder().setSession(session);
                 joinExpression.getBuilder().setQueryClass(queryWithJoins.getReferenceClass());
@@ -156,7 +155,7 @@
             if (excluded.contains(new CacheKey(session.getId(object)))) {
                 iterator.remove();
             } else {
-                for (Iterator joinsIterator = queryWithJoins.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinsIterator.hasNext(); ) {
+                for (Iterator<Expression> joinsIterator = queryWithJoins.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinsIterator.hasNext(); ) {
                     Expression joinExpression = (Expression)joinsIterator.next();
                     // Instantiate value holders that should be instantiated.
                     joinExpression.valueFromObject(object, session, null, valueHolderPolicy, false);
@@ -344,7 +343,7 @@
             return errorMsg;
         }
 
-        Vector mappings = desc.getMappings();
+        Vector<DatabaseMapping> mappings = desc.getMappings();
         for (int index = 0; index < mappings.size(); index++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
             String mappingErrorMsg = compareAttributes(obj1, obj2, mapping, session, processed);
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/LoadBuildSystem.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/LoadBuildSystem.java
index d996466..3826da5 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/LoadBuildSystem.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/LoadBuildSystem.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
@@ -173,7 +173,7 @@
         UnitOfWork uow = session.acquireUnitOfWork();
         while (summaries.hasNext()) {
             LoadBuildSummary summary = (LoadBuildSummary)summaries.next();
-            for (Iterator iterator = summary.getSummaries().iterator(); iterator.hasNext(); ) {
+            for (Iterator<TestResultsSummary> iterator = summary.getSummaries().iterator(); iterator.hasNext(); ) {
                 ((TestResultsSummary)iterator.next()).getResults();
             }
             //for (int index = 0; index < 10; index++) {
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestExecutor.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestExecutor.java
index 30c0f7a..a4fc796 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestExecutor.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestExecutor.java
@@ -18,6 +18,7 @@
 import java.util.*;
 import jakarta.persistence.*;
 
+import junit.framework.TestFailure;
 import org.eclipse.persistence.config.PersistenceUnitProperties;
 import org.eclipse.persistence.sessions.*;
 import org.eclipse.persistence.sessions.server.*;
@@ -555,7 +556,7 @@
                 log.write(CR);
                 log.write(indent + "Failures:");
                 log.write(CR);
-                for (Enumeration failures = result.failures(); failures.hasMoreElements();) {
+                for (Enumeration<TestFailure> failures = result.failures(); failures.hasMoreElements();) {
                     junit.framework.TestFailure failure = (junit.framework.TestFailure)failures.nextElement();
                     String testString = failure.failedTest().toString();
                     int startIndex = testString.indexOf("(");
@@ -576,7 +577,7 @@
                 log.write(CR);
                 log.write(indent + "Errors:");
                 log.write(CR);
-                for (Enumeration errors = result.errors(); errors.hasMoreElements();) {
+                for (Enumeration<TestFailure> errors = result.errors(); errors.hasMoreElements();) {
                     junit.framework.TestFailure error = (junit.framework.TestFailure)errors.nextElement();
                     String testString = error.failedTest().toString();
                     int startIndex = testString.indexOf("(");
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestSystem.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestSystem.java
index 4d6f772..414bad6 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestSystem.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestSystem.java
@@ -495,7 +495,7 @@
     public void useOracleThin(String databaseURL, String userName, String password) {
         DatabasePlatform platform = null;
         try{
-            Class platformClass = Class.forName("org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
+            Class<?> platformClass = Class.forName("org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
             platform = (DatabasePlatform)platformClass.getConstructor().newInstance();
         } catch (Exception e){
             platform = new org.eclipse.persistence.platform.database.OraclePlatform();
@@ -519,7 +519,7 @@
     public void useOracle8Thin(String databaseURL, String userName, String password) {
         DatabasePlatform platform = null;
         try{
-            Class platformClass = Class.forName("org.eclipse.persistence.platform.database.oracle.Oracle8Platform");
+            Class<?> platformClass = Class.forName("org.eclipse.persistence.platform.database.oracle.Oracle8Platform");
             platform = (DatabasePlatform)platformClass.getConstructor().newInstance();
         } catch (Exception e){
             platform = new org.eclipse.persistence.platform.database.OraclePlatform();
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestVariation.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestVariation.java
index 1fdf031..969cf9a 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestVariation.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/TestVariation.java
@@ -150,7 +150,7 @@
         Vector candidateFieldsNames = new Vector();
 
         for (int i = 0; i < allMethods.length; i++) {
-            Class returnType = allMethods[i].getReturnType();
+            Class<?> returnType = allMethods[i].getReturnType();
             Class[] parameterTypes = allMethods[i].getParameterTypes();
             if (returnType.equals(boolean.class) && (parameterTypes.length == 0)) {
                 candidateGetters.addElement(allMethods[i]);
@@ -163,7 +163,7 @@
             }
         }
         for (int i = 0; i < allFields.length; i++) {
-            Class type = allFields[i].getType();
+            Class<?> type = allFields[i].getType();
             if (type.equals(boolean.class)) {
                 candidateFields.addElement(allFields[i]);
                 candidateFieldsNames.addElement(allFields[i].getName().toLowerCase());
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/UpdateAllQueryTestHelper.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/UpdateAllQueryTestHelper.java
index fe3e49c..dfa43c6 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/UpdateAllQueryTestHelper.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/UpdateAllQueryTestHelper.java
@@ -217,7 +217,7 @@
 
         if(handleChildren) {
             if(descriptor.hasInheritance() && descriptor.getInheritancePolicy().hasChildren()) {
-                Iterator it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
+                Iterator<ClassDescriptor> it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
                 while(it.hasNext()) {
                     ClassDescriptor childDescriptor = (ClassDescriptor)it.next();
                     Class childReferenceClass = childDescriptor.getJavaClass();
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/WriteObjectTest.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/WriteObjectTest.java
index 9b15d5c..ceab547 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/WriteObjectTest.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/WriteObjectTest.java
@@ -20,6 +20,8 @@
 import org.eclipse.persistence.mappings.*;
 import org.eclipse.persistence.mappings.foundation.*;
 
+import java.util.Vector;
+
 /**
  * <p>
  * <b>Purpose</b>: Define a generic test for writing an object to the database.
@@ -103,9 +105,9 @@
          * descriptor, which is then used to find the mappings and determine if
          * one exists that can be mutated
          */
-        Class objectClass = objectToBeMutated.getClass();
+        Class<? extends Object> objectClass = objectToBeMutated.getClass();
         ClassDescriptor descriptor = getSession().getProject().getClassDescriptor(objectClass);
-        java.util.Vector mappings = descriptor.getMappings();
+        Vector<DatabaseMapping> mappings = descriptor.getMappings();
 
         if (isInUOW) {
             mutationString += "U";
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/junit/JUnitTestCaseHelper.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/junit/JUnitTestCaseHelper.java
index a3f8337..8148596 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/junit/JUnitTestCaseHelper.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/junit/JUnitTestCaseHelper.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
@@ -200,7 +200,7 @@
 
         Map compositeMap = new HashMap();
         properties.put(PersistenceUnitProperties.COMPOSITE_UNIT_PROPERTIES, compositeMap);
-        Map defaultProperties = getDatabaseProperties();
+        Map<String, String> defaultProperties = getDatabaseProperties();
         String logLevel = (String)defaultProperties.get(PersistenceUnitProperties.LOGGING_LEVEL);
         if (logLevel != null) {
             properties.put(PersistenceUnitProperties.LOGGING_LEVEL, logLevel);
@@ -210,7 +210,7 @@
         for (int i = 1; i < sessions.length; i++) {
             String dbIndex = Integer.toString(i + 1);
             // the second session uses db2.user, db2.pwd ...
-            Map sessionProperties = getDatabasePropertiesForIndex(dbIndex);
+            Map<String, String> sessionProperties = getDatabasePropertiesForIndex(dbIndex);
             if (sessionProperties.isEmpty() && shouldUseSingleDb()) {
                 // if non of these properties defined, then use firstSessionProperties
                 sessionProperties = defaultProperties;
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/LoadBuildDisplayPanel.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/LoadBuildDisplayPanel.java
index 4b51c05..d20ee1c 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/LoadBuildDisplayPanel.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/LoadBuildDisplayPanel.java
@@ -131,8 +131,8 @@
             }
         } else {
             Vector summariesHasResult = new Vector();
-            for (Enumeration enumtr = selectedSummary.getLoadBuildSummary().getSummaries().elements();
-                     enumtr.hasMoreElements();) {
+            for (Enumeration<TestResultsSummary> enumtr = selectedSummary.getLoadBuildSummary().getSummaries().elements();
+                 enumtr.hasMoreElements();) {
                 TestResultsSummary summary = (TestResultsSummary)enumtr.nextElement();
                 if ((summary.getResults() != null) && (summary.getResults().size() != 0)) {
                     summariesHasResult.addElement(summary);
@@ -760,7 +760,7 @@
     public void initilaizeTestSummaryCache(LoadBuildSummary loadBuild) {
         Vector rootSummaries = new Vector();
 
-        for (Enumeration enumtr = loadBuild.getSummaries().elements(); enumtr.hasMoreElements();) {
+        for (Enumeration<TestResultsSummary> enumtr = loadBuild.getSummaries().elements(); enumtr.hasMoreElements();) {
             TestResultsSummary summary = (TestResultsSummary)enumtr.nextElement();
             if (summary.getParent() == null) {
                 rootSummaries.addElement(summary);
@@ -778,8 +778,8 @@
 
         Vector children = new Vector();
 
-        for (Enumeration enumtr = theSummary.getLoadBuildSummary().getSummaries().elements();
-                 enumtr.hasMoreElements();) {
+        for (Enumeration<TestResultsSummary> enumtr = theSummary.getLoadBuildSummary().getSummaries().elements();
+             enumtr.hasMoreElements();) {
             TestResultsSummary summary = (TestResultsSummary)enumtr.nextElement();
             if ((summary.getParent() != null) && summary.getParent().getName().equals(theSummary.getName())) {
                 children.addElement(summary);
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/TestEntityTreeModel.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/TestEntityTreeModel.java
index 8c99ca7..2884e45 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/TestEntityTreeModel.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/TestEntityTreeModel.java
@@ -17,6 +17,8 @@
 import java.util.*;
 import javax.swing.tree.*;
 import javax.swing.event.*;
+
+import junit.framework.Test;
 import org.eclipse.persistence.testing.framework.*;
 
 /**
@@ -63,7 +65,7 @@
         if (parent instanceof TestCollection) {
             return ((TestCollection)parent).getTests().indexOf(child);
         } else if (parent instanceof junit.framework.TestSuite) {
-            Enumeration tests = ((junit.framework.TestSuite)parent).tests();
+            Enumeration<Test> tests = ((junit.framework.TestSuite)parent).tests();
             int index = 0;
             while (tests.hasMoreElements()) {
                 if (tests.nextElement() == child) {
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/TestingBrowserPanel.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/TestingBrowserPanel.java
index ca04600..d475ec4 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/TestingBrowserPanel.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/testing/framework/ui/TestingBrowserPanel.java
@@ -1216,7 +1216,7 @@
             // Ignore, but can't check first because need to support running 9.0.4.
         }
         // Configure the JPA tests login and logging.
-        Map properties = org.eclipse.persistence.testing.framework.junit.JUnitTestCaseHelper.getDatabaseProperties();
+        Map<String, String> properties = org.eclipse.persistence.testing.framework.junit.JUnitTestCaseHelper.getDatabaseProperties();
         if(getExecutor().getSession().getDatasourceLogin() instanceof DatabaseLogin && getExecutor().getSession().getLogin().getConnector() instanceof DefaultConnector) {
             properties.put(PersistenceUnitProperties.JDBC_DRIVER, getExecutor().getSession().getLogin().getDriverClassName());
             properties.put(PersistenceUnitProperties.JDBC_URL, getExecutor().getSession().getLogin().getConnectionString());
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/beans/ExpressionPanel.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/beans/ExpressionPanel.java
index 10d2847..5e82a40 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/beans/ExpressionPanel.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/beans/ExpressionPanel.java
@@ -701,7 +701,7 @@
             getAttributeCombo().removeAllItems();
         }
         if (getDescriptor() != null) {
-            for (Enumeration mappingsEnum =
+            for (Enumeration<DatabaseMapping> mappingsEnum =
                  getDescriptor().getMappings().elements();
                  mappingsEnum.hasMoreElements(); ) {
                 DatabaseMapping mapping =
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/history/HistoryFacade.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/history/HistoryFacade.java
index 4117833..a88a031 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/history/HistoryFacade.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/history/HistoryFacade.java
@@ -216,7 +216,7 @@
             }
             descriptor.setHistoryPolicy(policy);
 
-            for (Enumeration mappings = descriptor.getMappings().elements();
+            for (Enumeration<DatabaseMapping> mappings = descriptor.getMappings().elements();
                  mappings.hasMoreElements(); ) {
                 DatabaseMapping mapping =
                     (DatabaseMapping)mappings.nextElement();
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/SessionConsole.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/SessionConsole.java
index 3bcdc1e..1e4c9c0 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/SessionConsole.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/SessionConsole.java
@@ -2097,7 +2097,7 @@
             SessionConsole aSessionInspectorFrame;
             aSessionInspectorFrame = new SessionConsole();
             try {
-                Class aCloserClass =
+                Class<?> aCloserClass =
                     Class.forName("com.ibm.uvm.abt.edit.WindowCloser");
                 Class[] parmTypes = { java.awt.Window.class };
                 Object[] parms = { aSessionInspectorFrame };
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/SessionConsolePanel.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/SessionConsolePanel.java
index 73915a3..ec99171 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/SessionConsolePanel.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/SessionConsolePanel.java
@@ -770,7 +770,7 @@
                 // done reflectively to remove dependency on tools jar
                 Object[] params = new Object[1];
                 params[0] = source;
-                Class mainClass = Class.forName("com.sun.tools.javac.Main");
+                Class<?> mainClass = Class.forName("com.sun.tools.javac.Main");
                 Class[] parameterTypes = new Class[1];
                 parameterTypes[0] = String[].class;
                 Method method = mainClass.getMethod("compile", parameterTypes);
@@ -780,7 +780,7 @@
                             "Java code compile failed. This could either be a legitimate compile "
                                     + "failure, or could result if you do not have the tools.jar from your JDK on the classpath.");
                 }
-                Class newClass = Class.forName(className);
+                Class<?> newClass = Class.forName(className);
                 Object newInstance = newClass.getConstructor().newInstance();
                 newClass.getField("session").set(newInstance, getSession());
                 Object value;
@@ -3240,7 +3240,7 @@
                 getSession().getSessionLog().setShouldPrintThread(true);
             }
             // Also update all sessions in session manager.
-            Iterator iterator = SessionManager.getManager().getSessions().values().iterator();
+            Iterator<Session> iterator = SessionManager.getManager().getSessions().values().iterator();
             while (iterator.hasNext()) {
                 ((Session)iterator.next()).setSessionLog(getSession().getSessionLog());
             }
@@ -3409,7 +3409,7 @@
         IdentityMap map = ((AbstractSession) getSession())
                 .getIdentityMapAccessorInstance().getIdentityMap(
                         info.descriptor.getJavaClass());
-        for (Enumeration cacheEnum = map.keys(); cacheEnum.hasMoreElements();) {
+        for (Enumeration<CacheKey> cacheEnum = map.keys(); cacheEnum.hasMoreElements();) {
             CacheKey key = (CacheKey) cacheEnum.nextElement();
             if (info.descriptor.getJavaClass().isInstance(key.getObject())) {
                 cacheResults.addElement(key);
@@ -3447,7 +3447,7 @@
         ClassInfo[] classes = new ClassInfo[(getSession()).getDescriptors()
                 .size()];
         int index = 0;
-        for (Iterator iterator = (getSession()).getDescriptors().values()
+        for (Iterator<ClassDescriptor> iterator = (getSession()).getDescriptors().values()
                 .iterator(); iterator.hasNext();) {
             classes[index] = new ClassInfo((ClassDescriptor) iterator.next(),
                     useFullNames);
@@ -3755,7 +3755,7 @@
         if (shouldUseJndiConnector
                 && getLoginEditorPanel().getLogin().getPlatform().isOracle()) {
             try {
-                Class connectionPoolHelperClass = Class
+                Class<?> connectionPoolHelperClass = Class
                         .forName("org.eclipse.persistence.tools.sessionconsole.OracleConnectionPoolHelper");
                 Class[] params = new Class[] { java.lang.String.class };
                 java.lang.reflect.Method method = connectionPoolHelperClass
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/config/ProfilerType.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/config/ProfilerType.java
index a858550..480fd90 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/config/ProfilerType.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/config/ProfilerType.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
@@ -24,8 +24,8 @@
  * <p><code>properties.add(PersistenceUnitProperties.PROFILER, ProfilerType.PerformanceProfiler);</code>
  * <p>Property values are case-insensitive.
  *
- * @see QueryMonitor
- * @see PerformanceProfiler
+ * @see org.eclipse.persistence.tools.profiler.QueryMonitor
+ * @see org.eclipse.persistence.tools.profiler.PerformanceProfiler
  */
 public class ProfilerType {
     //A tool used to provide high level performance profiling information
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/descriptors/CoreDescriptor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/descriptors/CoreDescriptor.java
index 66f6b88..c98aa0a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/descriptors/CoreDescriptor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/descriptors/CoreDescriptor.java
@@ -113,7 +113,7 @@
      * PUBLIC:
      * Return the java class.
      */
-    public abstract Class getJavaClass();
+    public abstract <T> Class<T> getJavaClass();
 
     /**
      * INTERNAL:
@@ -178,7 +178,7 @@
     * Set the Java class that this descriptor maps.
     * Every descriptor maps one and only one class.
     */
-    public abstract void setJavaClass(Class javaClass);
+    public abstract void setJavaClass(Class<?> javaClass);
 
     /**
      * INTERNAL:
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/queries/CoreAttributeGroup.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/queries/CoreAttributeGroup.java
index 606a071..e35c277 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/queries/CoreAttributeGroup.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/queries/CoreAttributeGroup.java
@@ -225,7 +225,7 @@
      *    This method is used internally in the clone processing.
      */
     public CoreAttributeGroup clone(Map<CoreAttributeGroup<ATTRIBUTE_ITEM, DESCRIPTOR>, CoreAttributeGroup<ATTRIBUTE_ITEM, DESCRIPTOR>> cloneMap){
-        CoreAttributeGroup clone = cloneMap.get(this);
+        CoreAttributeGroup<ATTRIBUTE_ITEM, DESCRIPTOR> clone = cloneMap.get(this);
         if (clone != null) {
             return clone;
         }
@@ -248,7 +248,7 @@
             clone.superClassGroup = this.superClassGroup.clone(cloneMap);
         }
         if (this.subClasses != null){
-            clone.subClasses = new HashSet<CoreAttributeGroup>();
+            clone.subClasses = new HashSet<>();
             for (CoreAttributeGroup group : this.subClasses){
                 clone.subClasses.add(group.clone(cloneMap));
             }
@@ -256,9 +256,9 @@
         // all attributes and nested groups should be cloned, too
         clone.items = null;
         if (hasItems()) {
-            clone.items = new HashMap<String, ATTRIBUTE_ITEM>();
+            clone.items = new HashMap<>();
             for (ATTRIBUTE_ITEM item : this.items.values()){
-                clone.items.put(item.getAttributeName(), item.clone(cloneMap, clone));
+                clone.items.put(item.getAttributeName(), (ATTRIBUTE_ITEM) item.clone((Map<CoreAttributeGroup<ATTRIBUTE_ITEM, DESCRIPTOR>, CoreAttributeGroup<ATTRIBUTE_ITEM, DESCRIPTOR>>)cloneMap, clone));
             }
         }
         return clone;
@@ -316,7 +316,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        this.type = AccessController.doPrivileged(new PrivilegedClassForName(this.typeName, true, classLoader));
+                        this.type = AccessController.doPrivileged(new PrivilegedClassForName<>(this.typeName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(this.typeName, exception.getException());
                     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/sessions/CoreProject.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/sessions/CoreProject.java
index f908ccc..f6638d0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/sessions/CoreProject.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/sessions/CoreProject.java
@@ -63,7 +63,7 @@
      * PUBLIC:
      * Return the descriptor specified for the class.
      */
-    public abstract DESCRIPTOR getDescriptor(Class theClass);
+    public abstract DESCRIPTOR getDescriptor(Class<?> theClass);
 
     /**
      * INTERNAL:
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/sessions/CoreSession.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/sessions/CoreSession.java
index 7fd0fe4..1b7ba78 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/sessions/CoreSession.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/sessions/CoreSession.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -50,7 +50,7 @@
      * by one of the classes stored in the map, that descriptor will be stored under the
      * new class.
      */
-    DESCRIPTOR getDescriptor(Class theClass);
+    DESCRIPTOR getDescriptor(Class<?> theClass);
 
     /**
      * ADVANCED:
@@ -62,7 +62,7 @@
      * ADVANCED:
      * Return all registered descriptors.
      */
-    Map<Class, DESCRIPTOR> getDescriptors();
+    Map<Class<?>, DESCRIPTOR> getDescriptors();
 
     /**
      * PUBLIC:
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CMPPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CMPPolicy.java
index 6b1622b..6c9051b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CMPPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CMPPolicy.java
@@ -524,7 +524,7 @@
     /**
      * INTERNAL:
      */
-    public Object getPKClassInstance() {
+    public <T> T getPKClassInstance() {
         // TODO fix this exception so that it is more descriptive
         // This method only works in CMP3Policy but was added here for separation
         // of components
@@ -534,7 +534,7 @@
     /**
      * INTERNAL:
      */
-    public Class getPKClass() {
+    public <T> Class<T> getPKClass() {
         // TODO fix this exception so that it is more descriptive
         // This method only works in CMP3Policy but was added here for separation
         // of components
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CacheIndex.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CacheIndex.java
index 09c6de8..dd3262f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CacheIndex.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CacheIndex.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
@@ -20,6 +20,7 @@
 
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.internal.helper.DatabaseField;
+import org.eclipse.persistence.internal.identitymaps.WeakIdentityMap;
 
 /**
  * <p><b>Purpose</b>:
@@ -36,7 +37,7 @@
     protected int cacheSize;
 
     /** Allows the identity map class type to be set. */
-    protected Class cacheType = ClassConstants.WeakIdentityMap_Class;
+    protected Class<? extends WeakIdentityMap> cacheType = ClassConstants.WeakIdentityMap_Class;
 
     public CacheIndex() {
         this.fields = new ArrayList<>();
@@ -111,7 +112,7 @@
      * This default to a weak cache, and should normally not be changed.
      * For a weak cache, the index will remain until the object gcs from the main cache.
      */
-    public void setCacheType(Class cacheType) {
+    public void setCacheType(Class<? extends WeakIdentityMap> cacheType) {
         this.cacheType = cacheType;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CachePolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CachePolicy.java
index 9e89c0f..6d37522 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CachePolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CachePolicy.java
@@ -25,6 +25,7 @@
 import java.util.Map;
 import java.util.Set;
 
+import jakarta.persistence.Cache;
 import org.eclipse.persistence.annotations.CacheCoordinationType;
 import org.eclipse.persistence.annotations.CacheKeyType;
 import org.eclipse.persistence.annotations.DatabaseChangeNotificationType;
@@ -36,6 +37,7 @@
 import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.identitymaps.CacheId;
 import org.eclipse.persistence.internal.identitymaps.CacheKey;
+import org.eclipse.persistence.internal.identitymaps.IdentityMap;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.internal.security.PrivilegedClassForName;
 import org.eclipse.persistence.internal.sessions.AbstractRecord;
@@ -44,6 +46,8 @@
 import org.eclipse.persistence.logging.SessionLog;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.sessions.DatabaseSession;
+import org.eclipse.persistence.sessions.interceptors.CacheInterceptor;
+import org.eclipse.persistence.sessions.interceptors.CacheKeyInterceptor;
 
 /**
  * <p><b>Purpose</b>:
@@ -56,13 +60,13 @@
  * @see ClassDescriptor
  */
 public class CachePolicy implements Cloneable, Serializable {
-    protected Class identityMapClass;
+    protected Class<? extends IdentityMap> identityMapClass;
     protected int identityMapSize;
     protected boolean shouldAlwaysRefreshCache;
     protected boolean shouldOnlyRefreshCacheIfNewerVersion;
     protected boolean shouldDisableCacheHits;
 
-    protected Class remoteIdentityMapClass;
+    protected Class<? extends IdentityMap> remoteIdentityMapClass;
     protected int remoteIdentityMapSize;
     protected boolean shouldAlwaysRefreshCacheOnRemote;
     protected boolean shouldDisableCacheHitsOnRemote;
@@ -105,7 +109,7 @@
     protected CacheKeyType cacheKeyType;
 
     //Added for interceptor support.
-    protected Class cacheInterceptorClass;
+    protected Class<? extends CacheInterceptor> cacheInterceptorClass;
     //Added for interceptor support.
     protected String cacheInterceptorClassName;
 
@@ -161,7 +165,7 @@
         // If the parent is isolated, then the child must also be isolated.
         if (!parentPolicy.isSharedIsolation()) {
             // Do not override cache isolation when explicitly enabled by @Cacheable(true) annotation in current class.
-            boolean copyParrent = cacheable == null || cacheable == false;
+            boolean copyParrent = cacheable == null || !cacheable;
             if (!isIsolated() && (getCacheIsolation() != parentPolicy.getCacheIsolation()) && copyParrent) {
                 session.log(SessionLog.WARNING, SessionLog.METADATA, "overriding_cache_isolation",
                         new Object[]{descriptorDescriptor.getAlias(),
@@ -302,7 +306,7 @@
      * The primary key is always indexed in the cache.
      * Cache indexes are defined by their database column names.
      */
-    public void addCacheIndex(DatabaseField fields[]) {
+    public void addCacheIndex(DatabaseField[] fields) {
         addCacheIndex(new CacheIndex(fields));
     }
 
@@ -325,8 +329,8 @@
     public CachePolicy clone() {
         try {
             return (CachePolicy)super.clone();
-        } catch (CloneNotSupportedException ignore) {
-            throw new InternalError(ignore.getMessage());
+        } catch (CloneNotSupportedException cnse) {
+            throw new InternalError(cnse.getMessage());
         }
     }
 
@@ -358,7 +362,7 @@
             if (this.cacheInterceptorClass == null && this.cacheInterceptorClassName != null){
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        this.cacheInterceptorClass = AccessController.doPrivileged(new PrivilegedClassForName(this.cacheInterceptorClassName, true, classLoader));
+                        this.cacheInterceptorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(this.cacheInterceptorClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(this.cacheInterceptorClassName, exception.getException());
                    }
@@ -404,8 +408,9 @@
      * As with IdentityMaps an entire class inheritance hierarchy will share the same interceptor.
      * @see org.eclipse.persistence.sessions.interceptors.CacheInterceptor
      */
-    public Class getCacheInterceptorClass(){
-        return this.cacheInterceptorClass;
+    @SuppressWarnings({"unchecked"})
+    public <T extends CacheInterceptor> Class<T> getCacheInterceptorClass(){
+        return (Class<T>) this.cacheInterceptorClass;
     }
 
     /**
@@ -442,8 +447,9 @@
      * Return the class of identity map to be used by this descriptor.
      * The default is the "SoftCacheWeakIdentityMap".
      */
-    public Class getIdentityMapClass() {
-        return identityMapClass;
+    @SuppressWarnings({"unchecked"})
+    public <T extends IdentityMap> Class<T> getIdentityMapClass() {
+        return (Class<T>) identityMapClass;
     }
 
     /**
@@ -459,12 +465,12 @@
      * Return the class of identity map to be used by this descriptor.
      * The default is the "SoftCacheWeakIdentityMap".
      */
-    public Class getRemoteIdentityMapClass() {
+    @SuppressWarnings({"unchecked"})
+    public <T extends IdentityMap> Class<T> getRemoteIdentityMapClass() {
         if (remoteIdentityMapClass == null) {
             remoteIdentityMapClass = getIdentityMapClass();
         }
-
-        return remoteIdentityMapClass;
+        return (Class<T>) remoteIdentityMapClass;
     }
 
     /**
@@ -644,7 +650,7 @@
      * Set the class of identity map to be used by this descriptor.
      * The default is the "FullIdentityMap".
      */
-    public void setRemoteIdentityMapClass(Class theIdentityMapClass) {
+    public void setRemoteIdentityMapClass(Class<? extends IdentityMap> theIdentityMapClass) {
         remoteIdentityMapClass = theIdentityMapClass;
     }
 
@@ -776,7 +782,7 @@
      * Set the class of identity map to be used by this descriptor.
      * The default is the "FullIdentityMap".
      */
-    public void setIdentityMapClass(Class theIdentityMapClass) {
+    public void setIdentityMapClass(Class<? extends IdentityMap> theIdentityMapClass) {
         identityMapClass = theIdentityMapClass;
     }
 
@@ -840,7 +846,7 @@
      * As with IdentityMaps an entire class inheritance hierarchy will share the same interceptor.
      * @see org.eclipse.persistence.sessions.interceptors.CacheInterceptor
      */
-    public void setCacheInterceptorClass(Class cacheInterceptorClass){
+    public void setCacheInterceptorClass(Class<? extends CacheInterceptor> cacheInterceptorClass){
         this.cacheInterceptorClass = cacheInterceptorClass;
     }
 
@@ -1005,7 +1011,7 @@
         for (CacheIndex index : this.cacheIndexes.values()) {
             List<DatabaseField> searchFields = index.getFields();
             int size = searchFields.size();
-            Set<DatabaseField> foundFields = new HashSet(size);
+            Set<DatabaseField> foundFields = new HashSet<>(size);
             boolean isValid = expression.extractFields(true, false, descriptor, searchFields, foundFields);
             if (isValid && (foundFields.size() == size)) {
                 return true;
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 34afb9b..22d8757 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
@@ -101,6 +101,7 @@
 import org.eclipse.persistence.internal.helper.Helper;
 import org.eclipse.persistence.internal.helper.MappingCompare;
 import org.eclipse.persistence.internal.helper.NonSynchronizedVector;
+import org.eclipse.persistence.internal.identitymaps.IdentityMap;
 import org.eclipse.persistence.internal.indirection.ProxyIndirectionPolicy;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.internal.security.PrivilegedClassForName;
@@ -140,6 +141,7 @@
 import org.eclipse.persistence.sequencing.Sequence;
 import org.eclipse.persistence.sessions.DatabaseRecord;
 import org.eclipse.persistence.sessions.Project;
+import org.eclipse.persistence.sessions.interceptors.CacheInterceptor;
 import org.eclipse.persistence.sessions.remote.DistributedSession;
 
 /**
@@ -1007,7 +1009,7 @@
      */
     protected void checkDatabase(AbstractSession session) {
         if (session.getIntegrityChecker().shouldCheckDatabase()) {
-            for (Iterator iterator = getTables().iterator(); iterator.hasNext();) {
+            for (Iterator<DatabaseTable> iterator = getTables().iterator(); iterator.hasNext();) {
                 DatabaseTable table = (DatabaseTable)iterator.next();
                 if (session.getIntegrityChecker().checkTable(table, session)) {
                     // To load the fields of database into a vector
@@ -1336,7 +1338,7 @@
         Vector mappingsVector = NonSynchronizedVector.newInstance();
 
         // All the mappings
-        for (Enumeration mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
             DatabaseMapping mapping;
 
             mapping = (DatabaseMapping)((DatabaseMapping)mappingsEnum.nextElement()).clone();
@@ -1357,7 +1359,7 @@
 
         // PrimaryKeyFields
         List primaryKeyVector = new ArrayList(getPrimaryKeyFields().size());
-        List primaryKeyFields = getPrimaryKeyFields();
+        List<DatabaseField> primaryKeyFields = getPrimaryKeyFields();
         for (int index = 0; index < primaryKeyFields.size(); index++) {
             DatabaseField primaryKey = ((DatabaseField)primaryKeyFields.get(index)).clone();
             primaryKeyVector.add(primaryKey);
@@ -1487,7 +1489,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        descriptorClass = AccessController.doPrivileged(new PrivilegedClassForName(getJavaClassName(), true, classLoader));
+                        descriptorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getJavaClassName(), true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(getJavaClassName(), exception.getException());
                     }
@@ -1505,7 +1507,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        amendmentClass = AccessController.doPrivileged(new PrivilegedClassForName(getAmendmentClassName(), true, classLoader));
+                        amendmentClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getAmendmentClassName(), true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(getAmendmentClassName(), exception.getException());
                     }
@@ -1524,7 +1526,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        copyPolicyClass = AccessController.doPrivileged(new PrivilegedClassForName(getCopyPolicyClassName(), true, classLoader));
+                        copyPolicyClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getCopyPolicyClassName(), true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(getCopyPolicyClassName(), exception.getException());
                     }
@@ -1554,7 +1556,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        serializedObjectPolicyClass = AccessController.doPrivileged(new PrivilegedClassForName(serializedObjectPolicyClassName, true, classLoader));
+                        serializedObjectPolicyClass = AccessController.doPrivileged(new PrivilegedClassForName<>(serializedObjectPolicyClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(serializedObjectPolicyClassName, exception.getException());
                     }
@@ -1583,7 +1585,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName(defaultQueryRedirectorClassName, true, classLoader));
+                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(defaultQueryRedirectorClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(defaultQueryRedirectorClassName, exception.getException());
                     }
@@ -1608,7 +1610,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName(defaultReadObjectQueryRedirectorClassName, true, classLoader));
+                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(defaultReadObjectQueryRedirectorClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(defaultReadObjectQueryRedirectorClassName, exception.getException());
                     }
@@ -1632,7 +1634,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName(defaultReadAllQueryRedirectorClassName, true, classLoader));
+                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(defaultReadAllQueryRedirectorClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(defaultReadAllQueryRedirectorClassName, exception.getException());
                     }
@@ -1656,7 +1658,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName(defaultReportQueryRedirectorClassName, true, classLoader));
+                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(defaultReportQueryRedirectorClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(defaultReportQueryRedirectorClassName, exception.getException());
                     }
@@ -1680,7 +1682,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName(defaultInsertObjectQueryRedirectorClassName, true, classLoader));
+                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(defaultInsertObjectQueryRedirectorClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(defaultInsertObjectQueryRedirectorClassName, exception.getException());
                     }
@@ -1704,7 +1706,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName(defaultUpdateObjectQueryRedirectorClassName, true, classLoader));
+                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(defaultUpdateObjectQueryRedirectorClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(defaultUpdateObjectQueryRedirectorClassName, exception.getException());
                     }
@@ -1728,7 +1730,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName(defaultDeleteObjectQueryRedirectorClassName, true, classLoader));
+                        redirectorClass = AccessController.doPrivileged(new PrivilegedClassForName<>(defaultDeleteObjectQueryRedirectorClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(defaultDeleteObjectQueryRedirectorClassName, exception.getException());
                     }
@@ -1748,7 +1750,7 @@
                 throw ValidationException.classNotFoundWhileConvertingClassNames(defaultDeleteObjectQueryRedirectorClassName, e);
             }
         }
-        Iterator mappings = getMappings().iterator();
+        Iterator<DatabaseMapping> mappings = getMappings().iterator();
         while (mappings.hasNext()){
             ((DatabaseMapping)mappings.next()).convertClassNamesToClasses(classLoader);
         }
@@ -1776,14 +1778,14 @@
                 List<String> valuePair = getUnconvertedProperties().get(propertyName);
                 String value = valuePair.get(0);
                 String valueTypeName = valuePair.get(1);
-                Class valueType = String.class;
+                Class<String> valueType = String.class;
 
                 if (valueTypeName != null) {
                     // Have to initialize the valueType now
                     try {
                         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                             try {
-                                valueType = AccessController.doPrivileged(new PrivilegedClassForName(valueTypeName, true, classLoader));
+                                valueType = AccessController.doPrivileged(new PrivilegedClassForName<>(valueTypeName, true, classLoader));
                             } catch (PrivilegedActionException exception) {
                                 throw ValidationException.classNotFoundWhileConvertingClassNames(valueTypeName, exception.getException());
                             }
@@ -2221,7 +2223,7 @@
      * As with IdentityMaps an entire class inheritance hierarchy will share the same interceptor.
      * @see org.eclipse.persistence.sessions.interceptors.CacheInterceptor
      */
-    public Class getCacheInterceptorClass() {
+    public Class<? extends CacheInterceptor> getCacheInterceptorClass() {
         return getCachePolicy().getCacheInterceptorClass();
     }
 
@@ -2547,7 +2549,7 @@
      */
     public DatabaseMapping getMappingForAttributeName(String attributeName) {
         // ** Don't use this internally, just for amendments, see getMappingForAttributeName on ObjectBuilder.
-        for (Enumeration mappingsNum = mappings.elements(); mappingsNum.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappingsNum = mappings.elements(); mappingsNum.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappingsNum.nextElement();
             if ((mapping.getAttributeName() != null) && mapping.getAttributeName().equals(attributeName)) {
                 return mapping;
@@ -2584,7 +2586,7 @@
      */
     public Vector getMultipleTableForeignKeyAssociations() {
         Vector associations = new Vector(getAdditionalTablePrimaryKeyFields().size() * 2);
-        Iterator tablesHashtable = getAdditionalTablePrimaryKeyFields().values().iterator();
+        Iterator<Map<DatabaseField, DatabaseField>> tablesHashtable = getAdditionalTablePrimaryKeyFields().values().iterator();
         while (tablesHashtable.hasNext()) {
             Map tableHash = (Map)tablesHashtable.next();
             Iterator fieldEnumeration = tableHash.keySet().iterator();
@@ -2634,7 +2636,7 @@
      */
     public Vector getMultipleTablePrimaryKeyAssociations() {
         Vector associations = new Vector(getAdditionalTablePrimaryKeyFields().size() * 2);
-        Iterator tablesHashtable = getAdditionalTablePrimaryKeyFields().values().iterator();
+        Iterator<Map<DatabaseField, DatabaseField>> tablesHashtable = getAdditionalTablePrimaryKeyFields().values().iterator();
         while (tablesHashtable.hasNext()) {
             Map tableHash = (Map)tablesHashtable.next();
             Iterator fieldEnumeration = tableHash.keySet().iterator();
@@ -2704,7 +2706,7 @@
     @Override
     public Vector<String> getPrimaryKeyFieldNames() {
         Vector<String> result = new Vector(getPrimaryKeyFields().size());
-        List primaryKeyFields = getPrimaryKeyFields();
+        List<DatabaseField> primaryKeyFields = getPrimaryKeyFields();
         for (int index = 0; index < primaryKeyFields.size(); index++) {
             result.addElement(((DatabaseField)primaryKeyFields.get(index)).getQualifiedName());
         }
@@ -2878,7 +2880,7 @@
             return null;// Assume aggregate descriptor.
         }
 
-        for (Enumeration tables = getTables().elements(); tables.hasMoreElements();) {
+        for (Enumeration<DatabaseTable> tables = getTables().elements(); tables.hasMoreElements();) {
             DatabaseTable table = (DatabaseTable)tables.nextElement();
 
             if(tableName.indexOf(' ') != -1) {
@@ -2919,7 +2921,7 @@
      */
     public Vector getTableNames() {
         Vector tableNames = new Vector(getTables().size());
-        for (Enumeration fieldsEnum = getTables().elements(); fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseTable> fieldsEnum = getTables().elements(); fieldsEnum.hasMoreElements();) {
             tableNames.addElement(((DatabaseTable)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -3094,7 +3096,7 @@
      * Checks if the class has any private owned parts are not
      */
     public boolean hasPrivatelyOwnedParts() {
-        for (Enumeration mappings = getMappings().elements(); mappings.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappings = getMappings().elements(); mappings.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
             if (mapping.isPrivateOwned()) {
                 return true;
@@ -3232,8 +3234,8 @@
         // Sorting the mappings to ensure that all DirectToFields get merged before all other mappings
         // This prevents null key errors when merging maps
         if (shouldOrderMappings()) {
-            Vector mappings = getMappings();
-            Object[] mappingsArray = new Object[mappings.size()];
+            Vector<DatabaseMapping> mappings = getMappings();
+            DatabaseMapping[] mappingsArray = new DatabaseMapping[mappings.size()];
             for (int index = 0; index < mappings.size(); index++) {
                 mappingsArray[index] = mappings.get(index);
             }
@@ -3307,7 +3309,7 @@
         }
 
         // All the query keys should be initialized.
-        for (Iterator queryKeys = getQueryKeys().values().iterator(); queryKeys.hasNext();) {
+        for (Iterator<QueryKey> queryKeys = getQueryKeys().values().iterator(); queryKeys.hasNext();) {
             QueryKey queryKey = (QueryKey)queryKeys.next();
             queryKey.initialize(this);
         }
@@ -3352,8 +3354,8 @@
         // This prevents null key errors when merging maps
         // This resort will change the previous sort order, only do it if has inheritance.
         if (hasInheritance() && shouldOrderMappings()) {
-            Vector mappings = getMappings();
-            Object[] mappingsArray = new Object[mappings.size()];
+            Vector<DatabaseMapping> mappings = getMappings();
+            DatabaseMapping[] mappingsArray = new DatabaseMapping[mappings.size()];
             for (int index = 0; index < mappings.size(); index++) {
                 mappingsArray[index] = mappings.get(index);
             }
@@ -3642,9 +3644,9 @@
         setInterfaceInitializationStage(INITIALIZED);
 
         if (isInterfaceChildDescriptor()) {
-            for (Iterator<Class> interfaces = getInterfacePolicy().getParentInterfaces().iterator();
+            for (Iterator<Class<?>> interfaces = getInterfacePolicy().getParentInterfaces().iterator();
                      interfaces.hasNext();) {
-                Class parentInterface = interfaces.next();
+                Class<?> parentInterface = interfaces.next();
                 ClassDescriptor parentDescriptor = session.getDescriptor(parentInterface);
                 parentDescriptor.interfaceInitialization(session);
 
@@ -3652,8 +3654,8 @@
                     setQueryKeys(Helper.concatenateMaps(getQueryKeys(), parentDescriptor.getQueryKeys()));
                 } else {
                     //ClassDescriptor is a class, not an interface
-                    for (Iterator parentKeys = parentDescriptor.getQueryKeys().keySet().iterator();
-                             parentKeys.hasNext();) {
+                    for (Iterator<String> parentKeys = parentDescriptor.getQueryKeys().keySet().iterator();
+                         parentKeys.hasNext();) {
                         String queryKeyName = (String)parentKeys.next();
                         if (!hasQueryKeyOrMapping(queryKeyName)) {
                             //the parent descriptor has a query key not defined in the child
@@ -4156,7 +4158,7 @@
             // Cloning is only auto set for field access, as method access
             // may not have simple fields, same with empty new and reflection get/set.
             boolean isMethodAccess = false;
-            for (Iterator iterator = getMappings().iterator(); iterator.hasNext(); ) {
+            for (Iterator<DatabaseMapping> iterator = getMappings().iterator(); iterator.hasNext(); ) {
                 DatabaseMapping mapping = (DatabaseMapping)iterator.next();
                 if (mapping.isUsingMethodAccess()) {
                     // Ok for lazy 1-1s
@@ -4183,7 +4185,7 @@
         }
 
         // 4924665 Check for spaces in table names, and add the appropriate quote character
-        Iterator tables = this.getTables().iterator();
+        Iterator<DatabaseTable> tables = this.getTables().iterator();
         while(tables.hasNext()) {
             DatabaseTable next = (DatabaseTable)tables.next();
             if(next.getName().indexOf(' ') != -1) {
@@ -4290,9 +4292,9 @@
         assignDefaultValues(session);
 
         if (isInterfaceChildDescriptor()) {
-            for (Iterator<Class> interfaces = getInterfacePolicy().getParentInterfaces().iterator();
+            for (Iterator<Class<?>> interfaces = getInterfacePolicy().getParentInterfaces().iterator();
                      interfaces.hasNext();) {
-                Class parentInterface = interfaces.next();
+                Class<?> parentInterface = interfaces.next();
                 ClassDescriptor parentDescriptor = session.getDescriptor(parentInterface);
                 if ((parentDescriptor == null) || (parentDescriptor.getJavaClass() == getJavaClass()) || parentDescriptor.getInterfacePolicy().usesImplementorDescriptor()) {
                     session.getProject().getDescriptors().put(parentInterface, this);
@@ -4317,7 +4319,7 @@
     public void rehashFieldDependancies(AbstractSession session) {
         getObjectBuilder().rehashFieldDependancies(session);
 
-        for (Enumeration enumtr = getMappings().elements(); enumtr.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> enumtr = getMappings().elements(); enumtr.hasMoreElements();) {
             ((DatabaseMapping)enumtr.nextElement()).rehashFieldDependancies(session);
         }
     }
@@ -4466,7 +4468,7 @@
      * descriptor.
      */
     protected void setAdditionalTablePrimaryKeyFields(DatabaseTable table, DatabaseField field1, DatabaseField field2) {
-        Map tableAdditionalPKFields = getAdditionalTablePrimaryKeyFields().get(table);
+        Map<DatabaseField, DatabaseField> tableAdditionalPKFields = getAdditionalTablePrimaryKeyFields().get(table);
 
         if (tableAdditionalPKFields == null) {
             tableAdditionalPKFields = new HashMap(2);
@@ -4809,7 +4811,7 @@
      * Set the class of identity map to be used by this descriptor.
      * The default is the "FullIdentityMap".
      */
-    public void setIdentityMapClass(Class theIdentityMapClass) {
+    public void setIdentityMapClass(Class<? extends IdentityMap> theIdentityMapClass) {
         getCachePolicy().setIdentityMapClass(theIdentityMapClass);
     }
 
@@ -5090,7 +5092,7 @@
      */
     public void setMappings(Vector<DatabaseMapping> mappings) {
         // This is used from XML reader so must ensure that all mapping's descriptor has been set.
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
 
             // For CR#2646, if the mapping already points to the parent descriptor then leave it.
@@ -5511,7 +5513,7 @@
      * all tables in this descriptor
      */
     public void setTableQualifier(String tableQualifier) {
-        for (Enumeration enumtr = getTables().elements(); enumtr.hasMoreElements();) {
+        for (Enumeration<DatabaseTable> enumtr = getTables().elements(); enumtr.hasMoreElements();) {
             DatabaseTable table = (DatabaseTable)enumtr.nextElement();
             table.setTableQualifier(tableQualifier);
         }
@@ -5822,8 +5824,8 @@
         if (lockingPolicy != null && (lockingPolicy instanceof FieldsLockingPolicy)) {
             return false;
         }
-        Vector mappings = getMappings();
-        for (Iterator iterator = mappings.iterator(); iterator.hasNext();) {
+        Vector<DatabaseMapping> mappings = getMappings();
+        for (Iterator<DatabaseMapping> iterator = mappings.iterator(); iterator.hasNext();) {
             DatabaseMapping mapping = (DatabaseMapping)iterator.next();
             if (!mapping.isChangeTrackingSupported(project) ) {
                 return false;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassExtractor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassExtractor.java
index 136f4a2..7809104 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassExtractor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassExtractor.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
@@ -32,7 +32,7 @@
      * Map is used as the public interface to database row, the key is the field name,
      * the value is the database value.
      */
-    public abstract Class extractClassFromRow(org.eclipse.persistence.sessions.Record databaseRow, Session session);
+    public abstract <T> Class<T> extractClassFromRow(org.eclipse.persistence.sessions.Record databaseRow, Session session);
 
     /**
      * Allow for any initialization.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/DescriptorEventManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/DescriptorEventManager.java
index ff68440..1eac3bd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/DescriptorEventManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/DescriptorEventManager.java
@@ -664,7 +664,7 @@
 
         // Step 2 - Notify the Entity Listener's first, top -> down.
         for (int index = entityListenerEventManagers.size() - 1; index >= 0; index--) {
-            List entityListenerEventListeners = entityListenerEventManagers.get(index).getEntityListenerEventListeners();
+            List<DescriptorEventListener> entityListenerEventListeners = entityListenerEventManagers.get(index).getEntityListenerEventListeners();
 
             for (int i = 0; i < entityListenerEventListeners.size(); i++) {
                 DescriptorEventListener listener = (DescriptorEventListener) entityListenerEventListeners.get(i);
@@ -1055,7 +1055,7 @@
      * @return initialized instance of {@link java.util.concurrent.atomic.AtomicIntegerArray}
      */
     private static <T> AtomicReferenceArray<T> newAtomicReferenceArray(final int length) {
-        final AtomicReferenceArray array = new AtomicReferenceArray<>(length);
+        final AtomicReferenceArray<T> array = new AtomicReferenceArray<>(length);
         for (int index = 0; index < length; array.set(index++, null));
         return array;
     }
@@ -1068,7 +1068,7 @@
      */
     private static <T> AtomicReferenceArray<T> newAtomicReferenceArray(final AtomicReferenceArray<T> src) {
         final int length = src.length();
-        final AtomicReferenceArray array = new AtomicReferenceArray<>(length);
+        final AtomicReferenceArray<T> array = new AtomicReferenceArray<>(length);
         for (int index = 0; index < length; array.set(index, src.get(index++)));
         return array;
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/DescriptorQueryManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/DescriptorQueryManager.java
index 86ee179..df31775 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/DescriptorQueryManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/DescriptorQueryManager.java
@@ -282,7 +282,7 @@
 
         // Bug 3037701 - clone the queries
         manager.setQueries(new LinkedHashMap(getQueries().size()));//bug5677655
-        Iterator iterator = queries.values().iterator();
+        Iterator<List<DatabaseQuery>> iterator = queries.values().iterator();
         while (iterator.hasNext()) {
             Iterator queriesForKey = ((Vector)iterator.next()).iterator();
             while (queriesForKey.hasNext()) {
@@ -327,7 +327,7 @@
      * This method is implemented by subclasses as necessary.
      */
     public void convertClassNamesToClasses(ClassLoader classLoader){
-        Iterator queryVectors = getQueries().values().iterator();
+        Iterator<List<DatabaseQuery>> queryVectors = getQueries().values().iterator();
         while (queryVectors.hasNext()){
             Iterator queries = ((Vector)queryVectors.next()).iterator();
             while (queries.hasNext()){
@@ -498,7 +498,7 @@
      */
     public Vector getAllQueries() {
         Vector allQueries = new Vector();
-        for (Iterator vectors = getQueries().values().iterator(); vectors.hasNext();) {
+        for (Iterator<List<DatabaseQuery>> vectors = getQueries().values().iterator(); vectors.hasNext();) {
             allQueries.addAll((Vector)vectors.next());
         }
         return allQueries;
@@ -1029,7 +1029,7 @@
             // PERF: Only process changed mappings.
             ObjectChangeSet changeSet = query.getObjectChangeSet();
             if ((changeSet != null) && (!changeSet.isNew())) {
-                List changeRecords = changeSet.getChanges();
+                List<org.eclipse.persistence.sessions.changesets.ChangeRecord> changeRecords = changeSet.getChanges();
                 int size = changeRecords.size();
                 for (int index = 0; index < size; index++) {
                     ChangeRecord record = (ChangeRecord)changeRecords.get(index);
@@ -1123,7 +1123,7 @@
             // PERF: Only process changed mappings.
             ObjectChangeSet changeSet = query.getObjectChangeSet();
             if ((changeSet != null) && (!changeSet.isNew())) {
-                List changeRecords = changeSet.getChanges();
+                List<org.eclipse.persistence.sessions.changesets.ChangeRecord> changeRecords = changeSet.getChanges();
                 int size = changeRecords.size();
                 for (int index = 0; index < size; index++) {
                     ChangeRecord record = (ChangeRecord)changeRecords.get(index);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/FetchGroupManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/FetchGroupManager.java
index a3fb6d0..8080751 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/FetchGroupManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/FetchGroupManager.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
@@ -537,7 +537,7 @@
      */
     // TODO-244124-dclarke: Needs to be updated to reflect new FetchGroup behaviour
     private void refreshFetchGroupIntoClones(Object cachedObject, Object workingClone, Object backupClone, FetchGroup fetchGroupInObject, FetchGroup fetchGroupInClone, UnitOfWorkImpl uow) {
-        Vector mappings = descriptor.getMappings();
+        Vector<DatabaseMapping> mappings = descriptor.getMappings();
         boolean isObjectPartial = (fetchGroupInObject != null);
         Set fetchedAttributes = isObjectPartial ? fetchGroupInObject.getAttributeNames() : null;
         int size = mappings.size();
@@ -568,7 +568,7 @@
      */
     private void revertDataIntoUnfetchedAttributesOfClones(Object cachedObject, Object workingClone, Object backupClone, FetchGroup fetchGroupInObject, FetchGroup fetchGroupInClone, UnitOfWorkImpl uow) {
         // Fetched attributes set in working clone.
-        Set fetchedAttributesClone = fetchGroupInClone.getAttributeNames();
+        Set<String> fetchedAttributesClone = fetchGroupInClone.getAttributeNames();
         // Fetched attributes set in cached object.
         Set fetchedAttributesCached = null;
         if (fetchGroupInObject != null) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/FieldsLockingPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/FieldsLockingPolicy.java
index a6fdd40..aaa7880 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/FieldsLockingPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/FieldsLockingPolicy.java
@@ -77,8 +77,8 @@
      * and class indicator fields.
      * This is called during lazy initialization.
      */
-    protected List buildAllNonPrimaryKeyFields() {
-        List fields = new ArrayList();
+    protected List<DatabaseField> buildAllNonPrimaryKeyFields() {
+        List<DatabaseField> fields = new ArrayList<>();
         for (DatabaseField dbField : descriptor.getSelectionFields()) {
             if (!isPrimaryKey(dbField)) {
                 if (descriptor.hasInheritance()) {
@@ -231,7 +231,7 @@
      * null in some situations.
      */
     @Override
-    public Object getBaseValue(){
+    public <T> T getBaseValue(){
         return null; // this locking type does not store values in the cache
     }
 
@@ -279,7 +279,7 @@
      * is stored in the object, then return a null.
      */
     @Override
-    public Object getValueToPutInCache(AbstractRecord row, AbstractSession session) {
+    public <T> T getValueToPutInCache(AbstractRecord row, AbstractSession session) {
         return null;
     }
 
@@ -299,7 +299,7 @@
      * This method will return the optimistic lock value for the object
      */
     @Override
-    public Object getWriteLockValue(Object domainObject, Object primaryKey, AbstractSession session) {
+    public <T> T getWriteLockValue(Object domainObject, Object primaryKey, AbstractSession session) {
         //There is no way of knowing if this value is newer or not, so always return true.
         return null;
     }
@@ -378,9 +378,9 @@
             return true;
         } else {
             if (descriptor.isMultipleTableDescriptor()) {
-                for (Iterator enumtr = descriptor.getAdditionalTablePrimaryKeyFields().values().iterator();
+                for (Iterator<Map<DatabaseField, DatabaseField>> enumtr = descriptor.getAdditionalTablePrimaryKeyFields().values().iterator();
                          enumtr.hasNext();) {
-                    if (((Map)enumtr.next()).containsKey(dbField)) {
+                    if (enumtr.next().containsKey(dbField)) {
                         return true;
                     }
                 }
@@ -412,7 +412,7 @@
     /**
      * INTERNAL: Set method for all the primary keys
      */
-    protected void setAllNonPrimaryKeyFields(List allNonPrimaryKeyFields) {
+    protected void setAllNonPrimaryKeyFields(List<DatabaseField> allNonPrimaryKeyFields) {
         this.allNonPrimaryKeyFields = allNonPrimaryKeyFields;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/InheritancePolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/InheritancePolicy.java
index 3bc1912..e3b637f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/InheritancePolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/InheritancePolicy.java
@@ -73,7 +73,7 @@
     protected transient Expression onlyInstancesExpression;
     protected transient Expression withAllSubclassesExpression;
     // null if there are no childrenTables, otherwise all tables for reference class plus childrenTables
-    protected transient Vector allTables;
+    protected transient Vector<DatabaseTable> allTables;
     // all tables for all subclasses (subclasses of subclasses included), should be in sync with childrenTablesJoinExpressions.
     protected transient List<DatabaseTable> childrenTables;
     // join expression for each child table, keyed by the table, should be in sync with childrenTables.
@@ -108,11 +108,11 @@
      * Only descriptors involved in inheritance should have a policy.
      */
     public InheritancePolicy() {
-        this.classIndicatorMapping = new HashMap(10);
-        this.classNameIndicatorMapping = new HashMap(10);
+        this.classIndicatorMapping = new HashMap<>(10);
+        this.classNameIndicatorMapping = new HashMap<>(10);
         this.shouldUseClassNameAsIndicator = false;
-        this.allChildClassIndicators = new ArrayList(4);
-        this.childDescriptors = new ArrayList(4);
+        this.allChildClassIndicators = new ArrayList<>(4);
+        this.childDescriptors = new ArrayList<>(4);
         this.setJoinedStrategy();
     }
 
@@ -141,11 +141,11 @@
      */
     protected void addChildTableJoinExpression(DatabaseTable table, Expression expression) {
         if (this.childrenTablesJoinExpressions == null) {
-            this.childrenTablesJoinExpressions = new HashMap();
+            this.childrenTablesJoinExpressions = new HashMap<>();
            // childrenTables should've been null, too
-            this.childrenTables = new ArrayList();
+            this.childrenTables = new ArrayList<>();
            // allTables should've been null, too
-            this.allTables = new Vector(getDescriptor().getTables());
+            this.allTables = new Vector<>(getDescriptor().getTables());
         }
         // Avoid duplicates as two independent subclasses may have the same table.
         if (!this.childrenTables.contains(table)) {
@@ -316,7 +316,7 @@
 
         // CR#3166555 - Have the mechanism build the statement to avoid duplicating code and ensure that lock-mode, hints, hierarchical, etc. are set.
         SQLSelectStatement selectStatement = mechanism.buildBaseSelectStatement(false, clonedExpressions);
-        selectStatement.setTables(org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(1));
+        selectStatement.setTables(new ArrayList<>(1));
         selectStatement.addTable(getReadAllSubclassesView());
 
         // Case, normal read for branch inheritance class that reads subclasses all in its own table(s).
@@ -423,7 +423,7 @@
             Object key = keysEnum.next();
             Object value = valuesEnum.next();
 
-            Class theClass = convertClassNameToClass((String) key, classLoader);
+            Class<?> theClass = convertClassNameToClass((String) key, classLoader);
             classIndicatorMapping.put(theClass, value);
             classIndicatorMapping.put(value, theClass);
         }
@@ -435,22 +435,20 @@
 
         // Initialize the class extractor name.
         if (classExtractorName != null) {
-            Class classExtractorClass = convertClassNameToClass(classExtractorName, classLoader);
+            Class<ClassExtractor> classExtractorClass = convertClassNameToClass(classExtractorName, classLoader);
 
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        setClassExtractor((ClassExtractor) AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(classExtractorClass)));
+                        setClassExtractor( AccessController.<ClassExtractor>doPrivileged(new PrivilegedNewInstanceFromClass<>(classExtractorClass)));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(classExtractorName, exception.getException());
                     }
                 } else {
-                    setClassExtractor((ClassExtractor) PrivilegedAccessHelper.newInstanceFromClass(classExtractorClass));
+                    setClassExtractor(PrivilegedAccessHelper.<ClassExtractor>newInstanceFromClass(classExtractorClass));
                 }
-            } catch (IllegalAccessException ex) {
+            } catch (ReflectiveOperationException ex) {
                 throw ValidationException.reflectiveExceptionWhileCreatingClassInstance(classExtractorName, ex);
-            } catch (InstantiationException e) {
-                throw ValidationException.reflectiveExceptionWhileCreatingClassInstance(classExtractorName, e);
             }
         }
     }
@@ -459,16 +457,16 @@
      * INTERNAL:
      * Convert the given className to an actual class.
      */
-    protected Class convertClassNameToClass(String className, ClassLoader classLoader) {
+    protected <T> Class<T> convertClassNameToClass(String className, ClassLoader classLoader) {
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    return AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                    return AccessController.<Class<T>>doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(className, (Exception)exception.getCause());
                 }
             } else {
-                return PrivilegedAccessHelper.getClassForName(className, true, classLoader);
+                return PrivilegedAccessHelper.<T>getClassForName(className, true, classLoader);
             }
         } catch (ClassNotFoundException exc){
             throw ValidationException.classNotFoundWhileConvertingClassNames(className, exc);
@@ -503,7 +501,7 @@
      */
     protected List<Object> getAllChildClassIndicators() {
         if (allChildClassIndicators == null) {
-            allChildClassIndicators = new ArrayList(4);
+            allChildClassIndicators = new ArrayList<>(4);
         }
         return allChildClassIndicators;
     }
@@ -517,7 +515,7 @@
     @Override
     public List<ClassDescriptor> getAllChildDescriptors() {
         // Guess the number of child descriptors...
-        List<ClassDescriptor> allChildDescriptors = new ArrayList(this.getAllChildClassIndicators().size());
+        List<ClassDescriptor> allChildDescriptors = new ArrayList<>(this.getAllChildClassIndicators().size());
         return getAllChildDescriptors(allChildDescriptors);
     }
 
@@ -561,7 +559,7 @@
      * INTERNAL:
      * all tables for reference class plus childrenTables
      */
-    public Vector getAllTables() {
+    public Vector<DatabaseTable> getAllTables() {
         if (allTables == null) {
             return this.getDescriptor().getTables();
         } else {
@@ -669,8 +667,8 @@
      * Return the class indicator associations for XML.
      * List of class-name/value associations.
      */
-    public Vector getClassIndicatorAssociations() {
-        Vector associations = new Vector(getClassNameIndicatorMapping().size() / 2);
+    public Vector<Association> getClassIndicatorAssociations() {
+        Vector<Association> associations = new Vector<>(getClassNameIndicatorMapping().size() / 2);
         Iterator classesEnum = getClassNameIndicatorMapping().keySet().iterator();
         Iterator valuesEnum = getClassNameIndicatorMapping().values().iterator();
         while (classesEnum.hasNext()) {
@@ -678,7 +676,7 @@
 
             // If the project was built in runtime is a class, MW is a string.
             if (className instanceof Class) {
-                className = ((Class)className).getName();
+                className = ((Class<?>)className).getName();
             }
             Object value = valuesEnum.next();
             associations.addElement(new TypedAssociation(className, value));
@@ -869,7 +867,7 @@
      */
     public ClassDescriptor getSubclassDescriptor(Class theClass) {
         if (hasChildren()) {
-            for (Iterator enumtr = getChildDescriptors().iterator(); enumtr.hasNext();) {
+            for (Iterator<ClassDescriptor> enumtr = getChildDescriptors().iterator(); enumtr.hasNext();) {
                 ClassDescriptor childDescriptor = (ClassDescriptor)enumtr.next();
                 if (childDescriptor.getJavaClass().equals(theClass)) {
                     return childDescriptor;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/InterfacePolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/InterfacePolicy.java
index 760e380..4ba73f8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/InterfacePolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/InterfacePolicy.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
@@ -44,12 +44,12 @@
  * @since TopLink for Java 2.0
  */
 public class InterfacePolicy implements Serializable, Cloneable {
-    protected List<Class> parentInterfaces;
+    protected List<Class<?>> parentInterfaces;
     protected List<String> parentInterfaceNames;
     protected List<ClassDescriptor> parentDescriptors;
     protected List<ClassDescriptor> childDescriptors;
     protected ClassDescriptor descriptor;
-    protected Class implementorDescriptor;
+    protected Class<?> implementorDescriptor;
     protected String implementorDescriptorClassName;
 
     /**
@@ -58,10 +58,10 @@
      * Only descriptor involved in interface should have a policy.
      */
     public InterfacePolicy() {
-        this.childDescriptors = new ArrayList();
-        this.parentInterfaces = new ArrayList(2);
-        this.parentInterfaceNames = new ArrayList(2);
-        this.parentDescriptors = new ArrayList(2);
+        this.childDescriptors = new ArrayList<>();
+        this.parentInterfaces = new ArrayList<>(2);
+        this.parentInterfaceNames = new ArrayList<>(2);
+        this.parentDescriptors = new ArrayList<>(2);
     }
 
     /**
@@ -96,7 +96,7 @@
      *
      * This method should be called once for each parent Interface of the Descriptor.
      */
-    public void addParentInterface(Class parentInterface) {
+    public void addParentInterface(Class<?> parentInterface) {
         getParentInterfaces().add(parentInterface);
     }
 
@@ -128,8 +128,9 @@
      * INTERNAL:
      * Returns the implementor descriptor class.
      */
-    public Class getImplementorDescriptor() {
-        return implementorDescriptor;
+    @SuppressWarnings({"unchecked"})
+    public <T> Class<T> getImplementorDescriptor() {
+        return (Class<T>) implementorDescriptor;
     }
 
     /**
@@ -155,7 +156,7 @@
      * INTERNAL:
      * Return the list of parent interfaces.
      */
-    public List<Class> getParentInterfaces() {
+    public List<Class<?>> getParentInterfaces() {
         return parentInterfaces;
     }
 
@@ -175,14 +176,14 @@
      * It will also convert referenced classes to the versions of the classes from the classLoader.
      */
     public void convertClassNamesToClasses(ClassLoader classLoader) {
-        List<Class> newParentInterfaces = new ArrayList(2);
-        for (Iterator iterator = getParentInterfaceNames().iterator(); iterator.hasNext(); ) {
-            String interfaceName = (String)iterator.next();
-            Class interfaceClass = null;
+        List<Class<?>> newParentInterfaces = new ArrayList<>(2);
+        for (Iterator<String> iterator = getParentInterfaceNames().iterator(); iterator.hasNext(); ) {
+            String interfaceName = iterator.next();
+            Class<?> interfaceClass = null;
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        interfaceClass = AccessController.doPrivileged(new PrivilegedClassForName(interfaceName, true, classLoader));
+                        interfaceClass = AccessController.doPrivileged(new PrivilegedClassForName<>(interfaceName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(interfaceName, exception.getException());
                     }
@@ -235,7 +236,7 @@
      */
     protected ObjectLevelReadQuery prepareQuery(ObjectLevelReadQuery query) {
         ObjectLevelReadQuery concreteQuery = null;
-        Class javaClass = this.descriptor.getJavaClass();
+        Class<?> javaClass = this.descriptor.getJavaClass();
         // PERF: First check the subclass query cache for the prepared query.
         boolean shouldPrepare = query.shouldPrepare();
         if (shouldPrepare) {
@@ -258,7 +259,7 @@
                 concreteQuery.setSelectionCriteria(concreteQuery.getQueryMechanism().getSelectionCriteria().rebuildOn(concreteQuery.getExpressionBuilder()));
             }
             if (concreteQuery.hasAdditionalFields()) {
-                List rebuiltFields = new ArrayList(concreteQuery.getAdditionalFields().size());
+                List<Object> rebuiltFields = new ArrayList<>(concreteQuery.getAdditionalFields().size());
                 for (Object field : concreteQuery.getAdditionalFields()) {
                     if (field instanceof Expression) {
                         rebuiltFields.add(((Expression)field).rebuildOn(concreteQuery.getExpressionBuilder()));
@@ -350,7 +351,7 @@
      * INTERNAL:
      * Sets the implementor descriptor class.
      */
-    public void setImplementorDescriptor(Class implementorDescriptor) {
+    public void setImplementorDescriptor(Class<?> implementorDescriptor) {
         this.implementorDescriptor = implementorDescriptor;
     }
 
@@ -365,7 +366,7 @@
     /**
      * Set the Vector to store parent interfaces.
      */
-    public void setParentInterfaces(List<Class> parentInterfaces) {
+    public void setParentInterfaces(List<Class<?>> parentInterfaces) {
         this.parentInterfaces = parentInterfaces;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/MethodClassExtractor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/MethodClassExtractor.java
index b6ce2d5..6cb0992 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/MethodClassExtractor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/MethodClassExtractor.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
@@ -92,7 +92,7 @@
     @Override
     public void initialize(ClassDescriptor descriptor, Session session) throws DescriptorException {
         setDescriptor(descriptor);
-        Class[] declarationParameters = new Class[1];
+        Class<?>[] declarationParameters = new Class[1];
         declarationParameters[0] = ClassConstants.DatabaseRow_Class;
 
         try {
@@ -123,15 +123,15 @@
      * the value is the database value.
      */
     @Override
-    public Class extractClassFromRow(Record row, org.eclipse.persistence.sessions.Session session) {
-        Class classForRow;
-
+    @SuppressWarnings({"unchecked"})
+    public <T> Class<T> extractClassFromRow(Record row, org.eclipse.persistence.sessions.Session session) {
+        Class<?> classForRow;
         try {
             Object[] arguments = new Object[1];
             arguments[0] = row;
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    classForRow = (Class)AccessController.doPrivileged(new PrivilegedMethodInvoker(getClassExtractionMethod(), null, arguments));
+                    classForRow = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(getClassExtractionMethod(), null, arguments));
                 } catch (PrivilegedActionException exception) {
                     Exception throwableException = exception.getException();
                     if (throwableException instanceof IllegalAccessException) {
@@ -141,7 +141,7 @@
                     }
                 }
             } else {
-                classForRow = (Class)PrivilegedAccessHelper.invokeMethod(getClassExtractionMethod(), null, arguments);
+                classForRow = PrivilegedAccessHelper.invokeMethod(getClassExtractionMethod(), null, arguments);
             }
         } catch (IllegalAccessException exception) {
             throw DescriptorException.illegalAccessWhileInvokingRowExtractionMethod((AbstractRecord)row, getClassExtractionMethod(), getDescriptor(), exception);
@@ -149,7 +149,7 @@
             throw DescriptorException.targetInvocationWhileInvokingRowExtractionMethod((AbstractRecord)row, getClassExtractionMethod(), getDescriptor(), exception);
         }
 
-        return classForRow;
+        return (Class<T>) classForRow;
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ReturningPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ReturningPolicy.java
index 0cb76ea..4b88232 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ReturningPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ReturningPolicy.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
@@ -56,7 +56,7 @@
      * Should be filled out before initialize() is called:
      * fields added after initialization are ignored.
      */
-    protected List<Info> infos = new ArrayList();
+    protected List<Info> infos = new ArrayList<>();
 
     /**
      * The following attributes are initialized by initialize() method.
@@ -80,7 +80,7 @@
      * maps ClassDescriptor's tables into Vectors of fields to be used for call generation.
      * Lazily initialized array [NUM_OPERATIONS]
      */
-    protected Map<DatabaseTable, Vector<DatabaseField>>[] tableToFieldsForGenerationMap;
+    protected Map<DatabaseTable, List<DatabaseField>>[] tableToFieldsForGenerationMap;
 
     /** indicates whether ReturningPolicy is used for generation of the PK. */
     protected boolean isUsedToSetPrimaryKey;
@@ -109,12 +109,12 @@
     protected void fieldIsNotFromDescriptor(DatabaseField field) {
         if (field.getTable().equals(getDescriptor().getDefaultTable())) {
             if (this.fieldsNotFromDescriptor_DefaultTable == null) {
-                this.fieldsNotFromDescriptor_DefaultTable = new HashMap();
+                this.fieldsNotFromDescriptor_DefaultTable = new HashMap<>();
             }
             this.fieldsNotFromDescriptor_DefaultTable.put(field, field);
         } else {
             if (this.fieldsNotFromDescriptor_OtherTables == null) {
-                this.fieldsNotFromDescriptor_OtherTables = new HashMap();
+                this.fieldsNotFromDescriptor_OtherTables = new HashMap<>();
             }
             this.fieldsNotFromDescriptor_OtherTables.put(field, field);
         }
@@ -123,14 +123,14 @@
     /**
      * INTERNAL:
      */
-    public Vector getFieldsToGenerateInsert(DatabaseTable table) {
+    public List<? extends DatabaseField> getFieldsToGenerateInsert(DatabaseTable table) {
         return getVectorOfFieldsToGenerate(INSERT, table);
     }
 
     /**
      * INTERNAL:
      */
-    public Vector getFieldsToGenerateUpdate(DatabaseTable table) {
+    public List<? extends DatabaseField> getFieldsToGenerateUpdate(DatabaseTable table) {
         return getVectorOfFieldsToGenerate(UPDATE, table);
     }
 
@@ -170,17 +170,17 @@
      * Note that the passed Collections are cloned.
      * Used for testing only.
      */
-    public static boolean areCollectionsEqualAsSets(Collection col1, Collection col2) {
+    public static boolean areCollectionsEqualAsSets(Collection<? extends Info> col1, Collection<? extends Info> col2) {
         if (col1 == col2) {
             return true;
         }
         if (col1.size() != col2.size()) {
             return false;
         }
-        Collection c1 = new ArrayList(col1);
-        Collection c2 = new ArrayList(col2);
-        for (Iterator i = c1.iterator(); i.hasNext();) {
-            Object o = i.next();
+        Collection<Info> c1 = new ArrayList<Info>(col1);
+        Collection<Info> c2 = new ArrayList<>(col2);
+        for (Iterator<Info> i = c1.iterator(); i.hasNext();) {
+            Info o = i.next();
             c2.remove(o);
         }
         return c2.isEmpty();
@@ -189,25 +189,26 @@
     /**
      * INTERNAL:
      */
-    protected Vector<DatabaseField> getVectorOfFieldsToGenerate(int operation, DatabaseTable table) {
+    @SuppressWarnings({"unchecked"})
+    protected List<DatabaseField> getVectorOfFieldsToGenerate(int operation, DatabaseTable table) {
         if (this.main[operation][ALL] == null) {
             return null;
         }
         if (this.tableToFieldsForGenerationMap == null) {
             // the method is called for the first time
-            tableToFieldsForGenerationMap = new HashMap[NUM_OPERATIONS];
+            tableToFieldsForGenerationMap = (Map<DatabaseTable, List<DatabaseField>>[]) new HashMap[NUM_OPERATIONS];
         }
         if (this.tableToFieldsForGenerationMap[operation] == null) {
             // the method is called for the first time for this operation
-            this.tableToFieldsForGenerationMap[operation] = new HashMap();
+            this.tableToFieldsForGenerationMap[operation] = new HashMap<>();
         }
-        Vector<DatabaseField> fieldsForGeneration = this.tableToFieldsForGenerationMap[operation].get(table);
+        List<DatabaseField> fieldsForGeneration = this.tableToFieldsForGenerationMap[operation].get(table);
         if (fieldsForGeneration == null) {
             // the method is called for the first time for this operation and this table
-            fieldsForGeneration = new NonSynchronizedVector();
-            Iterator it = this.main[operation][ALL].iterator();
+            fieldsForGeneration = new ArrayList<>();
+            Iterator<DatabaseField> it = this.main[operation][ALL].iterator();
             while (it.hasNext()) {
-                DatabaseField field = (DatabaseField)it.next();
+                DatabaseField field = it.next();
                 if (field.getTable().equals(table)) {
                     fieldsForGeneration.add(field);
                 }
@@ -265,7 +266,7 @@
      * Define that the field will be returned from an insert operation.
      * The type may be required to bind the output parameter if not known by the mapping.
      */
-    public void addFieldForInsert(String qualifiedName, Class type) {
+    public void addFieldForInsert(String qualifiedName, Class<?> type) {
         addFieldForInsert(createField(qualifiedName, type));
     }
 
@@ -321,7 +322,7 @@
      * Define that the field will be returned from an update operation.
      * The type may be required to bind the output parameter if not known by the mapping.
      */
-    public void addFieldForUpdate(String qualifiedName, Class type) {
+    public void addFieldForUpdate(String qualifiedName, Class<?> type) {
         addFieldForUpdate(createField(qualifiedName, type));
     }
 
@@ -348,7 +349,7 @@
         private boolean isInsert;
         private boolean isInsertModeReturnOnly;
         private boolean isUpdate;
-        private Class referenceClass;
+        private Class<? extends Object> referenceClass;
         private String referenceClassName;
 
         Info() {
@@ -402,11 +403,11 @@
             this.isUpdate = isUpdate;
         }
 
-        public Class getReferenceClass() {
+        public Class<? extends Object> getReferenceClass() {
             return referenceClass;
         }
 
-        public void setReferenceClass(Class referenceClass) {
+        public void setReferenceClass(Class<?> referenceClass) {
             this.referenceClass = referenceClass;
             if (referenceClass != null) {
                 this.referenceClassName = referenceClass.getName();
@@ -497,7 +498,7 @@
         @Override
         public int hashCode() {
             DatabaseField field = getField();
-            Class type = field != null ? field.getType() : null;
+            Class<? extends Object> type = field != null ? field.getType() : null;
             boolean isInsert = isInsert();
             boolean isInsertModeReturnOnly = isInsertModeReturnOnly();
             boolean isUpdate = isUpdate();
@@ -577,8 +578,8 @@
     /**
      * INTERNAL:
      */
-    protected Collection createCollection() {
-        return new HashSet();
+    protected Collection<DatabaseField> createCollection() {
+        return new HashSet<>();
     }
 
     // precondition field != null
@@ -589,7 +590,7 @@
         main[operation][state].add(field);
     }
 
-    protected void addCollectionToMain(int operation, int state, Collection collection) {
+    protected void addCollectionToMain(int operation, int state, Collection<? extends DatabaseField> collection) {
         if ((collection == null) || collection.isEmpty()) {
             return;
         }
@@ -620,8 +621,8 @@
         }
     }
 
-    protected Hashtable removeDuplicateAndValidateInfos(AbstractSession session) {
-        Hashtable infoHashtable = new Hashtable();
+    protected Hashtable<DatabaseField, Info> removeDuplicateAndValidateInfos(AbstractSession session) {
+        Hashtable<DatabaseField, Info> infoHashtable = new Hashtable<DatabaseField, Info>();
         for (int i = 0; i < infos.size(); i++) {
             Info info1 = infos.get(i);
             info1 = (Info)info1.clone();
@@ -633,7 +634,7 @@
                 info1.getField().setName(descField.getName());
                 info1.getField().setTableName(getDescriptor().getDefaultTable().getQualifiedNameDelimited(session.getPlatform()));
             }
-            Info info2 = (Info)infoHashtable.get(info1.getField());
+            Info info2 = infoHashtable.get(info1.getField());
             if (info2 == null) {
                 infoHashtable.put(info1.getField(), info1);
             } else {
@@ -654,9 +655,10 @@
     /**
      * INTERNAL:
      */
+    @SuppressWarnings({"unchecked"})
     public void initialize(AbstractSession session) {
         clearInitialization();
-        main = new Collection[NUM_OPERATIONS][MAIN_SIZE];
+        main = (Collection<DatabaseField>[][]) new Collection[NUM_OPERATIONS][MAIN_SIZE];
 
         // The order of descriptor initialization guarantees initialization of Parent before children.
         // main array is copied from Parent's ReturningPolicy
@@ -668,11 +670,11 @@
         }
 
         if (!infos.isEmpty()) {
-            Hashtable infoHashtable = removeDuplicateAndValidateInfos(session);
+            Hashtable<? extends DatabaseField, ? extends Info> infoHashtable = removeDuplicateAndValidateInfos(session);
             Hashtable infoHashtableUnmapped = (Hashtable)infoHashtable.clone();
-            for (Enumeration fields = getDescriptor().getFields().elements();
-                     fields.hasMoreElements();) {
-                DatabaseField field = (DatabaseField)fields.nextElement();
+            for (Enumeration<DatabaseField> fields = getDescriptor().getFields().elements();
+                 fields.hasMoreElements();) {
+                DatabaseField field = fields.nextElement();
                 Info info = (Info)infoHashtableUnmapped.get(field);
                 if (info != null) {
                     infoHashtableUnmapped.remove(field);
@@ -711,7 +713,7 @@
     }
 
     protected void copyMainFrom(ReturningPolicy policy) {
-        Collection[][] mainToCopy = policy.main;
+        Collection<? extends DatabaseField>[][] mainToCopy = policy.main;
         for (int operation = INSERT; operation <= UPDATE; operation++) {
             for (int state = RETURN_ONLY; state < MAIN_SIZE; state++) {
                 addCollectionToMain(operation, state, mainToCopy[operation][state]);
@@ -743,12 +745,12 @@
         }
 
         // now compare types
-        Hashtable allFields = new Hashtable();
+        Hashtable<DatabaseField, DatabaseField> allFields = new Hashtable<DatabaseField, DatabaseField>();
         for (int operation = INSERT; operation <= UPDATE; operation++) {
             if (main[operation][ALL] != null) {
-                Iterator it = main[operation][ALL].iterator();
+                Iterator<DatabaseField> it = main[operation][ALL].iterator();
                 while (it.hasNext()) {
-                    DatabaseField field = (DatabaseField)it.next();
+                    DatabaseField field = it.next();
                     allFields.put(field, field);
                 }
             }
@@ -758,7 +760,7 @@
                 Iterator it = mainToCompare[operation][ALL].iterator();
                 while (it.hasNext()) {
                     DatabaseField fieldToCompare = (DatabaseField)it.next();
-                    DatabaseField field = (DatabaseField)allFields.get(fieldToCompare);
+                    DatabaseField field = allFields.get(fieldToCompare);
                     if (!field.getType().equals(fieldToCompare.getType())) {
                         return false;
                     }
@@ -780,7 +782,7 @@
         if ((modifyRow == null) || modifyRow.isEmpty()) {
             return;
         }
-        Collection fields = main[operation][RETURN_ONLY];
+        Collection<? extends DatabaseField> fields = main[operation][RETURN_ONLY];
         if ((fields == null) || fields.isEmpty()) {
             return;
         }
@@ -812,7 +814,7 @@
         if ((main[INSERT][MAPPED] == null) || main[INSERT][MAPPED].isEmpty()) {
             return;
         }
-        List primaryKeys = getDescriptor().getPrimaryKeyFields();
+        List<DatabaseField> primaryKeys = getDescriptor().getPrimaryKeyFields();
         for (int index = 0; (index < primaryKeys.size()) && !isUsedToSetPrimaryKey; index++) {
             this.isUsedToSetPrimaryKey = main[INSERT][MAPPED].contains(primaryKeys.get(index));
         }
@@ -822,10 +824,10 @@
         boolean ok = true;
         verifyField(session, field, getDescriptor());
         DatabaseMapping mapping;
-        List readOnlyMappings = getDescriptor().getObjectBuilder().getReadOnlyMappingsForField(field);
+        List<DatabaseMapping> readOnlyMappings = getDescriptor().getObjectBuilder().getReadOnlyMappingsForField(field);
         if (readOnlyMappings != null) {
             for (int j = 0; j < readOnlyMappings.size(); j++) {
-                mapping = (DatabaseMapping)readOnlyMappings.get(j);
+                mapping = readOnlyMappings.get(j);
                 ok &= verifyFieldAndMapping(session, field, getDescriptor(), mapping);
             }
         }
@@ -877,21 +879,21 @@
      * INTERNAL:
      */
     public void validationAfterDescriptorInitialization(AbstractSession session) {
-        Hashtable mapped = new Hashtable();
+        Hashtable<DatabaseField, DatabaseField> mapped = new Hashtable<DatabaseField, DatabaseField>();
         for (int operation = INSERT; operation <= UPDATE; operation++) {
             if ((main[operation][MAPPED] != null) && !main[operation][MAPPED].isEmpty()) {
-                Iterator it = main[operation][MAPPED].iterator();
+                Iterator<DatabaseField> it = main[operation][MAPPED].iterator();
                 while (it.hasNext()) {
-                    DatabaseField field = (DatabaseField)it.next();
+                    DatabaseField field = it.next();
                     mapped.put(field, field);
                 }
             }
         }
         if (!mapped.isEmpty()) {
-            for (Enumeration fields = getDescriptor().getFields().elements();
-                     fields.hasMoreElements();) {
-                DatabaseField fieldInDescriptor = (DatabaseField)fields.nextElement();
-                DatabaseField fieldInMain = (DatabaseField)mapped.get(fieldInDescriptor);
+            for (Enumeration<DatabaseField> fields = getDescriptor().getFields().elements();
+                 fields.hasMoreElements();) {
+                DatabaseField fieldInDescriptor = fields.nextElement();
+                DatabaseField fieldInMain = mapped.get(fieldInDescriptor);
                 if (fieldInMain != null) {
                     if (fieldInMain.getType() == null) {
                         if (getDescriptor().isReturnTypeRequiredForReturningPolicy()) {
@@ -921,15 +923,15 @@
                     // that's why SQLCall can't be verified here.
                     DatabaseCall customCall = (DatabaseCall)query[operation].getDatasourceCall();
                     Enumeration outputRowFields = customCall.getOutputRowFields().elements();
-                    Collection notFoundInOutputRow = createCollection();
+                    Collection<DatabaseField> notFoundInOutputRow = createCollection();
                     notFoundInOutputRow.addAll(main[operation][ALL]);
                     while (outputRowFields.hasMoreElements()) {
                         notFoundInOutputRow.remove(outputRowFields.nextElement());
                     }
                     if (!notFoundInOutputRow.isEmpty()) {
-                        Iterator it = notFoundInOutputRow.iterator();
+                        Iterator<DatabaseField> it = notFoundInOutputRow.iterator();
                         while (it.hasNext()) {
-                            DatabaseField field = (DatabaseField)it.next();
+                            DatabaseField field = it.next();
                             session.getIntegrityChecker().handleError(DescriptorException.customQueryAndReturningPolicyFieldConflict(field.getName(), queryTypeName[operation], getDescriptor()));
                         }
                     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/SelectedFieldsLockingPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/SelectedFieldsLockingPolicy.java
index de9ddf3..8747ee3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/SelectedFieldsLockingPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/SelectedFieldsLockingPolicy.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
@@ -54,8 +54,8 @@
      */
     public SelectedFieldsLockingPolicy() {
         super();
-        this.lockFieldsByTable = new HashMap(4);
-        this.lockFields = new ArrayList();
+        this.lockFieldsByTable = new HashMap<>(4);
+        this.lockFields = new ArrayList<>();
     }
 
     /**
@@ -126,7 +126,7 @@
     protected List<DatabaseField> getLockFields(DatabaseTable table) {
         List<DatabaseField> temp = this.lockFieldsByTable.get(table);
         if (temp == null) {
-            return Collections.EMPTY_LIST;
+            return Collections.emptyList();
         }
         return temp;
     }
@@ -152,7 +152,7 @@
             lockFields.set(index, field);
             List<DatabaseField> fieldsForTable = getLockFieldsByTable().get(field.getTable());
             if (fieldsForTable == null) {
-                fieldsForTable = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
+                fieldsForTable = new ArrayList<>();
                 getLockFieldsByTable().put(field.getTable(), fieldsForTable);
             }
             fieldsForTable.add(field);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/TimestampLockingPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/TimestampLockingPolicy.java
index 00590b4..0328762 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/TimestampLockingPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/TimestampLockingPolicy.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
@@ -88,8 +88,9 @@
      * Return the default timestamp locking filed java type, default is Timestamp.
      */
     @Override
-    protected Class getDefaultLockingFieldType() {
-        return ClassConstants.TIMESTAMP;
+    @SuppressWarnings({"unchecked"})
+    protected <T> Class<T> getDefaultLockingFieldType() {
+        return (Class<T>) ClassConstants.TIMESTAMP;
     }
 
     /**
@@ -98,8 +99,9 @@
      * null in some situations.
      */
     @Override
-    public Object getBaseValue(){
-        return new Timestamp(0);
+    @SuppressWarnings({"unchecked"})
+    public <T> T getBaseValue(){
+        return (T) new Timestamp(0);
     }
 
     /**
@@ -107,9 +109,10 @@
      * returns the initial locking value
      */
     @Override
-    protected Object getInitialWriteValue(AbstractSession session) {
+    @SuppressWarnings({"unchecked"})
+    protected <T> T getInitialWriteValue(AbstractSession session) {
         if (usesLocalTime()) {
-            return new Timestamp(System.currentTimeMillis());
+            return (T) new Timestamp(System.currentTimeMillis());
         }
         if (usesServerTime()) {
             AbstractSession readSession = session.getSessionForClass(getDescriptor().getJavaClass());
@@ -117,7 +120,7 @@
                 readSession = readSession.getParent().getSessionForClass(getDescriptor().getJavaClass());
             }
 
-            return readSession.getDatasourceLogin().getDatasourcePlatform().getTimestampFromServer(session, readSession.getName());
+            return (T) readSession.getDatasourceLogin().getDatasourcePlatform().getTimestampFromServer(session, readSession.getName());
         }
         return null;
 
@@ -128,7 +131,7 @@
      * Returns the new Timestamp value.
      */
     @Override
-    public Object getNewLockValue(ModifyQuery query) {
+    public <T> T getNewLockValue(ModifyQuery query) {
         return getInitialWriteValue(query.getSession());
     }
 
@@ -138,9 +141,10 @@
      * is stored in the object, then return a null.
      */
     @Override
-    public Object getValueToPutInCache(AbstractRecord row, AbstractSession session) {
+    @SuppressWarnings({"unchecked"})
+    public <T> T getValueToPutInCache(AbstractRecord row, AbstractSession session) {
         if (isStoredInCache()) {
-            return session.getDatasourcePlatform().convertObject(row.get(getWriteLockField()), ClassConstants.TIMESTAMP);
+            return (T) session.getDatasourcePlatform().convertObject(row.get(getWriteLockField()), ClassConstants.TIMESTAMP);
         } else {
             return null;
         }
@@ -177,7 +181,8 @@
      * This method will return the optimistic lock value for the object.
      */
     @Override
-    public Object getWriteLockValue(Object domainObject, Object primaryKey, AbstractSession session) {
+    @SuppressWarnings({"unchecked"})
+    public <T> T getWriteLockValue(Object domainObject, Object primaryKey, AbstractSession session) {
         java.sql.Timestamp writeLockFieldValue = null;
         if (isStoredInCache()) {
             writeLockFieldValue = (java.sql.Timestamp)session.getIdentityMapAccessorInstance().getWriteLockValue(primaryKey, domainObject.getClass(), getDescriptor());
@@ -192,7 +197,7 @@
                 }
             }
         }
-        return writeLockFieldValue;
+        return (T) writeLockFieldValue;
     }
 
     /**
@@ -239,7 +244,7 @@
     @Override
     public boolean isNewerVersion(AbstractRecord databaseRow, Object domainObject, Object primaryKey, AbstractSession session) {
         java.sql.Timestamp writeLockFieldValue;
-        java.sql.Timestamp newWriteLockFieldValue = (java.sql.Timestamp)session.getDatasourcePlatform().convertObject(databaseRow.get(getWriteLockField()), ClassConstants.TIMESTAMP);
+        java.sql.Timestamp newWriteLockFieldValue = session.getDatasourcePlatform().convertObject(databaseRow.get(getWriteLockField()), ClassConstants.TIMESTAMP);
         if (isStoredInCache()) {
             writeLockFieldValue = (java.sql.Timestamp)session.getIdentityMapAccessorInstance().getWriteLockValue(primaryKey, domainObject.getClass(), getDescriptor());
         } else {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/VersionLockingPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/VersionLockingPolicy.java
index 7830450..cab5636 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/VersionLockingPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/VersionLockingPolicy.java
@@ -209,12 +209,11 @@
 
     /**
      * INTERNAL:
-
      * Return the default version locking filed java type, default is BigDecimal
-
      */
-    protected Class getDefaultLockingFieldType() {
-        return ClassConstants.LONG;
+    @SuppressWarnings({"unchecked"})
+    protected <T> Class<T> getDefaultLockingFieldType() {
+        return (Class<T>) ClassConstants.LONG;
 
     }
 
@@ -224,8 +223,9 @@
      * null in some situations.
      */
     @Override
-    public Object getBaseValue() {
-        return 0L;
+    @SuppressWarnings({"unchecked"})
+    public <T> T getBaseValue() {
+        return (T) Long.valueOf(0L);
     }
 
     /**
@@ -239,8 +239,9 @@
      * INTERNAL:
      * returns the initial locking value
      */
-    protected Object getInitialWriteValue(AbstractSession session) {
-        return 1L;
+    @SuppressWarnings({"unchecked"})
+    protected <T> T getInitialWriteValue(AbstractSession session) {
+        return (T) Long.valueOf(1L);
     }
 
     /**
@@ -260,8 +261,9 @@
      * This method gets the write lock value from either the cache or
      * the object stored in the query.  It then returns the new incremented value.
      */
-    public Object getNewLockValue(ModifyQuery query) {
-        Class objectClass = query.getDescriptor().getJavaClass();
+    @SuppressWarnings({"unchecked"})
+    public <T> T getNewLockValue(ModifyQuery query) {
+        Class<?> objectClass = query.getDescriptor().getJavaClass();
         Number value;
         Number newWriteLockValue = null;
         if (isStoredInCache()) {
@@ -275,7 +277,7 @@
 
         // Increment the value, this goes to the database
         newWriteLockValue = incrementWriteLockValue(value);
-        return newWriteLockValue;
+        return (T) newWriteLockValue;
     }
 
     /**
@@ -285,8 +287,8 @@
      * cache, a vector with one value is returned.  In the case
      * of being stored in the object, an empty vector is returned.
      */
-    protected Vector getUnmappedFields() {
-        Vector fields = new Vector(1);
+    protected Vector<DatabaseField> getUnmappedFields() {
+        Vector<DatabaseField> fields = new Vector<>(1);
         if (isStoredInCache()) {
             fields.addElement(getWriteLockField());
         }
@@ -299,9 +301,10 @@
      * If the value is stored in the object, then return a null.
      */
     @Override
-    public Object getValueToPutInCache(AbstractRecord row, AbstractSession session) {
+    @SuppressWarnings({"unchecked"})
+    public <T> T getValueToPutInCache(AbstractRecord row, AbstractSession session) {
         if (isStoredInCache()) {
-            return row.get(getWriteLockField());
+            return (T) row.get(getWriteLockField());
         } else {
             return null;
         }
@@ -367,7 +370,8 @@
      * This method will return the optimistic lock value for the object
      */
     @Override
-    public Object getWriteLockValue(Object domainObject, Object primaryKey, AbstractSession session) {
+    @SuppressWarnings({"unchecked"})
+    public <T> T getWriteLockValue(Object domainObject, Object primaryKey, AbstractSession session) {
         Number writeLockFieldValue;
         if (isStoredInCache()) {
             if (primaryKey == null) {
@@ -377,7 +381,7 @@
         } else {
             writeLockFieldValue = (Number)lockValueFromObject(domainObject);
         }
-        return writeLockFieldValue;
+        return (T) writeLockFieldValue;
     }
 
     /**
@@ -433,10 +437,10 @@
             // Set the default type, only if un-mapped.
             dbField.setType(getDefaultLockingFieldType());
         }
-        Enumeration enumtr = this.getUnmappedFields().elements();
+        Enumeration<DatabaseField> enumtr = this.getUnmappedFields().elements();
         while (enumtr.hasMoreElements()) {
             DatabaseField lockField;
-            lockField = (DatabaseField)enumtr.nextElement();
+            lockField = enumtr.nextElement();
             descriptor.getFields().addElement(lockField);
         }
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/AttributeChangeTrackingPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/AttributeChangeTrackingPolicy.java
index 3f9ad93..9c6de47 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/AttributeChangeTrackingPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/AttributeChangeTrackingPolicy.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
@@ -74,7 +74,7 @@
                 // check for deferred changes
                 if (changes.hasDeferredAttributes()){
                     //need to calculate the changes for these attributes.
-                    for (Iterator iterator = changes.getDeferredSet().iterator(); iterator.hasNext();){
+                    for (Iterator<String> iterator = changes.getDeferredSet().iterator(); iterator.hasNext();){
                         DatabaseMapping mapping = descriptor.getObjectBuilder().getMappingForAttributeName((String)iterator.next());
                         mapping.calculateDeferredChanges((ChangeRecord)changes.getChangesForAttributeNamed(mapping.getAttributeName()), session);
                     }
@@ -91,7 +91,7 @@
                 if(descriptor.hasFetchGroupManager()) {
                     fetchGroup = descriptor.getFetchGroupManager().getObjectFetchGroup(clone);
                 }
-                List mappings = descriptor.getMappings();
+                List<DatabaseMapping> mappings = descriptor.getMappings();
                 int size = mappings.size();
                 for (int index = 0; index < size; index++) {
                     DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/DeferredChangeDetectionPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/DeferredChangeDetectionPolicy.java
index fcba3e7..2151ee6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/DeferredChangeDetectionPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/DeferredChangeDetectionPolicy.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
@@ -186,7 +186,7 @@
         // PERF: Do not create change records for new objects.
         if (!isNew || descriptor.shouldUseFullChangeSetsForNewObjects() || descriptor.isDescriptorTypeAggregate()) {
             // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-            List mappings = descriptor.getMappings();
+            List<DatabaseMapping> mappings = descriptor.getMappings();
             int mappingsSize = mappings.size();
             if(shouldGetFetchGroup && descriptor.hasFetchGroupManager()) {
                 fetchGroup = descriptor.getFetchGroupManager().getObjectFetchGroup(clone);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/ObjectChangeTrackingPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/ObjectChangeTrackingPolicy.java
index 42da641..1eb7b83 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/ObjectChangeTrackingPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/changetracking/ObjectChangeTrackingPolicy.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
@@ -147,7 +147,7 @@
             // Must also ensure the listener has been set on collections and aggregates.
             FetchGroupManager fetchGroupManager = descriptor.getFetchGroupManager();
             boolean isPartialObject = (fetchGroupManager != null) && fetchGroupManager.isPartialObject(clone);
-            List mappings = builder.getRelationshipMappings();
+            List<DatabaseMapping> mappings = builder.getRelationshipMappings();
             int size = mappings.size();
             // Only cascade fetched mappings.
             for (int index = 0; index < size; index++) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/CustomPartitioningPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/CustomPartitioningPolicy.java
index 4afb55c..d89d351 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/CustomPartitioningPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/CustomPartitioningPolicy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -65,11 +65,11 @@
         }
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                Class partitioningClass = AccessController.doPrivileged(new PrivilegedClassForName(getPartitioningClasName(), true, classLoader));
-                this.policy = (PartitioningPolicy)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(partitioningClass));
+                Class<? extends PartitioningPolicy> partitioningClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getPartitioningClasName(), true, classLoader));
+                this.policy = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(partitioningClass));
             } else {
-                Class partitioningClass = PrivilegedAccessHelper.getClassForName(getPartitioningClasName(), true, classLoader);
-                this.policy = (PartitioningPolicy)PrivilegedAccessHelper.newInstanceFromClass(partitioningClass);
+                Class<? extends PartitioningPolicy> partitioningClass = PrivilegedAccessHelper.getClassForName(getPartitioningClasName(), true, classLoader);
+                this.policy = PrivilegedAccessHelper.newInstanceFromClass(partitioningClass);
             }
         } catch (PrivilegedActionException exception) {
             throw ValidationException.classNotFoundWhileConvertingClassNames(getPartitioningClasName(), exception.getException());
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/RangePartition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/RangePartition.java
index fcabeff..b5ded37 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/RangePartition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/RangePartition.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -81,7 +81,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        partitionValueType = AccessController.doPrivileged(new PrivilegedClassForName(partitionValueTypeName, true, classLoader));
+                        partitionValueType = AccessController.doPrivileged(new PrivilegedClassForName<>(partitionValueTypeName, true, classLoader));
                     } catch (PrivilegedActionException e) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(partitionValueTypeName, e.getException());
                     }
@@ -117,24 +117,25 @@
      * INTERNAL:
      * TODO: clean up the exception handling.
      */
-    protected Object initObject(Class type, String value) {
+    @SuppressWarnings({"unchecked"})
+    protected <T> T initObject(Class<T> type, String value) {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
             try {
-                Constructor constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(type, new Class[] {String.class}, false));
-                return AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, new Object[] {value}));
+                Constructor<T> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(type, new Class[] {String.class}, false));
+                return AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(constructor, new Object[] {value}));
             } catch (PrivilegedActionException exception) {
                 //throwInitObjectException(exception, type, value, isData);
             }
         } else {
             try {
-                Constructor constructor = PrivilegedAccessHelper.getConstructorFor(type, new Class[] {String.class}, false);
+                Constructor<T> constructor = PrivilegedAccessHelper.getConstructorFor(type, new Class[] {String.class}, false);
                 return PrivilegedAccessHelper.invokeConstructor(constructor, new Object[] {value});
             } catch (Exception exception) {
                 //throwInitObjectException(exception, type, value, isData);
             }
         }
 
-        return value;
+        return (T) value;
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/ValuePartitioningPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/ValuePartitioningPolicy.java
index edb056c..7919d3e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/ValuePartitioningPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/partitioning/ValuePartitioningPolicy.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
@@ -55,7 +55,7 @@
     protected String partitionValueTypeName;
 
     /** The type of the partition values. Initialized from the type name at runtime. */
-    protected Class partitionValueType;
+    protected Class<?> partitionValueType;
 
     /** Use to track order for compute UCP index. */
     protected List<String> orderedPartitions = new ArrayList<>();
@@ -87,7 +87,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        partitionValueType = AccessController.doPrivileged(new PrivilegedClassForName(partitionValueTypeName, true, classLoader));
+                        partitionValueType = AccessController.doPrivileged(new PrivilegedClassForName<>(partitionValueTypeName, true, classLoader));
                     } catch (PrivilegedActionException e) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(partitionValueTypeName, e.getException());
                     }
@@ -115,7 +115,7 @@
      * Convert the string value to the class type.
      * This will handle numbers, string, dates, and most other classes.
      */
-    private Object initObject(Class type, String value) {
+    private <T> T initObject(Class<T> type, String value) {
         return ConversionManager.getDefaultManager().convertObject(value, type);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISDOMRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISDOMRecord.java
index 8c170f7..293dcbd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISDOMRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISDOMRecord.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
@@ -125,7 +125,7 @@
                     throw (Exception)ex.getCause();
                 }
             }else{
-                setDOM((Element)PrivilegedAccessHelper.invokeMethod(domMethod, record, null));
+                setDOM(PrivilegedAccessHelper.invokeMethod(domMethod, record, null));
             }
         } catch (Exception error) {
             throw new EISException(error);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISObjectPersistenceXMLProject.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISObjectPersistenceXMLProject.java
index 6ceabf9..5565c7e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISObjectPersistenceXMLProject.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISObjectPersistenceXMLProject.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
@@ -376,9 +376,9 @@
         sourceToTargetKeyFieldAssociationsMapping.setAttributeAccessor(new AttributeAccessor() {
                 @Override
                 public Object getAttributeValueFromObject(Object object) {
-                    Map sourceToTargetKeyFields = ((EISOneToOneMapping)object).getSourceToTargetKeyFields();
+                    Map<DatabaseField, DatabaseField> sourceToTargetKeyFields = ((EISOneToOneMapping)object).getSourceToTargetKeyFields();
                     List associations = new ArrayList(sourceToTargetKeyFields.size());
-                    Iterator iterator = sourceToTargetKeyFields.entrySet().iterator();
+                    Iterator<Map.Entry<DatabaseField, DatabaseField>> iterator = sourceToTargetKeyFields.entrySet().iterator();
                     while (iterator.hasNext()) {
                         Map.Entry entry = (Map.Entry)iterator.next();
                         associations.add(new Association(entry.getKey(), entry.getValue()));
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/interactions/EISInteraction.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/interactions/EISInteraction.java
index 131bb6b..2ef92b4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/interactions/EISInteraction.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/interactions/EISInteraction.java
@@ -241,8 +241,8 @@
                     recordName = valuesRow.getFields().get(0).getTableName();
                 }
                 MappedRecord record = accessor.getRecordFactory().createMappedRecord(recordName);
-                for (Iterator keysIterator = valuesRow.getFields().iterator();
-                         keysIterator.hasNext();) {
+                for (Iterator<DatabaseField> keysIterator = valuesRow.getFields().iterator();
+                     keysIterator.hasNext();) {
                     DatabaseField field = (DatabaseField)keysIterator.next();
                     Object elementValue = createRecordElement(field.getName(), valuesRow.get(field), accessor);
                     accessor.getEISPlatform().setValueInRecord(field.getName(), elementValue, record, accessor);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/mappings/EISOneToManyMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/mappings/EISOneToManyMapping.java
index 958be9b..5ae81b8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/mappings/EISOneToManyMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/mappings/EISOneToManyMapping.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
@@ -342,7 +342,7 @@
 
         Expression criteria;
         Expression builder = new ExpressionBuilder();
-        Iterator keyIterator = getSourceForeignKeysToTargetKeys().keySet().iterator();
+        Iterator<DatabaseField> keyIterator = getSourceForeignKeysToTargetKeys().keySet().iterator();
         while (keyIterator.hasNext()) {
             DatabaseField foreignKey = (DatabaseField)keyIterator.next();
             DatabaseField targetKey = getSourceForeignKeysToTargetKeys().get(foreignKey);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/mappings/EISOneToOneMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/mappings/EISOneToOneMapping.java
index 15eba4a..76e7c14 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/mappings/EISOneToOneMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/mappings/EISOneToOneMapping.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
@@ -153,7 +153,7 @@
         clone.setTargetToSourceKeyFields(new HashMap(getTargetToSourceKeyFields().size()));
         Map setOfFields = new HashMap(getTargetToSourceKeyFields().size());
 
-        for (Enumeration enumtr = getForeignKeyFields().elements(); enumtr.hasMoreElements();) {
+        for (Enumeration<DatabaseField> enumtr = getForeignKeyFields().elements(); enumtr.hasMoreElements();) {
             DatabaseField field = (DatabaseField)enumtr.nextElement();
 
             DatabaseField fieldClone = field.clone();
@@ -162,7 +162,7 @@
         }
 
         //get clones from set for source hashtable.  If they do not exist, create a new one.
-        Iterator sourceKeyIterator = getSourceToTargetKeyFields().keySet().iterator();
+        Iterator<DatabaseField> sourceKeyIterator = getSourceToTargetKeyFields().keySet().iterator();
         while (sourceKeyIterator.hasNext()) {
             DatabaseField sourceField = (DatabaseField)sourceKeyIterator.next();
             DatabaseField targetField = getSourceToTargetKeyFields().get(sourceField);
@@ -182,7 +182,7 @@
         }
 
         //get clones from set for target hashtable.  If they do not exist, create a new one.
-        Iterator targetKeyIterator = getTargetToSourceKeyFields().keySet().iterator();
+        Iterator<DatabaseField> targetKeyIterator = getTargetToSourceKeyFields().keySet().iterator();
         while (targetKeyIterator.hasNext()) {
             DatabaseField targetField = (DatabaseField)targetKeyIterator.next();
             DatabaseField sourceField = getTargetToSourceKeyFields().get(targetField);
@@ -212,7 +212,7 @@
      */
     @Override
     public Object extractPrimaryKeysForReferenceObjectFromRow(AbstractRecord row) {
-        List primaryKeyFields = getReferenceDescriptor().getPrimaryKeyFields();
+        List<DatabaseField> primaryKeyFields = getReferenceDescriptor().getPrimaryKeyFields();
         Object[] result = new  Object[primaryKeyFields.size()];
         for (int index = 0; index < primaryKeyFields.size(); index++) {
             DatabaseField targetKeyField = (DatabaseField)primaryKeyFields.get(index);
@@ -237,7 +237,7 @@
         super.initialize(session);
 
         // Must build foreign keys fields.
-        List foreignKeyFields = getForeignKeyFields();
+        List<DatabaseField> foreignKeyFields = getForeignKeyFields();
         int size = foreignKeyFields.size();
         for (int index = 0; index < size; index++) {
             DatabaseField foreignKeyField = (DatabaseField)foreignKeyFields.get(index);
@@ -262,7 +262,7 @@
     protected void initializeForeignKeys(AbstractSession session) {
         HashMap newSourceToTargetKeyFields = new HashMap(getSourceToTargetKeyFields().size());
         HashMap newTargetToSourceKeyFields = new HashMap(getTargetToSourceKeyFields().size());
-        Iterator iterator = getSourceToTargetKeyFields().entrySet().iterator();
+        Iterator<Map.Entry<DatabaseField, DatabaseField>> iterator = getSourceToTargetKeyFields().entrySet().iterator();
         while (iterator.hasNext()) {
             Map.Entry entry = (Map.Entry)iterator.next();
             DatabaseField sourceField = (DatabaseField)entry.getKey();
@@ -292,7 +292,7 @@
 
         Expression criteria;
         Expression builder = new ExpressionBuilder();
-        Iterator keyIterator = getSourceToTargetKeyFields().keySet().iterator();
+        Iterator<DatabaseField> keyIterator = getSourceToTargetKeyFields().keySet().iterator();
         while (keyIterator.hasNext()) {
             DatabaseField foreignKey = (DatabaseField)keyIterator.next();
             DatabaseField targetKey = getSourceToTargetKeyFields().get(foreignKey);
@@ -376,7 +376,7 @@
         // If any field in the foreign key is null then it means there are no referenced objects
         // Skip for partial objects as fk may not be present.
         if (!query.hasPartialAttributeExpressions()) {
-            for (Enumeration enumeration = getFields().elements(); enumeration.hasMoreElements();) {
+            for (Enumeration<DatabaseField> enumeration = getFields().elements(); enumeration.hasMoreElements();) {
                 DatabaseField field = (DatabaseField)enumeration.nextElement();
                 if (row.get(field) == null) {
                     return getIndirectionPolicy().nullValueFromRow();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/indirection/IndirectMap.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/indirection/IndirectMap.java
index 13088cb..f44bbf8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/indirection/IndirectMap.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/indirection/IndirectMap.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
@@ -310,7 +310,7 @@
                 boolean result = false;
                 Iterator<Map.Entry<K, V>> objects = delegateSet.iterator();
                 while (objects.hasNext()) {
-                    Map.Entry object = objects.next();
+                    Map.Entry<K, V> object = objects.next();
                     if (!c.contains(object)) {
                         objects.remove();
                         raiseRemoveChangeEvent(object.getKey(), object.getValue());
@@ -615,7 +615,7 @@
             @Override
             public boolean retainAll(Collection<?> c){
                 boolean result = false;
-                Iterator objects = delegateSet.iterator();
+                Iterator<K> objects = delegateSet.iterator();
                 while (objects.hasNext()) {
                     Object object = objects.next();
                     if (!c.contains(object)) {
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 e8f5077..ef966c7 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
@@ -343,7 +343,7 @@
                     }
                 }
             } else {
-                return (Set<E>)PrivilegedAccessHelper.invokeMethod(cloneMethod, this.getDelegate(), null);
+                return PrivilegedAccessHelper.invokeMethod(cloneMethod, this.getDelegate(), null);
             }
         } catch (IllegalAccessException ex1) {
             throw QueryException.cloneMethodInaccessible();
@@ -569,7 +569,7 @@
     public boolean removeAll(Collection<?> c) {
         // Must trigger remove events if tracked or uow.
         if (hasBeenRegistered() || hasTrackedPropertyChangeListener()) {
-            Iterator objects = c.iterator();
+            Iterator<?> objects = c.iterator();
             while (objects.hasNext()) {
                 this.remove(objects.next());
             }
@@ -585,7 +585,7 @@
     public boolean retainAll(Collection<?> c) {
         // Must trigger remove events if tracked or uow.
         if (hasBeenRegistered() || hasTrackedPropertyChangeListener()) {
-            Iterator objects = getDelegate().iterator();
+            Iterator<E> objects = getDelegate().iterator();
             while (objects.hasNext()) {
                 Object object = objects.next();
                 if (!c.contains(object)) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/InheritanceHierarchyBuilder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/InheritanceHierarchyBuilder.java
index 3dbb3c6..a99a20d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/InheritanceHierarchyBuilder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/InheritanceHierarchyBuilder.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 @@
      * Based on a class name either return a pre-existing node from the hierarchyTree or build one and
      * add it to the tree.
      */
-    public static HierarchyNode getNodeForClass(String className, Hashtable hierarchyTree) {
+    public static HierarchyNode getNodeForClass(String className, Hashtable<String, HierarchyNode> hierarchyTree) {
         HierarchyNode node = (HierarchyNode)hierarchyTree.get(className);
         if (node == null) {
             node = new HierarchyNode(className);
@@ -39,9 +39,9 @@
     }
 
     public static Hashtable buildInheritanceHierarchyTree(Project project) {
-        Map descriptors = project.getDescriptors();
-        Hashtable hierarchyTree = new Hashtable(descriptors.size());
-        for (Iterator descriptorIterator = descriptors.values().iterator();
+        Map<Class<?>, ClassDescriptor> descriptors = project.getDescriptors();
+        Hashtable<String, HierarchyNode> hierarchyTree = new Hashtable<>(descriptors.size());
+        for (Iterator<ClassDescriptor> descriptorIterator = descriptors.values().iterator();
                  descriptorIterator.hasNext();) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptorIterator.next();
             String className = descriptor.getJavaClassName();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/databaseaccess/CorePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/databaseaccess/CorePlatform.java
index feec21b..b8c0782 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/databaseaccess/CorePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/databaseaccess/CorePlatform.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -27,7 +27,7 @@
      * @exception ConversionException all exceptions will be thrown as this type.
      * @return the newly converted object
      */
-    Object convertObject(Object sourceObject, Class javaClass);
+    <T> T convertObject(Object sourceObject, Class<T> javaClass);
 
     /**
      * The platform hold its own instance of conversion manager to allow customization.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreClassConstants.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreClassConstants.java
index 46d491b..8fdecc0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreClassConstants.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreClassConstants.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -18,6 +18,7 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.net.URL;
+import java.sql.Date;
 import java.sql.Time;
 import java.sql.Timestamp;
 import java.util.ArrayList;
@@ -34,6 +35,7 @@
 
 import org.w3c.dom.Node;
 
+@SuppressWarnings({"rawtypes"})
 public class CoreClassConstants {
 
     public static final Class ABYTE = Byte[].class;
@@ -41,44 +43,48 @@
     public static final Class APCHAR = char[].class;
     public static final Class ASTRING = String[].class;
     public static final Class ArrayList_class = ArrayList.class;
-    public static final Class BIGDECIMAL = BigDecimal.class;
-    public static final Class BIGINTEGER = BigInteger.class;
-    public static final Class BOOLEAN = Boolean.class;
-    public static final Class BYTE = Byte.class;
-    public static final Class CALENDAR = Calendar.class;
-    public static final Class CHAR = Character.class;
-    public static final Class CLASS = Class.class;
-    public static final Class Collection_Class = Collection.class;
-    public static final Class DOUBLE = Double.class;
-    public static final Class DURATION = Duration.class;
-    public static final Class FLOAT = Float.class;
-    public static final Class GREGORIAN_CALENDAR = GregorianCalendar.class;
-    public static final Class INTEGER = Integer.class;
-    public static final Class List_Class = List.class;
-    public static final Class LONG = Long.class;
-    public static final Class Map_Class = Map.class;
-    public static final Class NODE = Node.class;
-    public static final Class NUMBER = Number.class;
-    public static final Class OBJECT = Object.class;
-    public static final Class PBOOLEAN = boolean.class;
-    public static final Class PBYTE = byte.class;
-    public static final Class PCHAR = char.class;
-    public static final Class PDOUBLE = double.class;
-    public static final Class PFLOAT = float.class;
-    public static final Class PINT = int.class;
-    public static final Class PLONG = long.class;
-    public static final Class PSHORT = short.class;
-    public static final Class QNAME = QName.class;
-    public static final Class Set_Class = Set.class;
-    public static final Class SHORT = Short.class;
-    public static final Class SQLDATE = java.sql.Date.class;
-    public static final Class STRING = String.class;
-    public static final Class TIME = Time.class;
-    public static final Class TIMESTAMP = Timestamp.class;
-    public static final Class URL_Class = URL.class;
-    public static final Class UTILDATE = java.util.Date.class;
-    public static final Class XML_GREGORIAN_CALENDAR = XMLGregorianCalendar.class;
-    public static final Class FILE = File.class;
+    public static final Class<BigDecimal> BIGDECIMAL = BigDecimal.class;
+    public static final Class<BigInteger> BIGINTEGER = BigInteger.class;
+    public static final Class<Boolean> BOOLEAN = Boolean.class;
+    public static final Class<Byte> BYTE = Byte.class;
+    public static final Class<Calendar> CALENDAR = Calendar.class;
+    public static final Class<Character> CHAR = Character.class;
+    public static final Class<Class> CLASS = Class.class;
+    public static final Class<Collection> Collection_Class = Collection.class;
+    public static final Class<Double> DOUBLE = Double.class;
+    public static final Class<Duration> DURATION = Duration.class;
+    public static final Class<Float> FLOAT = Float.class;
+    public static final Class<GregorianCalendar> GREGORIAN_CALENDAR = GregorianCalendar.class;
+    public static final Class<Integer> INTEGER = Integer.class;
+    public static final Class<List> List_Class = List.class;
+    public static final Class<Long> LONG = Long.class;
+    public static final Class<Map> Map_Class = Map.class;
+    public static final Class<Node> NODE = Node.class;
+    public static final Class<Number> NUMBER = Number.class;
+    public static final Class<Object> OBJECT = Object.class;
+    public static final Class<Boolean> PBOOLEAN = boolean.class;
+    public static final Class<Byte> PBYTE = byte.class;
+    public static final Class<Character> PCHAR = char.class;
+    public static final Class<Double> PDOUBLE = double.class;
+    public static final Class<Float> PFLOAT = float.class;
+    public static final Class<Integer> PINT = int.class;
+    public static final Class<Long> PLONG = long.class;
+    public static final Class<Short> PSHORT = short.class;
+    public static final Class<QName> QNAME = QName.class;
+    public static final Class<Set> Set_Class = Set.class;
+    public static final Class<Short> SHORT = Short.class;
+    public static final Class<Date> SQLDATE = Date.class;
+    public static final Class<String> STRING = String.class;
+    public static final Class<Time> TIME = Time.class;
+    public static final Class<Timestamp> TIMESTAMP = Timestamp.class;
+    public static final Class<URL> URL_Class = URL.class;
+    public static final Class<java.util.Date> UTILDATE = java.util.Date.class;
+    public static final Class<XMLGregorianCalendar> XML_GREGORIAN_CALENDAR = XMLGregorianCalendar.class;
+    public static final Class<File> FILE = File.class;
 
 
+    protected CoreClassConstants() {
+        //no instance please
+        //for ClassConstants
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreConversionManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreConversionManager.java
index 27f8f08..1075b23 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreConversionManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/helper/CoreConversionManager.java
@@ -32,7 +32,7 @@
      * @exception ConversionException all exceptions will be thrown as this type.
      * @return the newly converted object
      */
-    public abstract Object convertObject(Object sourceObject, Class javaClass);
+    public abstract <T> T convertObject(Object sourceObject, Class<T> javaClass);
 
     /**
      * INTERNAL
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 88a215c..9c757d1 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -21,7 +21,7 @@
      */
     String getName();
 
-    Class getType();
+    <T> Class<T> getType();
 
     /**
      * Set the unqualified name of the field.
@@ -33,6 +33,6 @@
      * The JDBC type is determined from the class type,
      * this is used to optimize performance, and for binding.
      */
-    void setType(Class type);
+    void setType(Class<?> type);
 
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/sessions/CoreAbstractSession.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/sessions/CoreAbstractSession.java
index c22d616..1413fbc 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/sessions/CoreAbstractSession.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/core/sessions/CoreAbstractSession.java
@@ -49,7 +49,7 @@
      * Return all registered descriptors.
      */
     @Override
-    public abstract Map<Class, DESCRIPTOR> getDescriptors();
+    public abstract Map<Class<?>, DESCRIPTOR> getDescriptors();
 
     /**
      * INTERNAL:
@@ -57,6 +57,6 @@
      * for specified class.
      * The platform is used for database specific behavior.
      */
-    public abstract PLATFORM getPlatform(Class domainClass);
+    public abstract PLATFORM getPlatform(Class<?> domainClass);
 
 }
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 6e02a26..07e2487 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
@@ -1557,7 +1557,7 @@
         Statement statement = null;
         if (call.usesBinding(session) && call.shouldCacheStatement(session)) {
             // Check the cache by sql string, must synchronize check and removal.
-            Map statementCache = getStatementCache();
+            Map<String, Statement> statementCache = getStatementCache();
             synchronized (statementCache) {
                 statement = (PreparedStatement)statementCache.get(call.getSQLString());
                 if (statement != null) {
@@ -1610,7 +1610,7 @@
         PreparedStatement statement = null;
         // Check the cache by sql string, must synchronize check and removal.
         if (getPlatform().shouldCacheAllStatements()) {
-            Map statementCache = getStatementCache();
+            Map<String, Statement> statementCache = getStatementCache();
             synchronized (statementCache) {
                 statement = (PreparedStatement)statementCache.get(sql);
                 if (statement != 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 8f11c43..05d6edb 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
@@ -2601,7 +2601,7 @@
         } else if (parameter instanceof char[]) {
             statement.setString(index, new String((char[])parameter));
         } else if (parameter instanceof Character[]) {
-            statement.setString(index, (String)convertObject(parameter, ClassConstants.STRING));
+            statement.setString(index, convertObject(parameter, ClassConstants.STRING));
         } else if (parameter instanceof Byte[]) {
             statement.setBytes(index, (byte[])convertObject(parameter, ClassConstants.APBYTE));
         } else if (parameter instanceof SQLXML) {
@@ -2706,7 +2706,7 @@
         } else if (parameter instanceof char[]) {
             statement.setString(name, new String((char[])parameter));
         } else if (parameter instanceof Character[]) {
-            statement.setString(name, (String)convertObject(parameter, ClassConstants.STRING));
+            statement.setString(name, convertObject(parameter, ClassConstants.STRING));
         } else if (parameter instanceof Byte[]) {
             statement.setBytes(name, (byte[])convertObject(parameter, ClassConstants.APBYTE));
         } else if (parameter instanceof SQLXML) {
@@ -2989,10 +2989,10 @@
                 FieldDefinition fieldDef;
                 //gfbug3307, should use columnDefinition if it was defined.
                 if ((field.getColumnDefinition()!= null) && (field.getColumnDefinition().length() == 0)) {
-                    Class type = ConversionManager.getObjectClass(field.getType());
+                    Class<? extends Class> type = ConversionManager.getObjectClass(field.getType());
                     // Default type to VARCHAR, if unknown.
                     if (type == null) {
-                        type = ClassConstants.STRING;
+                        type = ConversionManager.getObjectClass(ClassConstants.STRING);
                     }
                    fieldDef = new FieldDefinition(field.getNameDelimited(this), type);
                 } else {
@@ -3307,7 +3307,7 @@
 
         boolean shouldAcquireSequenceValueAfterInsert = false;
         DatabaseField field = new DatabaseField(qualifiedFieldName, getStartDelimiter(), getEndDelimiter());
-        Iterator descriptors = session.getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = session.getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             if (!descriptor.usesSequenceNumbers()) {
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 ab4163f..6e40c5e 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
@@ -26,6 +26,7 @@
 import java.util.HashMap;
 import java.util.Hashtable;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.Vector;
@@ -142,7 +143,7 @@
      */
     @Override
     public void appendParameter(Call call, Writer writer, Object parameter) {
-        String parameterValue = (String)getConversionManager().convertObject(parameter, ClassConstants.STRING);
+        String parameterValue = getConversionManager().convertObject(parameter, ClassConstants.STRING);
         if (parameterValue == null) {
             parameterValue = "";
         }
@@ -224,7 +225,7 @@
      * @return the newly converted object
      */
     @Override
-    public Object convertObject(Object sourceObject, Class javaClass) throws ConversionException {
+    public <T> T convertObject(Object sourceObject, Class<T> javaClass) throws ConversionException {
         return getConversionManager().convertObject(sourceObject, javaClass);
     }
 
@@ -370,7 +371,7 @@
         } else {
             getTimestampQuery().setSessionName(sessionName);
             Object result = session.executeQuery(getTimestampQuery());
-            return (java.sql.Timestamp) session.getDatasourcePlatform().convertObject(result, ClassConstants.TIMESTAMP);
+            return session.getDatasourcePlatform().convertObject(result, ClassConstants.TIMESTAMP);
         }
     }
 
@@ -716,7 +717,7 @@
      * @param javaClass - the class that is converted from
      * @return - a vector of classes
      */
-    public Vector getDataTypesConvertedFrom(Class javaClass) {
+    public List getDataTypesConvertedFrom(Class javaClass) {
         return getConversionManager().getDataTypesConvertedFrom(javaClass);
     }
 
@@ -726,7 +727,7 @@
      * @param javaClass - the class that is converted to
      * @return - a vector of classes
      */
-    public Vector getDataTypesConvertedTo(Class javaClass) {
+    public List getDataTypesConvertedTo(Class javaClass) {
         return getConversionManager().getDataTypesConvertedTo(javaClass);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Platform.java
index edbc1b2..08c7f70 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Platform.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
@@ -51,7 +51,7 @@
      * @exception ConversionException all exceptions will be thrown as this type.
      * @return the newly converted object
      */
-    @Override Object convertObject(Object sourceObject, Class javaClass) throws ConversionException;
+    @Override <T> T convertObject(Object sourceObject, Class<T> javaClass) throws ConversionException;
 
     /**
      * Copy the state into the new platform.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/CascadeLockingPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/CascadeLockingPolicy.java
index 05bc945..c604ac3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/CascadeLockingPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/CascadeLockingPolicy.java
@@ -68,7 +68,7 @@
             m_query = new ReadObjectQuery(m_parentClass);
 
             Expression selectionCriteria = null;
-            Iterator keys = m_queryKeyFields.keySet().iterator();
+            Iterator<DatabaseField> keys = m_queryKeyFields.keySet().iterator();
             ExpressionBuilder builder = new ExpressionBuilder();
 
             while (keys.hasNext()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/InstantiationPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/InstantiationPolicy.java
index 188cccc..ea8ee55 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/InstantiationPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/InstantiationPolicy.java
@@ -468,7 +468,7 @@
         try{
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    factoryClass = AccessController.doPrivileged(new PrivilegedClassForName(factoryClassName, true, classLoader));
+                    factoryClass = AccessController.doPrivileged(new PrivilegedClassForName<>(factoryClassName, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(factoryClassName, exception.getException());
                 }
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 66cf0e4..c6784b7 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
@@ -257,13 +257,13 @@
         // Skip first table.
         for (int index = 1; index < size; index++) {
             DatabaseTable table = tables.get(index);
-            Map keyMapping = this.descriptor.getAdditionalTablePrimaryKeyFields().get(table);
+            Map<DatabaseField, DatabaseField> keyMapping = this.descriptor.getAdditionalTablePrimaryKeyFields().get(table);
 
             // Loop over the additionalTablePK fields and add the PK info for the table. The join might
             // be between a fk in the source table and pk in secondary table.
             if (keyMapping != null) {
-                Iterator primaryKeyFieldEnum = keyMapping.keySet().iterator();
-                Iterator secondaryKeyFieldEnum = keyMapping.values().iterator();
+                Iterator<DatabaseField> primaryKeyFieldEnum = keyMapping.keySet().iterator();
+                Iterator<DatabaseField> secondaryKeyFieldEnum = keyMapping.values().iterator();
                 while (primaryKeyFieldEnum.hasNext()) {
                     DatabaseField primaryKeyField = (DatabaseField)primaryKeyFieldEnum.next();
                     DatabaseField secondaryKeyField = (DatabaseField)secondaryKeyFieldEnum.next();
@@ -317,7 +317,7 @@
         if (size > 1) {
             handledMappings = new HashSet(size);
         }
-        List fields = row.getFields();
+        List<DatabaseField> fields = row.getFields();
         for (int index = 0; index < size; index++) {
             DatabaseField field = (DatabaseField)fields.get(index);
             assignReturnValueForField(object, query, row, field, handledMappings, changeSet);
@@ -333,7 +333,7 @@
         if (mapping != null) {
             assignReturnValueToMapping(object,  query, row, field, mapping, handledMappings, changeSet);
         }
-        List readOnlyMappings = getReadOnlyMappingsForField(field);
+        List<DatabaseMapping> readOnlyMappings = getReadOnlyMappingsForField(field);
         if (readOnlyMappings != null) {
             int size = readOnlyMappings.size();
             for (int index = 0; index < size; index++) {
@@ -522,7 +522,7 @@
             }
         }
         // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
 
         // PERF: Cache if all mappings should be read.
         boolean readAllMappings = query.shouldReadAllMappings();
@@ -664,7 +664,7 @@
         Object backup = descriptor.getCopyPolicy().buildClone(clone, unitOfWork);
 
         // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-        List mappings = getCloningMappings();
+        List<DatabaseMapping> mappings = getCloningMappings();
         int size = mappings.size();
         if (descriptor.hasFetchGroupManager() && descriptor.getFetchGroupManager().isPartialObject(clone)) {
             FetchGroupManager fetchGroupManager = descriptor.getFetchGroupManager();
@@ -712,7 +712,7 @@
         Expression expression = null;
 
         // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
         for (int index = 0; index < mappings.size(); index++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
             if (expression == null) {
@@ -1595,14 +1595,14 @@
             return getPrimaryKeyExpression();
         }
 
-        Map keyMapping = this.descriptor.getAdditionalTablePrimaryKeyFields().get(table);
+        Map<DatabaseField, DatabaseField> keyMapping = this.descriptor.getAdditionalTablePrimaryKeyFields().get(table);
         if (keyMapping == null) {
             throw DescriptorException.multipleTablePrimaryKeyNotSpecified(this.descriptor);
         }
 
         ExpressionBuilder builder = new ExpressionBuilder();
         Expression expression = null;
-        for (Iterator primaryKeyEnum = keyMapping.values().iterator(); primaryKeyEnum.hasNext();) {
+        for (Iterator<DatabaseField> primaryKeyEnum = keyMapping.values().iterator(); primaryKeyEnum.hasNext();) {
             DatabaseField field = (DatabaseField)primaryKeyEnum.next();
             expression = (builder.getField(field).equal(builder.getParameter(field))).and(expression);
         }
@@ -1659,7 +1659,7 @@
      */
     public AbstractRecord buildRow(AbstractRecord databaseRow, Object object, AbstractSession session, WriteType writeType) {
         // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
         int mappingsSize = mappings.size();
         for (int index = 0; index < mappingsSize; index++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
@@ -1698,7 +1698,7 @@
      */
     public AbstractRecord buildRowForShallowInsert(AbstractRecord databaseRow, Object object, AbstractSession session) {
         // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
         int mappingsSize = mappings.size();
         for (int index = 0; index < mappingsSize; index++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
@@ -1823,7 +1823,7 @@
      * contain entries for unchanged attributes.
      */
     public AbstractRecord buildRowForUpdate(AbstractRecord databaseRow, WriteObjectQuery query) {
-        for (Iterator mappings = getNonPrimaryKeyMappings().iterator(); mappings.hasNext();) {
+        for (Iterator<DatabaseMapping> mappings = getNonPrimaryKeyMappings().iterator(); mappings.hasNext();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.next();
             mapping.writeFromObjectIntoRowForUpdate(query, databaseRow);
         }
@@ -1860,7 +1860,7 @@
     public AbstractRecord buildRowForUpdateWithChangeSet(WriteObjectQuery query) {
         AbstractRecord databaseRow = createRecord(query.getSession());
         AbstractSession session = query.getSession();
-        List changes = query.getObjectChangeSet().getChanges();
+        List<org.eclipse.persistence.sessions.changesets.ChangeRecord> changes = query.getObjectChangeSet().getChanges();
         int size = changes.size();
         for (int index = 0; index < size; index++) {
             ChangeRecord changeRecord = (ChangeRecord)changes.get(index);
@@ -1882,8 +1882,8 @@
             query.setShouldValidateUpdateCallCacheUse(true);
         }
 
-        for (Iterator mappings = this.descriptor.getMappings().iterator();
-                 mappings.hasNext();) {
+        for (Iterator<DatabaseMapping> mappings = this.descriptor.getMappings().iterator();
+             mappings.hasNext();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.next();
             mapping.writeFromObjectIntoRowForWhereClause(query, databaseRow);
         }
@@ -1939,8 +1939,8 @@
     }
 
     public void buildTemplateInsertRow(AbstractSession session, AbstractRecord databaseRow) {
-        for (Iterator mappings = this.descriptor.getMappings().iterator();
-                 mappings.hasNext();) {
+        for (Iterator<DatabaseMapping> mappings = this.descriptor.getMappings().iterator();
+             mappings.hasNext();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.next();
             mapping.writeInsertFieldsIntoRow(databaseRow, session);
         }
@@ -1994,8 +1994,8 @@
     public AbstractRecord buildTemplateUpdateRow(AbstractSession session) {
         AbstractRecord databaseRow = createRecord(session);
 
-        for (Iterator mappings = getNonPrimaryKeyMappings().iterator();
-                 mappings.hasNext();) {
+        for (Iterator<DatabaseMapping> mappings = getNonPrimaryKeyMappings().iterator();
+             mappings.hasNext();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.next();
             mapping.writeUpdateFieldsIntoRow(databaseRow, session);
         }
@@ -2031,7 +2031,7 @@
      */
     public void buildPrimaryKeyAttributesIntoObject(Object original, AbstractRecord databaseRow, ObjectBuildingQuery query, AbstractSession session) throws DatabaseException, QueryException {
         // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-        List mappings = this.primaryKeyMappings;
+        List<DatabaseMapping> mappings = this.primaryKeyMappings;
         int mappingsSize = mappings.size();
         for (int i = 0; i < mappingsSize; i++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(i);
@@ -2052,7 +2052,7 @@
         AbstractSession executionSession = query.getSession().getExecutionSession(query);
 
         // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-        List pkMappings = getPrimaryKeyMappings();
+        List<DatabaseMapping> pkMappings = getPrimaryKeyMappings();
         int mappingsSize = pkMappings.size();
         for (int i = 0; i < mappingsSize; i++) {
             DatabaseMapping mapping = (DatabaseMapping)pkMappings.get(i);
@@ -2062,7 +2062,7 @@
                 mapping.buildShallowOriginalFromRow(databaseRow, original, null, query, executionSession);
             }
         }
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
         mappingsSize = mappings.size();
         for (int i = 0; i < mappingsSize; i++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(i);
@@ -2087,7 +2087,7 @@
         }
         // PERF: Cache if all mappings should be read.
         boolean readAllMappings = query.shouldReadAllMappings();
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
         int size = mappings.size();
         FetchGroup executionFetchGroup = query.getExecutionFetchGroup(this.descriptor);
         for (int index = 0; index < size; index++) {
@@ -2461,7 +2461,7 @@
                     }
                 }
 
-                List mappings = descriptor.getMappings();
+                List<DatabaseMapping> mappings = descriptor.getMappings();
                 int size = mappings.size();
 
                 if (isSimple) {
@@ -2693,7 +2693,7 @@
      */
     public boolean compareObjects(Object firstObject, Object secondObject, AbstractSession session) {
         // PERF: Avoid iterator.
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
         for (int index = 0; index < mappings.size(); index++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
 
@@ -2713,7 +2713,7 @@
      */
     public void copyInto(Object source, Object target, boolean cloneOneToOneValueHolders) {
         // PERF: Avoid iterator.
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
         for (int index = 0; index < mappings.size(); index++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
             Object value = null;
@@ -2914,7 +2914,7 @@
             copyGroup.getCopies().put(original, copy);
 
             // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
-            List mappings = getCloningMappings();
+            List<DatabaseMapping> mappings = getCloningMappings();
             int size = mappings.size();
             for (int index = 0; index < size; index++) {
                 ((DatabaseMapping)mappings.get(index)).buildCopy(copy, original, copyGroup);
@@ -2923,7 +2923,7 @@
             if (copyGroup.shouldResetPrimaryKey() && (!(this.descriptor.isDescriptorTypeAggregate()))) {
                 // Do not reset if any of the keys is mapped through a 1-1, i.e. back reference id has already changed.
                 boolean hasOneToOne = false;
-                List primaryKeyMappings = getPrimaryKeyMappings();
+                List<DatabaseMapping> primaryKeyMappings = getPrimaryKeyMappings();
                 size = primaryKeyMappings.size();
                 for (int index = 0; index < size; index++) {
                     if (((DatabaseMapping)primaryKeyMappings.get(index)).isOneToOneMapping()) {
@@ -3029,7 +3029,7 @@
         Expression subExp1;
         Expression subExp2;
         Expression subExpression;
-        List primaryKeyFields = this.descriptor.getPrimaryKeyFields();
+        List<DatabaseField> primaryKeyFields = this.descriptor.getPrimaryKeyFields();
 
         if(null != primaryKeyFields) {
             for (int index = 0; index < primaryKeyFields.size(); index++) {
@@ -3306,7 +3306,7 @@
             return databaseRow;
         }
         AbstractRecord primaryKeyRow = createRecord(getPrimaryKeyMappings().size(), session);
-        List primaryKeyFields = this.descriptor.getPrimaryKeyFields();
+        List<DatabaseField> primaryKeyFields = this.descriptor.getPrimaryKeyFields();
         for (int index = 0; index < primaryKeyFields.size(); index++) {
             // Ensure that the type extracted from the object is the same type as in the descriptor,
             // the main reason for this is that 1-1 can optimize on vh by getting from the row as the row-type.
@@ -3673,7 +3673,7 @@
      */
     public List<Class> getPrimaryKeyClassifications() {
         if (primaryKeyClassifications == null) {
-            List primaryKeyFields = this.descriptor.getPrimaryKeyFields();
+            List<DatabaseField> primaryKeyFields = this.descriptor.getPrimaryKeyFields();
             if(null == primaryKeyFields) {
                 return Collections.emptyList();
             }
@@ -3745,8 +3745,8 @@
             nonPrimaryKeyMappings = new ArrayList(10);
         }
 
-        for (Enumeration mappings = this.descriptor.getMappings().elements();
-                 mappings.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappings = this.descriptor.getMappings().elements();
+             mappings.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
 
             // Add attribute to mapping association
@@ -3778,7 +3778,7 @@
             for (DatabaseField field : mapping.getFields()) {
 
                 if (mapping.isReadOnly()) {
-                    List readOnlyMappings = getReadOnlyMappingsByField().get(field);
+                    List<DatabaseMapping> readOnlyMappings = getReadOnlyMappingsByField().get(field);
 
                     if (readOnlyMappings == null) {
                         readOnlyMappings = new ArrayList();
@@ -3796,7 +3796,7 @@
                         DatabaseMapping aggregatedFieldMapping = aggregateObjectBuilder.getMappingForField(field);
 
                         if (aggregatedFieldMapping == null) { // mapping must be read-only
-                            List readOnlyMappings = getReadOnlyMappingsByField().get(field);
+                            List<DatabaseMapping> readOnlyMappings = getReadOnlyMappingsByField().get(field);
 
                             if (readOnlyMappings == null) {
                                 readOnlyMappings = new ArrayList();
@@ -3916,7 +3916,7 @@
         // For concurrency don't worry about doing this work twice, just make sure
         // if it happens don't add the same joined attributes twice.
         List<DatabaseMapping> joinedAttributes = null;
-        List mappings = this.descriptor.getMappings();
+        List<DatabaseMapping> mappings = this.descriptor.getMappings();
         for (int i = 0; i < mappings.size(); i++) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.get(i);
             if (mapping.isForeignReferenceMapping() && ((ForeignReferenceMapping)mapping).isJoinFetched()) {
@@ -3986,7 +3986,7 @@
      * Cache primary key and non primary key mappings.
      */
     public void initializePrimaryKey(AbstractSession session) throws DescriptorException {
-        List primaryKeyFields = this.descriptor.getPrimaryKeyFields();
+        List<DatabaseField> primaryKeyFields = this.descriptor.getPrimaryKeyFields();
         if ((null == primaryKeyFields || primaryKeyFields.isEmpty()) && getDescriptor().isAggregateCollectionDescriptor()) {
             // populate primaryKeys with all mapped fields found in the main table.
             DatabaseTable defaultTable = getDescriptor().getDefaultTable();
@@ -4015,7 +4015,7 @@
         //but no point doing it if the nonPrimaryKeyMappings collection is null
         if (nonPrimaryKeyMappings != null) {
             nonPrimaryKeyMappings.clear();
-            for (Iterator fields = getMappingsByField().keySet().iterator(); fields.hasNext();) {
+            for (Iterator<DatabaseField> fields = getMappingsByField().keySet().iterator(); fields.hasNext();) {
                 DatabaseField field = (DatabaseField)fields.next();
                 if (null ==primaryKeyFields || !primaryKeyFields.contains(field)) {
                     DatabaseMapping mapping = getMappingForField(field);
@@ -4194,7 +4194,7 @@
         if ((source != null) && changeSet.isNew() && (!this.descriptor.shouldUseFullChangeSetsForNewObjects())) {
             mergeIntoObject(target,  changeSet, true, source, mergeManager, targetSession, false, isTargetCloneOfOriginal, shouldMergeFetchGroup);
         } else {
-            List changes = changeSet.getChanges();
+            List<org.eclipse.persistence.sessions.changesets.ChangeRecord> changes = changeSet.getChanges();
             int size = changes.size();
             for (int index = 0; index < size; index++) {
                 ChangeRecord record = (ChangeRecord)changes.get(index);
@@ -4279,7 +4279,7 @@
      * The domainObject sent as parameter is always a copy from the parent of unit of work.
      */
     public void populateAttributesForClone(Object original, CacheKey cacheKey, Object clone, Integer refreshCascade, AbstractSession cloningSession) {
-        List mappings = getCloningMappings();
+        List<DatabaseMapping> mappings = getCloningMappings();
         int size = mappings.size();
         if (this.descriptor.hasFetchGroupManager() && this.descriptor.getFetchGroupManager().isPartialObject(original)) {
             FetchGroupManager fetchGroupManager = this.descriptor.getFetchGroupManager();
@@ -4313,7 +4313,7 @@
             useOnlyMappingsExcludedFromSOP = databaseRow.get(concreteDescriptor.getSerializedObjectPolicy().getField()) != null;
         }
         boolean isUntriggeredResultSetRecord = databaseRow instanceof ResultSetRecord && ((ResultSetRecord)databaseRow).hasResultSet();
-        List batchExpressions = ((ReadAllQuery)query).getBatchReadAttributeExpressions();
+        List<Expression> batchExpressions = ((ReadAllQuery)query).getBatchReadAttributeExpressions();
         int size = batchExpressions.size();
         for (int index = 0; index < size; index++) {
             QueryKeyExpression queryKeyExpression = (QueryKeyExpression)batchExpressions.get(index);
@@ -4353,7 +4353,7 @@
             useOnlyMappingsExcludedFromSOP = databaseRow.get(concreteDescriptor.getSerializedObjectPolicy().getField()) != null;
         }
         Boolean isUntriggeredResultSetRecord = null;
-        List joinExpressions = joinManager.getJoinedAttributeExpressions();
+        List<Expression> joinExpressions = joinManager.getJoinedAttributeExpressions();
         int size = joinExpressions.size();
         for (int index = 0; index < size; index++) {
             QueryKeyExpression queryKeyExpression = (QueryKeyExpression)joinExpressions.get(index);
@@ -4592,8 +4592,8 @@
                 return false;
             }
         } else {
-            for (Enumeration tables = this.descriptor.getTables().elements();
-                     tables.hasMoreElements();) {
+            for (Enumeration<DatabaseTable> tables = this.descriptor.getTables().elements();
+                 tables.hasMoreElements();) {
                 DatabaseTable table = (DatabaseTable)tables.nextElement();
 
                 SQLSelectStatement sqlStatement = new SQLSelectStatement();
@@ -4621,8 +4621,8 @@
         }
 
         // now ask each of the mappings to verify that the object has been deleted.
-        for (Enumeration mappings = this.descriptor.getMappings().elements();
-                 mappings.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappings = this.descriptor.getMappings().elements();
+             mappings.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
 
             if (!mapping.verifyDelete(object, session)) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/OptimisticLockingPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/OptimisticLockingPolicy.java
index ca4240f..3ce2d23 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/OptimisticLockingPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/OptimisticLockingPolicy.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
@@ -109,7 +109,7 @@
      * This is the base value that is older than all other values, it is used in the place of
      * null in some situations.
      */
-    Object getBaseValue();
+    <T> T getBaseValue();
 
     /**
      * ADVANCED:
@@ -125,7 +125,7 @@
      *
      * #see this method in VersionLockingPolicy
      */
-    Object getValueToPutInCache(AbstractRecord row, AbstractSession session);
+    <T> T getValueToPutInCache(AbstractRecord row, AbstractSession session);
 
     /**
      * PUBLIC:
@@ -147,7 +147,7 @@
      *
      * #see this method in VersionLockingPolicy
      */
-    Object getWriteLockValue(Object domainObject, Object primaryKey, AbstractSession session);
+    <T> T getWriteLockValue(Object domainObject, Object primaryKey, AbstractSession session);
 
     /**
      * INTERNAL:
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/VirtualAttributeAccessor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/VirtualAttributeAccessor.java
index a9dc8b8..7324064 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/VirtualAttributeAccessor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/descriptors/VirtualAttributeAccessor.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -20,7 +20,7 @@
 
 public class VirtualAttributeAccessor extends MethodAttributeAccessor {
 
-    private Class valueType = ClassConstants.OBJECT;
+    private Class<Object> valueType = ClassConstants.OBJECT;
 
     /**
      * Gets the value of an instance variable in the object.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ExpressionJavaPrinter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ExpressionJavaPrinter.java
index ba290a7..012a996 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ExpressionJavaPrinter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ExpressionJavaPrinter.java
@@ -151,7 +151,7 @@
             printString(object.toString());
             printString("\")");
         } else {
-            printString((String)ConversionManager.getDefaultManager().convertObject(object, String.class));
+            printString(ConversionManager.getDefaultManager().convertObject(object, String.class));
         }
 
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/FunctionExpression.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/FunctionExpression.java
index 030f8ca..3913904 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/FunctionExpression.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/FunctionExpression.java
@@ -942,7 +942,7 @@
 
     protected DatabaseMapping getMappingOfFirstPrimaryKey(ClassDescriptor descriptor) {
         if (descriptor != null) {
-            for (Iterator i = descriptor.getMappings().iterator(); i.hasNext(); ) {
+            for (Iterator<DatabaseMapping> i = descriptor.getMappings().iterator(); i.hasNext(); ) {
                 DatabaseMapping m = (DatabaseMapping)i.next();
                 if (m.isPrimaryKeyMapping()) {
                     return m;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ObjectExpression.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ObjectExpression.java
index 73aa384..9126d02 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ObjectExpression.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ObjectExpression.java
@@ -161,7 +161,7 @@
         HashMap tablesJoinExpressions = null;
         if(isUsingOuterJoinForMultitableInheritance()) {
             tablesJoinExpressions = new HashMap();
-            List childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
+            List<DatabaseTable> childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
             for( int i=0; i < childrenTables.size(); i++) {
                 DatabaseTable table = (DatabaseTable)childrenTables.get(i);
                 Expression joinExpression = getDescriptor().getInheritancePolicy().getChildrenTablesJoinExpressions().get(table);
@@ -585,7 +585,7 @@
         ClassDescriptor descriptor = getDescriptor();
         List<DatabaseTable> tables = null;
         if (descriptor == null) {
-            List additionalTables = getAdditionalTables();
+            List<DatabaseTable> additionalTables = getAdditionalTables();
             if (additionalTables == null) {
                 return null;
             } else {
@@ -600,7 +600,7 @@
         } else {
             tables = descriptor.getTables();
         }
-        List additionalTables = getAdditionalTables();
+        List<DatabaseTable> additionalTables = getAdditionalTables();
         if (additionalTables != null) {
             tables = new Vector(tables);
             Helper.addAllUniqueToList(tables, additionalTables);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/OuterJoinExpressionHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/OuterJoinExpressionHolder.java
index ac5ff80..9e43e47 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/OuterJoinExpressionHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/OuterJoinExpressionHolder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -136,7 +136,7 @@
             if(descriptor == null) {
                 descriptor = joinExpression.getDescriptor();
             }
-            List targetTables = descriptor.getTables();
+            List<DatabaseTable> targetTables = descriptor.getTables();
             int nDescriptorTables = targetTables.size();
             hasInheritance = descriptor.hasInheritance();
             if(hasInheritance) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/QueryKeyExpression.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/QueryKeyExpression.java
index b7eb2c7..816b3da 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/QueryKeyExpression.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/QueryKeyExpression.java
@@ -188,7 +188,7 @@
         }
 
         HashMap tablesJoinExpressions = new HashMap();
-        Vector tables = getDescriptor().getTables();
+        Vector<DatabaseTable> tables = getDescriptor().getTables();
         // skip the main table - start with i=1
         int tablesSize = tables.size();
         if (shouldUseOuterJoin() || (!getSession().getPlatform().shouldPrintInnerJoinInWhereClause())) {
@@ -203,7 +203,7 @@
             }
         }
         if (isUsingOuterJoinForMultitableInheritance()) {
-            List childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
+            List<DatabaseTable> childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
             tablesSize = childrenTables.size();
             for (int i=0; i < tablesSize; i++) {
                 DatabaseTable table = (DatabaseTable)childrenTables.get(i);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/RelationExpression.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/RelationExpression.java
index edb9f3c..265f775 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/RelationExpression.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/RelationExpression.java
@@ -193,7 +193,7 @@
             return performSelector(false);
         }
 
-        Class javaClass = leftValue.getClass();
+        Class<? extends Object> javaClass = leftValue.getClass();
         if (javaClass != rightValue.getClass()) {
             return performSelector(false);
         }
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 b295963..62b56bb 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
@@ -269,8 +269,8 @@
                     outerJoinedAliases.add(newAlias);
                     writer.write(newAlias.getQualifiedNameDelimited(printer.getPlatform()));
                 } else {// do normal outer stuff for Informix
-                    for (Enumeration target = outerExpression.getMapping().getReferenceDescriptor().getTables().elements();
-                             target.hasMoreElements();) {
+                    for (Enumeration<DatabaseTable> target = outerExpression.getMapping().getReferenceDescriptor().getTables().elements();
+                         target.hasMoreElements();) {
                         DatabaseTable newTarget = (DatabaseTable)target.nextElement();
                         DatabaseTable newAlias = outerExpression.aliasForTable(newTarget);
                         writer.write(", OUTER ");
@@ -760,7 +760,7 @@
 
         printer.getWriter().write(" ORDER BY ");
 
-        for (Iterator expressionsEnum = getOrderByExpressions().iterator(); expressionsEnum.hasNext();) {
+        for (Iterator<Expression> expressionsEnum = getOrderByExpressions().iterator(); expressionsEnum.hasNext();) {
             Expression expression = (Expression)expressionsEnum.next();
             expression.printSQL(printer);
 
@@ -779,7 +779,7 @@
             return;
         }
 
-        for (Iterator expressionsEnum = getUnionExpressions().iterator(); expressionsEnum.hasNext();) {
+        for (Iterator<Expression> expressionsEnum = getUnionExpressions().iterator(); expressionsEnum.hasNext();) {
             Expression expression = (Expression)expressionsEnum.next();
             printer.getWriter().write(" ");
             expression.printSQL(printer);
@@ -1577,9 +1577,9 @@
                     allExpressions.add(criteria);
                 }
 
-                Map map = holder.outerJoinedAdditionalJoinCriteria;
+                Map<DatabaseTable, Expression> map = holder.outerJoinedAdditionalJoinCriteria;
                 if (map != null) {
-                    Iterator it = map.values().iterator();
+                    Iterator<Expression> it = map.values().iterator();
                     while(it.hasNext()) {
                         criteria = (Expression)it.next();
                         if(criteria != null) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/TreatAsExpression.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/TreatAsExpression.java
index cd8a9d6..9f7949f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/TreatAsExpression.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/TreatAsExpression.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -400,7 +400,7 @@
         ClassDescriptor parentDescriptor = this.typeExpressionBase.getDescriptor();
         Vector<DatabaseTable> childTables = new Vector(2);
         if (parentDescriptor.hasInheritance() && parentDescriptor.getInheritancePolicy().hasMultipleTableChild() ) {
-            List parentTables = typeExpressionBase.getOwnedTables();
+            List<DatabaseTable> parentTables = typeExpressionBase.getOwnedTables();
             //All tables for this child, including parent tables
             Vector<DatabaseTable> tables = getDescriptor().getTables();
             for (DatabaseTable table : tables) {
@@ -451,7 +451,7 @@
         //outerjoin our parent->child tables
         if (parentDescriptor.hasInheritance() &&
                 parentDescriptor.getInheritancePolicy().hasMultipleTableChild() ) {
-            Vector tables = getDescriptor().getTables();//All this child's tables
+            Vector<DatabaseTable> tables = getDescriptor().getTables();//All this child's tables
             tableSize = tables.size();
             //look up the joins from the parent descriptor to our tables.
             for (int i=0; i < tableSize; i++) {
@@ -466,7 +466,7 @@
         }
 
         if (isUsingOuterJoinForMultitableInheritance()) {
-            List childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
+            List<DatabaseTable> childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
             tableSize = childrenTables.size();
             for (int i=0; i < tableSize; i++) {
                 DatabaseTable table = (DatabaseTable)childrenTables.get(i);
@@ -492,7 +492,7 @@
         //need to build this using just the multiple tables on this descriptor not included in the parent's join expression
         Expression criteria = null;
         if(getSession().getPlatform().shouldPrintOuterJoinInWhereClause()) {
-            Vector tables = getDescriptor().getTables();//This child's tables
+            Vector<DatabaseTable> tables = getDescriptor().getTables();//This child's tables
             ClassDescriptor parentDescriptor = this.typeExpressionBase.getDescriptor();
             int tablesSize = tables.size();
             if (parentDescriptor.hasInheritance() &&
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ClassConstants.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ClassConstants.java
index eef5a08..9ed25c1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ClassConstants.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ClassConstants.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
@@ -14,16 +14,54 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.helper;
 
+import java.beans.PropertyChangeEvent;
+import java.sql.Blob;
+import java.sql.Clob;
+import java.sql.Date;
+import java.sql.Time;
+import java.sql.Timestamp;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.time.LocalTime;
+import java.time.OffsetDateTime;
+import java.time.OffsetTime;
 import java.util.*;
-import java.math.*;
-import java.net.URL;
 
-import javax.xml.datatype.Duration;
-import javax.xml.datatype.XMLGregorianCalendar;
-import javax.xml.namespace.QName;
-
+import org.eclipse.persistence.descriptors.DescriptorEvent;
+import org.eclipse.persistence.descriptors.changetracking.ChangeTracker;
+import org.eclipse.persistence.descriptors.changetracking.CollectionChangeEvent;
+import org.eclipse.persistence.descriptors.changetracking.MapChangeEvent;
+import org.eclipse.persistence.expressions.Expression;
+import org.eclipse.persistence.indirection.IndirectContainer;
+import org.eclipse.persistence.indirection.IndirectList;
+import org.eclipse.persistence.indirection.IndirectMap;
+import org.eclipse.persistence.indirection.IndirectSet;
+import org.eclipse.persistence.indirection.ValueHolderInterface;
+import org.eclipse.persistence.indirection.WeavedAttributeValueHolderInterface;
+import org.eclipse.persistence.internal.databaseaccess.Accessor;
+import org.eclipse.persistence.internal.expressions.ArgumentListFunctionExpression;
+import org.eclipse.persistence.internal.expressions.FunctionExpression;
+import org.eclipse.persistence.internal.expressions.LogicalExpression;
+import org.eclipse.persistence.internal.expressions.RelationExpression;
+import org.eclipse.persistence.internal.identitymaps.CacheIdentityMap;
+import org.eclipse.persistence.internal.identitymaps.FullIdentityMap;
+import org.eclipse.persistence.internal.identitymaps.HardCacheWeakIdentityMap;
+import org.eclipse.persistence.internal.identitymaps.NoIdentityMap;
+import org.eclipse.persistence.internal.identitymaps.SoftCacheWeakIdentityMap;
+import org.eclipse.persistence.internal.identitymaps.SoftIdentityMap;
+import org.eclipse.persistence.internal.identitymaps.WeakIdentityMap;
+import org.eclipse.persistence.internal.sessions.AbstractRecord;
+import org.eclipse.persistence.internal.weaving.PersistenceWeavedLazy;
+import org.eclipse.persistence.mappings.querykeys.QueryKey;
+import org.eclipse.persistence.queries.CursoredStream;
+import org.eclipse.persistence.queries.DatabaseQuery;
+import org.eclipse.persistence.queries.FetchGroupTracker;
+import org.eclipse.persistence.queries.ScrollableCursor;
+import org.eclipse.persistence.sessions.DirectConnector;
+import org.eclipse.persistence.sessions.Session;
+import org.eclipse.persistence.sessions.server.ServerSession;
+import org.eclipse.persistence.tools.profiler.PerformanceProfiler;
 import org.w3c.dom.Document;
-import org.w3c.dom.Node;
 
 import org.eclipse.persistence.indirection.IndirectCollectionsFactory;
 import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
@@ -33,122 +71,93 @@
 /**
  * INTERNAL:
  */
-public class ClassConstants extends CoreClassConstants {
+@SuppressWarnings({"rawtypes"})
+public final class ClassConstants extends CoreClassConstants {
     // Java classes
-    public static final Class Hashtable_Class = Hashtable.class;
-    public static final Class Enumeration_Class = Enumeration.class;
-    public static final Class JavaSqlTime_Class = java.sql.Time.class;
-    public static final Class JavaSqlDate_Class = java.sql.Date.class;
-    public static final Class JavaSqlTimestamp_Class = java.sql.Timestamp.class;
-    public static final Class List_Class = List.class;
-    public static final Class Map_Entry_Class = Map.Entry.class;
-    public static final Class Object_Class = Object.class;
-    public static final Class SortedSet_Class = SortedSet.class;
-    public static final Class URL_Class = URL.class;
-    public static final Class Vector_class = Vector.class;
-    public static final Class HashSet_class = HashSet.class;
-    public static final Class Void_Class = void.class;
-    public static final Class PropertyChangeEvent_Class = java.beans.PropertyChangeEvent.class;
+
+    public static final Class<Hashtable> Hashtable_Class = Hashtable.class;
+    public static final Class<Enumeration> Enumeration_Class = Enumeration.class;
+    @Deprecated
+    public static final Class<Time> JavaSqlTime_Class = TIME;
+    @Deprecated
+    public static final Class<Date> JavaSqlDate_Class = SQLDATE;
+    @Deprecated
+    public static final Class<Timestamp> JavaSqlTimestamp_Class = TIMESTAMP;
+    public static final Class<Map.Entry> Map_Entry_Class = Map.Entry.class;
+    @Deprecated
+    public static final Class<Object> Object_Class = OBJECT;
+    public static final Class<SortedSet> SortedSet_Class = SortedSet.class;
+    public static final Class<Vector> Vector_class = Vector.class;
+    public static final Class<HashSet> HashSet_class = HashSet.class;
+    public static final Class<Void> Void_Class = void.class;
+    public static final Class<PropertyChangeEvent> PropertyChangeEvent_Class = PropertyChangeEvent.class;
 
     // Eclipselink Classes
-    public static final Class Accessor_Class = org.eclipse.persistence.internal.databaseaccess.Accessor.class;
-    public static final Class ConversionManager_Class = org.eclipse.persistence.internal.helper.ConversionManager.class;
-    public static final Class CursoredStream_Class = org.eclipse.persistence.queries.CursoredStream.class;
-    public static final Class DatabaseQuery_Class = org.eclipse.persistence.queries.DatabaseQuery.class;
-    public static final Class DatabaseRow_Class = org.eclipse.persistence.internal.sessions.AbstractRecord.class;
-    public static final Class OldDescriptorEvent_Class = org.eclipse.persistence.descriptors.DescriptorEvent.class;
-    public static final Class DescriptorEvent_Class = org.eclipse.persistence.descriptors.DescriptorEvent.class;
-    public static final Class DirectConnector_Class = org.eclipse.persistence.sessions.DirectConnector.class;
-    public static final Class Expression_Class = org.eclipse.persistence.expressions.Expression.class;
-    public static final Class FunctionExpression_Class = org.eclipse.persistence.internal.expressions.FunctionExpression.class;
-    public static final Class ArgumentListFunctionExpression_Class = org.eclipse.persistence.internal.expressions.ArgumentListFunctionExpression.class;
-    public static final Class IndirectContainer_Class = org.eclipse.persistence.indirection.IndirectContainer.class;
-    public static final Class IndirectList_Class = IndirectCollectionsFactory.IndirectList_Class;
-    public static final Class IndirectSet_Class = IndirectCollectionsFactory.IndirectSet_Class;
-    public static final Class IndirectMap_Class = IndirectCollectionsFactory.IndirectMap_Class;
-    public static final Class LogicalExpression_Class = org.eclipse.persistence.internal.expressions.LogicalExpression.class;
-    public static final Class PublicInterfaceDatabaseSession_Class = DatabaseSessionImpl.class;
-    public static final Class PerformanceProfiler_Class = org.eclipse.persistence.tools.profiler.PerformanceProfiler.class;
-    public static final Class PublicInterfaceSession_Class = AbstractSession.class;
-    public static final Class QueryKey_Class = org.eclipse.persistence.mappings.querykeys.QueryKey.class;
-    public static final Class RelationExpression_Class = org.eclipse.persistence.internal.expressions.RelationExpression.class;
-    public static final Class Record_Class = org.eclipse.persistence.sessions.Record.class;
-    public static final Class ServerSession_Class = org.eclipse.persistence.sessions.server.ServerSession.class;
-    public static final Class SessionsSession_Class = org.eclipse.persistence.sessions.Session.class;
-    public static final Class ScrollableCursor_Class = org.eclipse.persistence.queries.ScrollableCursor.class;
-    public static final Class ValueHolderInterface_Class = org.eclipse.persistence.indirection.ValueHolderInterface.class;
-    public static final Class CollectionChangeEvent_Class = org.eclipse.persistence.descriptors.changetracking.CollectionChangeEvent.class;
-    public static final Class MapChangeEvent_Class = org.eclipse.persistence.descriptors.changetracking.MapChangeEvent.class;
-    public static final Class ChangeTracker_Class = org.eclipse.persistence.descriptors.changetracking.ChangeTracker.class;
-    public static final Class WeavedAttributeValueHolderInterface_Class = org.eclipse.persistence.indirection.WeavedAttributeValueHolderInterface.class;
-    public static final Class PersistenceWeavedLazy_Class = org.eclipse.persistence.internal.weaving.PersistenceWeavedLazy.class;
+    public static final Class<Accessor> Accessor_Class = Accessor.class;
+    public static final Class<ConversionManager> ConversionManager_Class = ConversionManager.class;
+    public static final Class<CursoredStream> CursoredStream_Class = CursoredStream.class;
+    public static final Class<DatabaseQuery> DatabaseQuery_Class = DatabaseQuery.class;
+    public static final Class<AbstractRecord> DatabaseRow_Class = AbstractRecord.class;
+    public static final Class<DescriptorEvent> OldDescriptorEvent_Class = DescriptorEvent.class;
+    public static final Class<DescriptorEvent> DescriptorEvent_Class = DescriptorEvent.class;
+    public static final Class<DirectConnector> DirectConnector_Class = DirectConnector.class;
+    public static final Class<Expression> Expression_Class = Expression.class;
+    public static final Class<FunctionExpression> FunctionExpression_Class = FunctionExpression.class;
+    public static final Class<ArgumentListFunctionExpression> ArgumentListFunctionExpression_Class = ArgumentListFunctionExpression.class;
+    public static final Class<IndirectContainer> IndirectContainer_Class = IndirectContainer.class;
+    public static final Class<IndirectList> IndirectList_Class = IndirectCollectionsFactory.IndirectList_Class;
+    public static final Class<IndirectSet> IndirectSet_Class = IndirectCollectionsFactory.IndirectSet_Class;
+    public static final Class<IndirectMap> IndirectMap_Class = IndirectCollectionsFactory.IndirectMap_Class;
+    public static final Class<LogicalExpression> LogicalExpression_Class = LogicalExpression.class;
+    public static final Class<DatabaseSessionImpl> PublicInterfaceDatabaseSession_Class = DatabaseSessionImpl.class;
+    public static final Class<PerformanceProfiler> PerformanceProfiler_Class = PerformanceProfiler.class;
+    public static final Class<AbstractSession> PublicInterfaceSession_Class = AbstractSession.class;
+    public static final Class<QueryKey> QueryKey_Class = QueryKey.class;
+    public static final Class<RelationExpression> RelationExpression_Class = RelationExpression.class;
+    public static final Class<org.eclipse.persistence.sessions.Record> Record_Class = org.eclipse.persistence.sessions.Record.class;
+    public static final Class<ServerSession> ServerSession_Class = ServerSession.class;
+    public static final Class<Session> SessionsSession_Class = Session.class;
+    public static final Class<ScrollableCursor> ScrollableCursor_Class = ScrollableCursor.class;
+    public static final Class<ValueHolderInterface> ValueHolderInterface_Class = ValueHolderInterface.class;
+    public static final Class<CollectionChangeEvent> CollectionChangeEvent_Class = CollectionChangeEvent.class;
+    public static final Class<MapChangeEvent> MapChangeEvent_Class = MapChangeEvent.class;
+    public static final Class<ChangeTracker> ChangeTracker_Class = ChangeTracker.class;
+    public static final Class<WeavedAttributeValueHolderInterface> WeavedAttributeValueHolderInterface_Class = WeavedAttributeValueHolderInterface.class;
+    public static final Class<PersistenceWeavedLazy> PersistenceWeavedLazy_Class = PersistenceWeavedLazy.class;
 
     // Identity map classes
-    public static final Class CacheIdentityMap_Class = org.eclipse.persistence.internal.identitymaps.CacheIdentityMap.class;
-    public static final Class FullIdentityMap_Class = org.eclipse.persistence.internal.identitymaps.FullIdentityMap.class;
-    public static final Class HardCacheWeakIdentityMap_Class = org.eclipse.persistence.internal.identitymaps.HardCacheWeakIdentityMap.class;
-    public static final Class NoIdentityMap_Class = org.eclipse.persistence.internal.identitymaps.NoIdentityMap.class;
-    public static final Class SoftCacheWeakIdentityMap_Class = org.eclipse.persistence.internal.identitymaps.SoftCacheWeakIdentityMap.class;
-    public static final Class SoftIdentityMap_Class = org.eclipse.persistence.internal.identitymaps.SoftIdentityMap.class;
-    public static final Class WeakIdentityMap_Class = org.eclipse.persistence.internal.identitymaps.WeakIdentityMap.class;
+    public static final Class<CacheIdentityMap> CacheIdentityMap_Class = CacheIdentityMap.class;
+    public static final Class<FullIdentityMap> FullIdentityMap_Class = FullIdentityMap.class;
+    public static final Class<HardCacheWeakIdentityMap> HardCacheWeakIdentityMap_Class = HardCacheWeakIdentityMap.class;
+    public static final Class<NoIdentityMap> NoIdentityMap_Class = NoIdentityMap.class;
+    public static final Class<SoftCacheWeakIdentityMap> SoftCacheWeakIdentityMap_Class = SoftCacheWeakIdentityMap.class;
+    public static final Class<SoftIdentityMap> SoftIdentityMap_Class = SoftIdentityMap.class;
+    public static final Class<WeakIdentityMap> WeakIdentityMap_Class = WeakIdentityMap.class;
 
     //fetch group class
-    public static final Class FetchGroupTracker_class = org.eclipse.persistence.queries.FetchGroupTracker.class;
+    public static final Class<FetchGroupTracker> FetchGroupTracker_class = FetchGroupTracker.class;
 
     // Moved from ConversionManager
-    public static final Class ABYTE = Byte[].class;
     public static final Class AOBJECT = Object[].class;
     public static final Class ACHAR = Character[].class;
-    public static final Class APBYTE = byte[].class;
-    public static final Class APCHAR = char[].class;
-    public static final Class BIGDECIMAL = BigDecimal.class;
-    public static final Class BIGINTEGER = BigInteger.class;
-    public static final Class BOOLEAN = Boolean.class;
-    public static final Class BYTE = Byte.class;
-    public static final Class CLASS = Class.class;
-    public static final Class CHAR = Character.class;
-    public static final Class CALENDAR = Calendar.class;
-    public static final Class DOUBLE = Double.class;
-    public static final Class FLOAT = Float.class;
-    public static final Class GREGORIAN_CALENDAR = GregorianCalendar.class;
-    public static final Class INTEGER = Integer.class;
-    public static final Class LONG = Long.class;
-    public static final Class NUMBER = Number.class;
-    public static final Class OBJECT = Object.class;
-    public static final Class PBOOLEAN = boolean.class;
-    public static final Class PBYTE = byte.class;
-    public static final Class PCHAR = char.class;
-    public static final Class PDOUBLE = double.class;
-    public static final Class PFLOAT = float.class;
-    public static final Class PINT = int.class;
-    public static final Class PLONG = long.class;
-    public static final Class PSHORT = short.class;
-    public static final Class SHORT = Short.class;
-    public static final Class SQLDATE = java.sql.Date.class;
-    public static final Class STRING = String.class;
-    public static final Class TIME = java.sql.Time.class;
-    public static final Class TIMESTAMP = java.sql.Timestamp.class;
-    public static final Class UTILDATE = java.util.Date.class;
-    public static final Class TIME_LDATE = java.time.LocalDate.class;
-    public static final Class TIME_LTIME = java.time.LocalTime.class;
-    public static final Class TIME_LDATETIME = java.time.LocalDateTime.class;
-    public static final Class TIME_ODATETIME = java.time.OffsetDateTime.class;
-    public static final Class TIME_OTIME = java.time.OffsetTime.class;
-    public static final Class QNAME = QName.class;
-    public static final Class XML_GREGORIAN_CALENDAR = XMLGregorianCalendar.class;
-    public static final Class DURATION = Duration.class;
+    public static final Class<LocalDate> TIME_LDATE = LocalDate.class;
+    public static final Class<LocalTime> TIME_LTIME = LocalTime.class;
+    public static final Class<LocalDateTime> TIME_LDATETIME = LocalDateTime.class;
+    public static final Class<OffsetDateTime> TIME_ODATETIME = OffsetDateTime.class;
+    public static final Class<OffsetTime> TIME_OTIME = OffsetTime.class;
 
     //LOB support types
-    public static final Class BLOB = java.sql.Blob.class;
-    public static final Class CLOB = java.sql.Clob.class;
+    public static final Class<Blob> BLOB = Blob.class;
+    public static final Class<Clob> CLOB = Clob.class;
 
     //Indication to ConversionManager not to convert classes implementing this interface
-    public static final Class NOCONVERSION = NoConversion.class;
+    public static final Class<NoConversion> NOCONVERSION = NoConversion.class;
 
     //XML Classes
-    public static final Class DOCUMENT = Document.class;
-    public static final Class NODE = Node.class;
+    public static final Class<Document> DOCUMENT = Document.class;
 
-    public ClassConstants() {
+
+    private ClassConstants() {
+        //no instance please
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConversionManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConversionManager.java
index f783fd4..2bf15f1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConversionManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConversionManager.java
@@ -36,11 +36,13 @@
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.ZoneOffset;
+import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
-import java.util.Vector;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 
 import org.eclipse.persistence.config.SystemProperties;
@@ -65,7 +67,7 @@
  *    </ul>
  */
 public class ConversionManager extends CoreConversionManager implements Serializable, Cloneable {
-    protected Map defaultNullValues;
+    protected Map<Class<?>, Object> defaultNullValues;
     private static ZoneId defaultZoneOffset = null;
 
     /**
@@ -80,10 +82,10 @@
     protected ClassLoader loader;
 
     /** Store the list of Classes that can be converted to from the key. */
-    protected Hashtable dataTypesConvertedFromAClass;
+    protected Map<Object, List<Class<?>>> dataTypesConvertedFromAClass;
 
     /** Store the list of Classes that can be converted from to the key. */
-    protected Hashtable dataTypesConvertedToAClass;
+    protected Map<Class<?>, List<Class<?>>> dataTypesConvertedToAClass;
 
     private static ZoneId getDefaultZoneOffset() {
         if (defaultZoneOffset == null) {
@@ -137,8 +139,8 @@
     }
     
     public ConversionManager() {
-        this.dataTypesConvertedFromAClass = new Hashtable();
-        this.dataTypesConvertedToAClass = new Hashtable();
+        this.dataTypesConvertedFromAClass = new Hashtable<>();
+        this.dataTypesConvertedToAClass = new Hashtable<>();
     }
 
     /**
@@ -162,7 +164,8 @@
      * @return the newly converted object
      */
     @Override
-    public Object convertObject(Object sourceObject, Class javaClass) throws ConversionException {
+    @SuppressWarnings({"unchecked"})
+    public <T> T convertObject(Object sourceObject, Class<T> javaClass) throws ConversionException {
         if (sourceObject == null) {
             // Check for default null conversion.
             // i.e. allow for null to be defaulted to "", or 0 etc.
@@ -174,66 +177,66 @@
         }
 
         if ((sourceObject.getClass() == javaClass) || (javaClass == null) || (javaClass == ClassConstants.OBJECT) || (javaClass == ClassConstants.BLOB) || (javaClass == ClassConstants.CLOB)) {
-            return sourceObject;
+            return (T) sourceObject;
         }
 
         try {
             if (javaClass == ClassConstants.STRING) {
-                return convertObjectToString(sourceObject);
+                return (T) convertObjectToString(sourceObject);
             } else if (javaClass == ClassConstants.UTILDATE) {
-                return convertObjectToUtilDate(sourceObject);
+                return (T) convertObjectToUtilDate(sourceObject);
             } else if (javaClass == ClassConstants.SQLDATE) {
-                return convertObjectToDate(sourceObject);
+                return (T) convertObjectToDate(sourceObject);
             } else if (javaClass == ClassConstants.TIME) {
-                return convertObjectToTime(sourceObject);
+                return (T) convertObjectToTime(sourceObject);
             } else if (javaClass == ClassConstants.TIMESTAMP) {
-                return convertObjectToTimestamp(sourceObject);
+                return (T) convertObjectToTimestamp(sourceObject);
             } else if (javaClass == ClassConstants.TIME_LDATE) {
-                return convertObjectToLocalDate(sourceObject);
+                return (T) convertObjectToLocalDate(sourceObject);
             } else if (javaClass == ClassConstants.TIME_LDATETIME) {
-                return convertObjectToLocalDateTime(sourceObject);
+                return (T) convertObjectToLocalDateTime(sourceObject);
             } else if (javaClass == ClassConstants.TIME_LTIME) {
-                return convertObjectToLocalTime(sourceObject);
+                return (T) convertObjectToLocalTime(sourceObject);
             } else if (javaClass == ClassConstants.TIME_ODATETIME) {
-                return convertObjectToOffsetDateTime(sourceObject);
+                return (T) convertObjectToOffsetDateTime(sourceObject);
             } else if (javaClass == ClassConstants.TIME_OTIME) {
-                return convertObjectToOffsetTime(sourceObject);
+                return (T) convertObjectToOffsetTime(sourceObject);
             } else if ((javaClass == ClassConstants.CALENDAR) || (javaClass == ClassConstants.GREGORIAN_CALENDAR)) {
-                return convertObjectToCalendar(sourceObject);
+                return (T) convertObjectToCalendar(sourceObject);
             } else if ((javaClass == ClassConstants.CHAR) || (javaClass == ClassConstants.PCHAR && !(sourceObject instanceof Character))) {
-                return convertObjectToChar(sourceObject);
+                return (T) convertObjectToChar(sourceObject);
             } else if ((javaClass == ClassConstants.INTEGER) || (javaClass == ClassConstants.PINT && !(sourceObject instanceof Integer))) {
-                return convertObjectToInteger(sourceObject);
+                return (T) convertObjectToInteger(sourceObject);
             } else if ((javaClass == ClassConstants.DOUBLE) || (javaClass == ClassConstants.PDOUBLE && !(sourceObject instanceof Double))) {
-                return convertObjectToDouble(sourceObject);
+                return (T) convertObjectToDouble(sourceObject);
             } else if ((javaClass == ClassConstants.FLOAT) || (javaClass == ClassConstants.PFLOAT && !(sourceObject instanceof Float))) {
-                return convertObjectToFloat(sourceObject);
+                return (T) convertObjectToFloat(sourceObject);
             } else if ((javaClass == ClassConstants.LONG) || (javaClass == ClassConstants.PLONG && !(sourceObject instanceof Long))) {
-                return convertObjectToLong(sourceObject);
+                return (T) convertObjectToLong(sourceObject);
             } else if ((javaClass == ClassConstants.SHORT) || (javaClass == ClassConstants.PSHORT && !(sourceObject instanceof Short))) {
-                return convertObjectToShort(sourceObject);
+                return (T) convertObjectToShort(sourceObject);
             } else if ((javaClass == ClassConstants.BYTE) || (javaClass == ClassConstants.PBYTE && !(sourceObject instanceof Byte))) {
-                return convertObjectToByte(sourceObject);
+                return (T) convertObjectToByte(sourceObject);
             } else if (javaClass == ClassConstants.BIGINTEGER) {
-                return convertObjectToBigInteger(sourceObject);
+                return (T) convertObjectToBigInteger(sourceObject);
             } else if (javaClass == ClassConstants.BIGDECIMAL) {
-                return convertObjectToBigDecimal(sourceObject);
+                return (T) convertObjectToBigDecimal(sourceObject);
             } else if (javaClass == ClassConstants.NUMBER) {
-                return convertObjectToNumber(sourceObject);
+                return (T) convertObjectToNumber(sourceObject);
             } else if ((javaClass == ClassConstants.BOOLEAN) || (javaClass == ClassConstants.PBOOLEAN  && !(sourceObject instanceof Boolean))) {
-                return convertObjectToBoolean(sourceObject);
+                return (T) convertObjectToBoolean(sourceObject);
             } else if (javaClass == ClassConstants.APBYTE) {
-                return convertObjectToByteArray(sourceObject);
+                return (T) convertObjectToByteArray(sourceObject);
             } else if (javaClass == ClassConstants.ABYTE) {
-                return convertObjectToByteObjectArray(sourceObject);
+                return (T) convertObjectToByteObjectArray(sourceObject);
             } else if (javaClass == ClassConstants.APCHAR) {
-                return convertObjectToCharArray(sourceObject);
+                return (T) convertObjectToCharArray(sourceObject);
             } else if (javaClass == ClassConstants.ACHAR) {
-                return convertObjectToCharacterArray(sourceObject);
+                return (T) convertObjectToCharacterArray(sourceObject);
             } else if ((sourceObject.getClass() == ClassConstants.STRING) && (javaClass == ClassConstants.CLASS)) {
-                return convertObjectToClass(sourceObject);
+                return (T) convertObjectToClass(sourceObject);
             } else if(javaClass == ClassConstants.URL_Class) {
-                return convertObjectToUrl(sourceObject);
+                return (T) convertObjectToUrl(sourceObject);
             }
         } catch (ConversionException ce) {
             throw ce;
@@ -250,15 +253,15 @@
             ((javaClass == ClassConstants.PBYTE) &&  (sourceObject instanceof Byte)) ||
             ((javaClass == ClassConstants.PCHAR) &&  (sourceObject instanceof Character)) ||
             ((javaClass == ClassConstants.PSHORT) &&  (sourceObject instanceof Short)))) {
-            return sourceObject;
+            return (T) sourceObject;
         }
 
         // Delay this check as poor performance.
         if (javaClass.isInstance(sourceObject)) {
-            return sourceObject;
+            return (T) sourceObject;
         }
         if (ClassConstants.NOCONVERSION.isAssignableFrom(javaClass)) {
-            return sourceObject;
+            return (T) sourceObject;
         }
 
         throw ConversionException.couldNotBeConverted(sourceObject, javaClass);
@@ -474,7 +477,7 @@
         if (sourceObject instanceof String) {
             if (((String)sourceObject).length() < 1) {
                 // ELBug336192 - Return default null value of char instead of returning null.
-                return (Character)getDefaultNullValue(ClassConstants.PCHAR);
+                return getDefaultNullValue(ClassConstants.PCHAR);
             }
             return ((String) sourceObject).charAt(0);
         }
@@ -522,8 +525,9 @@
      * Build a valid Class from the string that is passed in
      *    @param sourceObject    Valid instance of String
      */
-    protected Class convertObjectToClass(Object sourceObject) throws ConversionException {
-        Class theClass = null;
+    @SuppressWarnings({"unchecked"})
+    protected <T> Class<T> convertObjectToClass(Object sourceObject) throws ConversionException {
+        Class<?> theClass = null;
         if (!(sourceObject instanceof String)) {
             throw ConversionException.couldNotBeConverted(sourceObject, ClassConstants.CLASS);
         }
@@ -536,7 +540,7 @@
         } catch (Exception exception) {
             throw ConversionException.couldNotBeConvertedToClass(sourceObject, ClassConstants.CLASS, exception);
         }
-        return theClass;
+        return (Class<T>) theClass;
     }
 
     /**
@@ -738,7 +742,7 @@
      */
     protected String convertObjectToString(Object sourceObject) throws ConversionException {
 
-        Class sourceObjectClass = sourceObject.getClass();
+        Class<?> sourceObjectClass = sourceObject.getClass();
 
         if (sourceObject instanceof java.lang.Number) {
             return sourceObject.toString();
@@ -764,7 +768,7 @@
         } else if (sourceObjectClass == ClassConstants.ACHAR) {
             return new String(convertObjectToCharArray(sourceObject));
         } else if (sourceObject instanceof Class) {
-            return ((Class)sourceObject).getName();
+            return ((Class<?>)sourceObject).getName();
         } else if (sourceObjectClass == ClassConstants.CHAR) {
             return sourceObject.toString();
         } else if (sourceObject instanceof Clob) {
@@ -1102,7 +1106,8 @@
      * Resolve the given String className into a class using this
      * ConversionManager's classloader.
      */
-    public Class convertClassNameToClass(String className) throws ConversionException {
+    @SuppressWarnings({"unchecked"})
+    public <T> Class<T> convertClassNameToClass(String className) throws ConversionException {
         return convertObjectToClass(className);
     }
 
@@ -1124,9 +1129,10 @@
      * Allow for the null values for classes to be defaulted in one place.
      * Any nulls read from the database to be converted to the class will be given the specified null value.
      */
-    public Object getDefaultNullValue(Class theClass) {
+    @SuppressWarnings({"unchecked"})
+    public <T> T getDefaultNullValue(Class<T> theClass) {
         if (this.defaultNullValues == null) return null;
-        return getDefaultNullValues().get(theClass);
+        return (T) getDefaultNullValues().get(theClass);
     }
 
     /**
@@ -1134,7 +1140,7 @@
      * Allow for the null values for classes to be defaulted in one place.
      * Any nulls read from the database to be converted to the class will be given the specified null value.
      */
-    public Map getDefaultNullValues() {
+    public Map<Class<?>, Object> getDefaultNullValues() {
         return defaultNullValues;
     }
 
@@ -1189,15 +1195,17 @@
      * This should be used to load all classes as Class.forName can only
      * see classes on the same classpath as the eclipselink.jar.
      */
-    public static Class loadClass(String className) {
-        return (Class)getDefaultManager().convertObject(className, ClassConstants.CLASS);
+    @SuppressWarnings({"unchecked"})
+    public static <T> Class<T> loadClass(String className) {
+        return (Class<T>) getDefaultManager().convertObject(className, ClassConstants.CLASS);
     }
 
     /**
      * INTERNAL:
      * This is used to determine the wrapper class for a primitive.
      */
-    public static Class getObjectClass(Class javaClass) {
+    @SuppressWarnings({"unchecked"})
+    public static <T> Class<T> getObjectClass(Class<?> javaClass) {
         // Null means unknown always for classifications.
         if (javaClass == null) {
             return null;
@@ -1205,61 +1213,62 @@
 
         if (javaClass.isPrimitive()) {
             if (javaClass == ClassConstants.PCHAR) {
-                return ClassConstants.CHAR;
+                return (Class<T>) ClassConstants.CHAR;
             }
             if (javaClass == ClassConstants.PINT) {
-                return ClassConstants.INTEGER;
+                return (Class<T>) ClassConstants.INTEGER;
             }
             if (javaClass == ClassConstants.PDOUBLE) {
-                return ClassConstants.DOUBLE;
+                return (Class<T>) ClassConstants.DOUBLE;
             }
             if (javaClass == ClassConstants.PFLOAT) {
-                return ClassConstants.FLOAT;
+                return (Class<T>) ClassConstants.FLOAT;
             }
             if (javaClass == ClassConstants.PLONG) {
-                return ClassConstants.LONG;
+                return (Class<T>) ClassConstants.LONG;
             }
             if (javaClass == ClassConstants.PSHORT) {
-                return ClassConstants.SHORT;
+                return (Class<T>) ClassConstants.SHORT;
             }
             if (javaClass == ClassConstants.PBYTE) {
-                return ClassConstants.BYTE;
+                return (Class<T>) ClassConstants.BYTE;
             }
             if (javaClass == ClassConstants.PBOOLEAN) {
-                return ClassConstants.BOOLEAN;
+                return (Class<T>) ClassConstants.BOOLEAN;
             }
             } else if (javaClass == ClassConstants.APBYTE) {
-                return ClassConstants.APBYTE;
+                return (Class<T>) ClassConstants.APBYTE;
             } else if (javaClass == ClassConstants.APCHAR) {
-                return ClassConstants.APCHAR;
+                return (Class<T>) ClassConstants.APCHAR;
             } else {
-                return javaClass;
+                return (Class<T>) javaClass;
             }
 
-        return javaClass;
+        return (Class<T>) javaClass;
     }
 
     /**
      * INTERNAL:
      * Returns a class based on the passed in string.
      */
-    public static Class getPrimitiveClass(String classType) {
+    @SuppressWarnings({"unchecked"})
+    public static <T> Class<T> getPrimitiveClass(String classType) {
         if (classType.equals("int")) {
-            return Integer.TYPE;
+            return (Class<T>) Integer.TYPE;
         } else if (classType.equals("boolean")) {
-            return Boolean.TYPE;
+            return (Class<T>) Boolean.TYPE;
         } else if (classType.equals("char")) {
-            return Character.TYPE;
+            return (Class<T>) Character.TYPE;
         } else if (classType.equals("short")) {
-            return Short.TYPE;
+            return (Class<T>) Short.TYPE;
         } else if (classType.equals("byte")) {
-            return Byte.TYPE;
+            return (Class<T>) Byte.TYPE;
         } else if (classType.equals("float")) {
-            return Float.TYPE;
+            return (Class<T>) Float.TYPE;
         } else if (classType.equals("double")) {
-            return Double.TYPE;
+            return (Class<T>) Double.TYPE;
         } else if (classType.equals("long")) {
-            return Long.TYPE;
+            return (Class<T>) Long.TYPE;
         }
 
         return null;
@@ -1280,9 +1289,9 @@
      * Any nulls read from the database to be converted to the class will be given the specified null value.
      * Primitive null values should be set to the wrapper class.
      */
-    public void setDefaultNullValue(Class theClass, Object theValue) {
+    public void setDefaultNullValue(Class<?> theClass, Object theValue) {
         if (this.defaultNullValues == null){
-            this.defaultNullValues = new HashMap(5);
+            this.defaultNullValues = new HashMap<>(5);
         }
         getDefaultNullValues().put(theClass, theValue);
     }
@@ -1292,7 +1301,7 @@
      * Allow for the null values for classes to be defaulted in one place.
      * Any nulls read from the database to be converted to the class will be given the specified null value.
      */
-    public void setDefaultNullValues(Map defaultNullValues) {
+    public void setDefaultNullValues(Map<Class<?>, Object> defaultNullValues) {
         this.defaultNullValues = defaultNullValues;
     }
 
@@ -1349,11 +1358,11 @@
      * @param javaClass - the class that is converted from
      * @return - a vector of classes
      */
-    public Vector getDataTypesConvertedFrom(Class javaClass) {
+    public List<Class<?>> getDataTypesConvertedFrom(Class<?> javaClass) {
         if (dataTypesConvertedFromAClass.isEmpty()) {
             buildDataTypesConvertedFromAClass();
         }
-        return (Vector)dataTypesConvertedFromAClass.get(javaClass);
+        return dataTypesConvertedFromAClass.get(javaClass);
     }
 
     /**
@@ -1362,32 +1371,32 @@
      * @param javaClass - the class that is converted to
      * @return - a vector of classes
      */
-    public Vector getDataTypesConvertedTo(Class javaClass) {
+    public List<Class<?>> getDataTypesConvertedTo(Class<?> javaClass) {
         if (dataTypesConvertedToAClass.isEmpty()) {
             buildDataTypesConvertedToAClass();
         }
-        return (Vector)dataTypesConvertedToAClass.get(javaClass);
+        return dataTypesConvertedToAClass.get(javaClass);
     }
 
-    protected Vector buildNumberVec() {
-        Vector vec = new Vector();
-        vec.addElement(BigInteger.class);
-        vec.addElement(BigDecimal.class);
-        vec.addElement(Byte.class);
-        vec.addElement(Double.class);
-        vec.addElement(Float.class);
-        vec.addElement(Integer.class);
-        vec.addElement(Long.class);
-        vec.addElement(Short.class);
-        vec.addElement(Number.class);
+    protected List<Class<?>> buildNumberVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(BigInteger.class);
+        vec.add(BigDecimal.class);
+        vec.add(Byte.class);
+        vec.add(Double.class);
+        vec.add(Float.class);
+        vec.add(Integer.class);
+        vec.add(Long.class);
+        vec.add(Short.class);
+        vec.add(Number.class);
         return vec;
     }
 
-    protected Vector buildDateTimeVec() {
-        Vector vec = new Vector();
-        vec.addElement(java.util.Date.class);
-        vec.addElement(Timestamp.class);
-        vec.addElement(Calendar.class);
+    protected List<Class<?>> buildDateTimeVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(java.util.Date.class);
+        vec.add(Timestamp.class);
+        vec.add(Calendar.class);
         return vec;
     }
 
@@ -1417,183 +1426,183 @@
         dataTypesConvertedFromAClass.put(Character[].class, buildFromCharacterArrayVec());
     }
 
-    protected Vector buildFromBooleanVec() {
-        Vector vec = new Vector();
-        vec.addElement(String.class);
-        vec.addElement(Boolean.class);
-        vec.addElement(Integer.class);
-        vec.addElement(Long.class);
-        vec.addElement(Short.class);
-        vec.addElement(Number.class);
-        vec.addElement(Character[].class);
-        vec.addElement(char[].class);
-        vec.addElement(boolean.class);
-        vec.addElement(int.class);
-        vec.addElement(long.class);
-        vec.addElement(short.class);
+    protected List<Class<?>> buildFromBooleanVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(String.class);
+        vec.add(Boolean.class);
+        vec.add(Integer.class);
+        vec.add(Long.class);
+        vec.add(Short.class);
+        vec.add(Number.class);
+        vec.add(Character[].class);
+        vec.add(char[].class);
+        vec.add(boolean.class);
+        vec.add(int.class);
+        vec.add(long.class);
+        vec.add(short.class);
         return vec;
     }
 
-    protected Vector buildFromNumberVec() {
-        Vector vec = buildNumberVec();
-        vec.addElement(String.class);
-        vec.addElement(Character.class);
-        vec.addElement(Boolean.class);
-        vec.addElement(Character[].class);
-        vec.addElement(char[].class);
-        vec.addElement(char.class);
-        vec.addElement(int.class);
-        vec.addElement(double.class);
-        vec.addElement(float.class);
-        vec.addElement(long.class);
-        vec.addElement(short.class);
-        vec.addElement(byte.class);
-        vec.addElement(boolean.class);
+    protected List<Class<?>> buildFromNumberVec() {
+        List<Class<?>> vec = buildNumberVec();
+        vec.add(String.class);
+        vec.add(Character.class);
+        vec.add(Boolean.class);
+        vec.add(Character[].class);
+        vec.add(char[].class);
+        vec.add(char.class);
+        vec.add(int.class);
+        vec.add(double.class);
+        vec.add(float.class);
+        vec.add(long.class);
+        vec.add(short.class);
+        vec.add(byte.class);
+        vec.add(boolean.class);
         return vec;
     }
 
-    protected Vector buildFromBigDecimalVec() {
+    protected List<Class<?>> buildFromBigDecimalVec() {
         return buildFromNumberVec();
     }
 
-    protected Vector buildFromBigIntegerVec() {
+    protected List<Class<?>> buildFromBigIntegerVec() {
         return buildFromNumberVec();
     }
 
-    protected Vector buildFromIntegerVec() {
+    protected List<Class<?>> buildFromIntegerVec() {
         return buildFromNumberVec();
     }
 
-    protected Vector buildFromFloatVec() {
+    protected List<Class<?>> buildFromFloatVec() {
         return buildFromNumberVec();
     }
 
-    protected Vector buildFromDoubleVec() {
+    protected List<Class<?>> buildFromDoubleVec() {
         return buildFromNumberVec();
     }
 
-    protected Vector buildFromShortVec() {
+    protected List<Class<?>> buildFromShortVec() {
         return buildFromNumberVec();
     }
 
-    protected Vector buildFromByteVec() {
+    protected List<Class<?>> buildFromByteVec() {
         return buildFromNumberVec();
     }
 
-    protected Vector buildFromLongVec() {
-        Vector vec = buildFromNumberVec();
+    protected List<Class<?>> buildFromLongVec() {
+        List<Class<?>> vec = buildFromNumberVec();
         vec.addAll(buildDateTimeVec());
-        vec.addElement(java.sql.Date.class);
-        vec.addElement(Time.class);
+        vec.add(java.sql.Date.class);
+        vec.add(Time.class);
         return vec;
     }
 
-    protected Vector buildFromStringVec() {
-        Vector vec = buildFromLongVec();
-        vec.addElement(Byte[].class);
-        vec.addElement(byte[].class);
-        vec.addElement(Clob.class);
+    protected List<Class<?>> buildFromStringVec() {
+        List<Class<?>> vec = buildFromLongVec();
+        vec.add(Byte[].class);
+        vec.add(byte[].class);
+        vec.add(Clob.class);
         return vec;
     }
 
-    protected Vector buildFromCharacterVec() {
-        Vector vec = new Vector();
-        vec.addElement(String.class);
-        vec.addElement(Boolean.class);
-        vec.addElement(Character[].class);
-        vec.addElement(Character.class);
-        vec.addElement(char[].class);
-        vec.addElement(char.class);
-        vec.addElement(boolean.class);
+    protected List<Class<?>> buildFromCharacterVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(String.class);
+        vec.add(Boolean.class);
+        vec.add(Character[].class);
+        vec.add(Character.class);
+        vec.add(char[].class);
+        vec.add(char.class);
+        vec.add(boolean.class);
         return vec;
     }
 
-    protected Vector buildFromByteArrayVec() {
-        Vector vec = new Vector();
-        vec.addElement(String.class);
-        vec.addElement(byte[].class);
-        vec.addElement(Byte[].class);
-        vec.addElement(Character[].class);
-        vec.addElement(char[].class);
+    protected List<Class<?>> buildFromByteArrayVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(String.class);
+        vec.add(byte[].class);
+        vec.add(Byte[].class);
+        vec.add(Character[].class);
+        vec.add(char[].class);
         return vec;
     }
 
-    protected Vector buildFromClobVec() {
-        Vector vec = new Vector();
-        vec.addElement(String.class);
-        vec.addElement(Character[].class);
-        vec.addElement(char[].class);
+    protected List<Class<?>> buildFromClobVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(String.class);
+        vec.add(Character[].class);
+        vec.add(char[].class);
         return vec;
     }
 
-    protected Vector buildFromBlobVec() {
-        Vector vec = new Vector();
-        vec.addElement(String.class);
-        vec.addElement(Byte[].class);
-        vec.addElement(byte[].class);
-        vec.addElement(Character[].class);
-        vec.addElement(char[].class);
+    protected List<Class<?>> buildFromBlobVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(String.class);
+        vec.add(Byte[].class);
+        vec.add(byte[].class);
+        vec.add(Character[].class);
+        vec.add(char[].class);
         return vec;
     }
 
-    protected Vector buildFromUtilDateVec() {
-        Vector vec = buildDateTimeVec();
-        vec.addElement(String.class);
-        vec.addElement(Long.class);
-        vec.addElement(java.sql.Date.class);
-        vec.addElement(Time.class);
-        vec.addElement(long.class);
-        vec.addElement(Character[].class);
-        vec.addElement(char[].class);
+    protected List<Class<?>> buildFromUtilDateVec() {
+        List<Class<?>> vec = buildDateTimeVec();
+        vec.add(String.class);
+        vec.add(Long.class);
+        vec.add(java.sql.Date.class);
+        vec.add(Time.class);
+        vec.add(long.class);
+        vec.add(Character[].class);
+        vec.add(char[].class);
         return vec;
     }
 
-    protected Vector buildFromTimestampVec() {
+    protected List<Class<?>>buildFromTimestampVec() {
         return buildFromUtilDateVec();
     }
 
-    protected Vector buildFromCalendarVec() {
+    protected List<Class<?>> buildFromCalendarVec() {
         return buildFromUtilDateVec();
     }
 
-    protected Vector buildFromDateVec() {
-        Vector vec = buildDateTimeVec();
-        vec.addElement(String.class);
-        vec.addElement(Long.class);
-        vec.addElement(java.sql.Date.class);
-        vec.addElement(long.class);
-        vec.addElement(Character[].class);
-        vec.addElement(char[].class);
+    protected List<Class<?>> buildFromDateVec() {
+        List<Class<?>> vec = buildDateTimeVec();
+        vec.add(String.class);
+        vec.add(Long.class);
+        vec.add(java.sql.Date.class);
+        vec.add(long.class);
+        vec.add(Character[].class);
+        vec.add(char[].class);
         return vec;
     }
 
-    protected Vector buildFromTimeVec() {
-        Vector vec = buildDateTimeVec();
-        vec.addElement(String.class);
-        vec.addElement(Long.class);
-        vec.addElement(Time.class);
-        vec.addElement(long.class);
-        vec.addElement(Character[].class);
-        vec.addElement(char[].class);
+    protected List<Class<?>> buildFromTimeVec() {
+        List<Class<?>> vec = buildDateTimeVec();
+        vec.add(String.class);
+        vec.add(Long.class);
+        vec.add(Time.class);
+        vec.add(long.class);
+        vec.add(Character[].class);
+        vec.add(char[].class);
         return vec;
     }
 
-    protected Vector buildFromByteObjectArraryVec() {
-        Vector vec = new Vector();
-        vec.addElement(Blob.class);
-        vec.addElement(byte[].class);
+    protected List<Class<?>> buildFromByteObjectArraryVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(Blob.class);
+        vec.add(byte[].class);
         return vec;
     }
 
-    protected Vector buildFromCharArrayVec() {
-        Vector vec = new Vector();
-        vec.addElement(Clob.class);
+    protected List<Class<?>> buildFromCharArrayVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(Clob.class);
         return vec;
     }
 
-    protected Vector buildFromCharacterArrayVec() {
-        Vector vec = new Vector();
-        vec.addElement(Clob.class);
+    protected List<Class<?>> buildFromCharacterArrayVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(Clob.class);
         return vec;
     }
 
@@ -1623,159 +1632,159 @@
         dataTypesConvertedToAClass.put(Blob.class, buildToBlobVec());
     }
 
-    protected Vector buildAllTypesToAClassVec() {
-        Vector vec = new Vector();
-        vec.addElement(String.class);
-        vec.addElement(Integer.class);
-        vec.addElement(java.util.Date.class);
-        vec.addElement(java.sql.Date.class);
-        vec.addElement(Time.class);
-        vec.addElement(Timestamp.class);
-        vec.addElement(Calendar.class);
-        vec.addElement(Character.class);
-        vec.addElement(Double.class);
-        vec.addElement(Float.class);
-        vec.addElement(Long.class);
-        vec.addElement(Short.class);
-        vec.addElement(Byte.class);
-        vec.addElement(BigInteger.class);
-        vec.addElement(BigDecimal.class);
-        vec.addElement(Number.class);
-        vec.addElement(Boolean.class);
-        vec.addElement(Character[].class);
-        vec.addElement(Blob.class);
-        vec.addElement(Clob.class);
+    protected List<Class<?>> buildAllTypesToAClassVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(String.class);
+        vec.add(Integer.class);
+        vec.add(java.util.Date.class);
+        vec.add(java.sql.Date.class);
+        vec.add(Time.class);
+        vec.add(Timestamp.class);
+        vec.add(Calendar.class);
+        vec.add(Character.class);
+        vec.add(Double.class);
+        vec.add(Float.class);
+        vec.add(Long.class);
+        vec.add(Short.class);
+        vec.add(Byte.class);
+        vec.add(BigInteger.class);
+        vec.add(BigDecimal.class);
+        vec.add(Number.class);
+        vec.add(Boolean.class);
+        vec.add(Character[].class);
+        vec.add(Blob.class);
+        vec.add(Clob.class);
         return vec;
     }
 
-    protected Vector buildToBigDecimalVec() {
-        Vector vec = buildNumberVec();
-        vec.addElement(String.class);
+    protected List<Class<?>> buildToBigDecimalVec() {
+        List<Class<?>> vec = buildNumberVec();
+        vec.add(String.class);
         return vec;
     }
 
-    protected Vector buildToBigIntegerVec() {
+    protected List<Class<?>> buildToBigIntegerVec() {
         return buildToBigDecimalVec();
     }
 
-    protected Vector buildToBooleanVec() {
-        Vector vec = buildToBigDecimalVec();
-        vec.addElement(Character.class);
-        vec.addElement(Boolean.class);
+    protected List<Class<?>> buildToBooleanVec() {
+        List<Class<?>> vec = buildToBigDecimalVec();
+        vec.add(Character.class);
+        vec.add(Boolean.class);
         return vec;
     }
 
-    protected Vector buildToByteVec() {
+    protected List<Class<?>> buildToByteVec() {
         return buildToBigDecimalVec();
     }
 
-    protected Vector buildToDoubleVec() {
+    protected List<Class<?>> buildToDoubleVec() {
         return buildToBigDecimalVec();
     }
 
-    protected Vector buildToFloatVec() {
+    protected List<Class<?>> buildToFloatVec() {
         return buildToBigDecimalVec();
     }
 
-    protected Vector buildToIntegerVec() {
-        Vector vec = buildToBigDecimalVec();
-        vec.addElement(Boolean.class);
+    protected List<Class<?>> buildToIntegerVec() {
+        List<Class<?>> vec = buildToBigDecimalVec();
+        vec.add(Boolean.class);
         return vec;
     }
 
-    protected Vector buildToLongVec() {
-        Vector vec = buildToIntegerVec();
-        vec.addElement(Calendar.class);
-        vec.addElement(java.util.Date.class);
+    protected List<Class<?>> buildToLongVec() {
+        List<Class<?>> vec = buildToIntegerVec();
+        vec.add(Calendar.class);
+        vec.add(java.util.Date.class);
         return vec;
     }
 
-    protected Vector buildToNumberVec() {
+    protected List<Class<?>> buildToNumberVec() {
         return buildToIntegerVec();
     }
 
-    protected Vector buildToShortVec() {
+    protected List<Class<?>> buildToShortVec() {
         return buildToIntegerVec();
     }
 
-    protected Vector buildToByteArrayVec() {
-        Vector vec = new Vector();
-        vec.addElement(String.class);
-        vec.addElement(Blob.class);
-        vec.addElement(byte[].class);
-        vec.addElement(Byte[].class);
+    protected List<Class<?>> buildToByteArrayVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(String.class);
+        vec.add(Blob.class);
+        vec.add(byte[].class);
+        vec.add(Byte[].class);
         return vec;
     }
 
-    protected Vector buildToByteObjectArrayVec() {
-        Vector vec = buildToByteArrayVec();
-        vec.addElement(Byte[].class);
+    protected List<Class<?>> buildToByteObjectArrayVec() {
+        List<Class<?>> vec = buildToByteArrayVec();
+        vec.add(Byte[].class);
         return vec;
     }
 
-    protected Vector buildToCharacterVec() {
-        Vector vec = buildToBigDecimalVec();
-        vec.addElement(Character.class);
+    protected List<Class<?>> buildToCharacterVec() {
+        List<Class<?>> vec = buildToBigDecimalVec();
+        vec.add(Character.class);
         return vec;
     }
 
-    protected Vector buildToCharacterArrayVec() {
+    protected List<Class<?>> buildToCharacterArrayVec() {
         return buildAllTypesToAClassVec();
     }
 
-    protected Vector buildToCharArrayVec() {
+    protected List<Class<?>> buildToCharArrayVec() {
         return buildAllTypesToAClassVec();
     }
 
-    protected Vector buildToStringVec() {
+    protected List<Class<?>> buildToStringVec() {
         return buildAllTypesToAClassVec();
     }
 
-    protected Vector buildToCalendarVec() {
-        Vector vec = buildDateTimeVec();
-        vec.addElement(String.class);
-        vec.addElement(Long.class);
-        vec.addElement(java.sql.Date.class);
-        vec.addElement(Time.class);
+    protected List<Class<?>> buildToCalendarVec() {
+        List<Class<?>> vec = buildDateTimeVec();
+        vec.add(String.class);
+        vec.add(Long.class);
+        vec.add(java.sql.Date.class);
+        vec.add(Time.class);
         return vec;
     }
 
-    protected Vector buildToTimestampVec() {
+    protected List<Class<?>> buildToTimestampVec() {
         return buildToCalendarVec();
     }
 
-    protected Vector buildToUtilDateVec() {
+    protected List<Class<?>> buildToUtilDateVec() {
         return buildToCalendarVec();
     }
 
-    protected Vector buildToDateVec() {
-        Vector vec = buildDateTimeVec();
-        vec.addElement(String.class);
-        vec.addElement(Long.class);
-        vec.addElement(java.sql.Date.class);
+    protected List<Class<?>> buildToDateVec() {
+        List<Class<?>> vec = buildDateTimeVec();
+        vec.add(String.class);
+        vec.add(Long.class);
+        vec.add(java.sql.Date.class);
         return vec;
     }
 
-    protected Vector buildToTimeVec() {
-        Vector vec = buildDateTimeVec();
-        vec.addElement(String.class);
-        vec.addElement(Long.class);
-        vec.addElement(Time.class);
+    protected List<Class<?>> buildToTimeVec() {
+        List<Class<?>> vec = buildDateTimeVec();
+        vec.add(String.class);
+        vec.add(Long.class);
+        vec.add(Time.class);
         return vec;
     }
 
-    protected Vector buildToBlobVec() {
-        Vector vec = new Vector();
-        vec.addElement(Byte[].class);
-        vec.addElement(byte[].class);
+    protected List<Class<?>> buildToBlobVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(Byte[].class);
+        vec.add(byte[].class);
         return vec;
     }
 
-    protected Vector buildToClobVec() {
-        Vector vec = new Vector();
-        vec.addElement(String.class);
-        vec.addElement(char[].class);
-        vec.addElement(Character[].class);
+    protected List<Class<?>> buildToClobVec() {
+        List<Class<?>> vec = new CopyOnWriteArrayList<>();
+        vec.add(String.class);
+        vec.add(char[].class);
+        vec.add(Character[].class);
         return vec;
     }
 }
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 4ac9f17..dbf0b92 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
@@ -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
@@ -200,7 +200,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        type = AccessController.doPrivileged(new PrivilegedClassForName(typeName, true, classLoader));
+                        type = AccessController.doPrivileged(new PrivilegedClassForName<>(typeName, true, classLoader));
                     } catch (PrivilegedActionException e) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(typeName, e.getException());
                     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DatabaseType.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DatabaseType.java
index c8a998b..f91f59a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DatabaseType.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DatabaseType.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
@@ -198,7 +198,7 @@
         public void buildOutputRow(PLSQLargument outArg, AbstractRecord outputRow,
                 DatabaseRecord newOutputRow, List<DatabaseField> outputRowFields, List outputRowValues) {
             DatabaseField field = null;
-            for (Iterator i = outputRowFields.iterator(); i.hasNext(); ) {
+            for (Iterator<DatabaseField> i = outputRowFields.iterator(); i.hasNext(); ) {
                 DatabaseField f = (DatabaseField)i.next();
                 if (f.getName().equals(outArg.name)) {
                     field = f;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/Helper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/Helper.java
index a0c526b..1644ad9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/Helper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/Helper.java
@@ -59,7 +59,6 @@
 
 import org.eclipse.persistence.config.SystemProperties;
 import org.eclipse.persistence.exceptions.ConversionException;
-import org.eclipse.persistence.exceptions.EclipseLinkException;
 import org.eclipse.persistence.exceptions.ValidationException;
 import org.eclipse.persistence.internal.core.helper.CoreHelper;
 import org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor;
@@ -385,13 +384,13 @@
      * (through interface or implementation inheritance).
      * @return boolean
      */
-    public static boolean classImplementsInterface(Class aClass, Class anInterface) {
+    public static <T> boolean classImplementsInterface(Class<T> aClass, Class<?> anInterface) {
         // quick check
         if (aClass == anInterface) {
             return true;
         }
 
-        Class[] interfaces = aClass.getInterfaces();
+        Class<?>[] interfaces = aClass.getInterfaces();
 
         // loop through the "directly declared" interfaces
         for (int i = 0; i < interfaces.length; i++) {
@@ -408,7 +407,7 @@
         }
 
         // finally, recurse up through the superclasses to Object
-        Class superClass = aClass.getSuperclass();
+        Class<? super T> superClass = aClass.getSuperclass();
         if (superClass == null) {
             return false;
         }
@@ -530,7 +529,7 @@
         try{
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    convertedClass = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                    convertedClass = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                 }
@@ -688,8 +687,8 @@
      * check for BigDecimals as well.
      */
     public static boolean comparePotentialArrays(Object firstValue, Object secondValue) {
-        Class firstClass = firstValue.getClass();
-        Class secondClass = secondValue.getClass();
+        Class<? extends Object> firstClass = firstValue.getClass();
+        Class<? extends Object> secondClass = secondValue.getClass();
 
         // Arrays must be checked for equality because default does identity
         if ((firstClass == ClassConstants.APBYTE) && (secondClass == ClassConstants.APBYTE)) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/IdentityWeakHashMap.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/IdentityWeakHashMap.java
index 0397b83..21bb5f4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/IdentityWeakHashMap.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/IdentityWeakHashMap.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
@@ -627,7 +627,7 @@
         }
 
         protected Object clone(ReferenceQueue refQueue) {
-            WeakEntry current = this;
+            WeakEntry<K, V> current = this;
             WeakEntry root = new WeakEntry(current.hash, current.key.get(), current.value.get(), null, refQueue);
             WeakEntry currentClone = root;
 
@@ -861,7 +861,7 @@
         s.writeInt(count);
         // Write out contents
         for (int i = entries.length - 1; i >= 0; i--) {
-            WeakEntry entry = entries[i];
+            WeakEntry<K, V> entry = entries[i];
             while (entry != null) {
                 s.writeObject(entry.key.get());
                 s.writeObject(entry.value.get());
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/LOBValueWriter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/LOBValueWriter.java
index 9c43ce8..5988521 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/LOBValueWriter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/LOBValueWriter.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
@@ -92,7 +92,7 @@
     * Fetch the locator(s) from the result set and write LOB value to the table
     */
     public void fetchLocatorAndWriteValue(DatabaseCall dbCall, Object resultSet) throws SQLException {
-        Enumeration enumFields = dbCall.getContexts().getFields().elements();
+        Enumeration<DatabaseField> enumFields = dbCall.getContexts().getFields().elements();
         Enumeration enumValues = dbCall.getContexts().getValues().elements();
         AbstractSession executionSession = dbCall.getQuery().getSession().getExecutionSession(dbCall.getQuery());
         while (enumFields.hasMoreElements()) {
@@ -109,7 +109,7 @@
     */
     private SQLSelectStatement buildSelectStatementForLocator(WriteObjectQuery writeQuery, DatabaseCall call, AbstractSession session) {
         SQLSelectStatement selectStatement = new SQLSelectStatement();
-        Vector tables = writeQuery.getDescriptor().getTables();
+        Vector<DatabaseTable> tables = writeQuery.getDescriptor().getTables();
         selectStatement.setTables(tables);
         //rather than get ALL fields from the descriptor, only use the LOB-related fields to build the minimal SELECT statement.
         selectStatement.setFields(call.getContexts().getFields());
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java
index 669b814..9941f68 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/WriteLockManager.java
@@ -1,6 +1,6 @@
 /*
  * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 1998, 2020 IBM Corporation. All rights reserved.
+ * Copyright (c) 1998, 2021 IBM Corporation. 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
@@ -278,8 +278,8 @@
         if (descriptor.shouldAcquireCascadedLocks()) {
             FetchGroupManager fetchGroupManager = descriptor.getFetchGroupManager();
             boolean isPartialObject = (fetchGroupManager != null) && fetchGroupManager.isPartialObject(objectForClone);
-            for (Iterator mappings = descriptor.getLockableMappings().iterator();
-                     mappings.hasNext();) {
+            for (Iterator<DatabaseMapping> mappings = descriptor.getLockableMappings().iterator();
+                 mappings.hasNext();) {
                 DatabaseMapping mapping = (DatabaseMapping)mappings.next();
                 // Only cascade fetched mappings.
                 if (!isPartialObject || (fetchGroupManager.isAttributeFetched(objectForClone, mapping.getAttributeName()))) {
@@ -594,8 +594,8 @@
         if (!MergeManager.LOCK_ON_MERGE) {//lockOnMerge is a backdoor and not public
             return;
         }
-        List acquiredLocks = mergeManager.getAcquiredLocks();
-        Iterator locks = acquiredLocks.iterator();
+        List<CacheKey> acquiredLocks = mergeManager.getAcquiredLocks();
+        Iterator<CacheKey> locks = acquiredLocks.iterator();
         RuntimeException exception = null;
         while (locks.hasNext()) {
             try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/AbstractIdentityMap.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/AbstractIdentityMap.java
index 6c5ac35..d6bd8af 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/AbstractIdentityMap.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/AbstractIdentityMap.java
@@ -354,7 +354,7 @@
     /**
      * Returns the class which should be used as an identity map in a descriptor by default.
      */
-    public static Class getDefaultIdentityMapClass() {
+    public static Class<? extends IdentityMap> getDefaultIdentityMapClass() {
         return ClassConstants.SoftCacheWeakIdentityMap_Class;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/CacheId.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/CacheId.java
index 5d38ef5..4b9c271 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/CacheId.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/CacheId.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
@@ -167,9 +167,9 @@
                     return false;
                 }
                 if (this.hasArray) {
-                    Class valueClass = value.getClass();
+                    Class<?> valueClass = value.getClass();
                     if (valueClass.isArray()) {
-                        Class otherClass = otherValue.getClass();
+                        Class<?> otherClass = otherValue.getClass();
                         //gf bug 1193: fix array comparison logic to exit if they don't match, and continue the loop if they do
                         if (((valueClass == ClassConstants.APBYTE) && (otherClass == ClassConstants.APBYTE)) ) {
                             if (!Helper.compareByteArrays((byte[])value, (byte[])otherValue)){
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/CacheIdComparator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/CacheIdComparator.java
index d29a12f..51eb63b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/CacheIdComparator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/CacheIdComparator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2019, 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
@@ -45,9 +45,9 @@
                     return 1;
                 }
 
-                Class value1Class = value1.getClass();
+                Class<?> value1Class = value1.getClass();
                 if (value1Class.isArray()) {
-                    Class value2Class = value2.getClass();
+                    Class<?> value2Class = value2.getClass();
                     if (value1Class == ClassConstants.APBYTE && value2Class == ClassConstants.APBYTE) {
                         int result = compareByteArrays((byte[])value1, (byte[])value2);
                         if (result != 0) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/FullIdentityMap.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/FullIdentityMap.java
index d953b12..3df359c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/FullIdentityMap.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/FullIdentityMap.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
@@ -58,7 +58,7 @@
         FullIdentityMap clone = (FullIdentityMap)super.clone();
         clone.setCacheKeys(new ConcurrentHashMap(this.cacheKeys.size()));
 
-        for (Iterator cacheKeysIterator = this.cacheKeys.values().iterator(); cacheKeysIterator.hasNext();) {
+        for (Iterator<CacheKey> cacheKeysIterator = this.cacheKeys.values().iterator(); cacheKeysIterator.hasNext();) {
             CacheKey key = (CacheKey)((CacheKey)cacheKeysIterator.next()).clone();
             clone.getCacheKeys().put(key.getKey(), key);
         }
@@ -72,7 +72,7 @@
      */
     @Override
     public void collectLocks(HashMap threadList) {
-        Iterator cacheKeyIterator = this.cacheKeys.values().iterator();
+        Iterator<CacheKey> cacheKeyIterator = this.cacheKeys.values().iterator();
         while (cacheKeyIterator.hasNext()) {
             CacheKey cacheKey = (CacheKey)cacheKeyIterator.next();
             if (cacheKey.isAcquired()) {
@@ -140,7 +140,7 @@
     @Override
     public int getSize(Class myClass, boolean recurse) {
         int count = 0;
-        Iterator keys = this.cacheKeys.values().iterator();
+        Iterator<CacheKey> keys = this.cacheKeys.values().iterator();
 
         while (keys.hasNext()) {
             CacheKey key = (CacheKey)keys.next();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/IdentityMapManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/IdentityMapManager.java
index adcf2e3..97ee793 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/IdentityMapManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/IdentityMapManager.java
@@ -67,6 +67,7 @@
 import org.eclipse.persistence.queries.ReadQuery;
 import org.eclipse.persistence.sessions.Record;
 import org.eclipse.persistence.sessions.SessionProfiler;
+import org.eclipse.persistence.sessions.interceptors.CacheInterceptor;
 
 /**
  * <p><b>Purpose</b>: Maintain identity maps for domain classes mapped with EclipseLink.
@@ -375,7 +376,7 @@
      * INTERNAL:
      * Return a new empty identity map of the class type.
      */
-    protected IdentityMap buildNewIdentityMap(Class identityMapClass, int size, ClassDescriptor descriptor, boolean isIsolated) throws DescriptorException {
+    protected <T extends IdentityMap> IdentityMap buildNewIdentityMap(Class<T> identityMapClass, int size, ClassDescriptor descriptor, boolean isIsolated) throws DescriptorException {
         if ((descriptor == null) || (descriptor.getCachePolicy().getCacheInterceptorClass() == null)) {
             // PERF: Avoid reflection.
             if (identityMapClass == ClassConstants.SoftCacheWeakIdentityMap_Class) {
@@ -396,21 +397,21 @@
             Class[] parameters = new Class[]{ClassConstants.PINT, ClassDescriptor.class, AbstractSession.class, boolean.class};
             Object[] values = new Object[]{size, descriptor, this.session, isIsolated};
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                Constructor constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(identityMapClass, parameters, false));
-                IdentityMap map = (IdentityMap)AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, values));
+                Constructor<T> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(identityMapClass, parameters, false));
+                IdentityMap map = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(constructor, values));
                 if ((descriptor != null) && (descriptor.getCachePolicy().getCacheInterceptorClass() != null)) {
-                    constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(descriptor.getCacheInterceptorClass(), new Class[] { IdentityMap.class, AbstractSession.class }, false));
+                    Constructor<? extends CacheInterceptor> interceptor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(descriptor.getCacheInterceptorClass(), new Class[] { IdentityMap.class, AbstractSession.class }, false));
                     Object params[] = new Object[]{map, this.session};
-                    map = (IdentityMap)AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, params));
+                    map = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(interceptor, params));
                 }
                 return map;
             } else {
-                Constructor constructor = PrivilegedAccessHelper.getConstructorFor(identityMapClass, parameters, false);
-                IdentityMap map = (IdentityMap)PrivilegedAccessHelper.invokeConstructor(constructor, values);
+                Constructor<T> constructor = PrivilegedAccessHelper.<T>getConstructorFor(identityMapClass, parameters, false);
+                IdentityMap map = PrivilegedAccessHelper.<T>invokeConstructor(constructor, values);
                 if ((descriptor != null) && (descriptor.getCacheInterceptorClass() != null)) {
-                    constructor = PrivilegedAccessHelper.getConstructorFor(descriptor.getCacheInterceptorClass(), new Class[] { IdentityMap.class, AbstractSession.class }, false);
+                    Constructor<? extends CacheInterceptor> interceptor = PrivilegedAccessHelper.getConstructorFor(descriptor.getCacheInterceptorClass(), new Class[] { IdentityMap.class, AbstractSession.class }, false);
                     Object params[] = new Object[]{map, this.session};
-                    map = (IdentityMap)PrivilegedAccessHelper.invokeConstructor(constructor, params);
+                    map = PrivilegedAccessHelper.invokeConstructor(interceptor, params);
                 }
                 return map;
             }
@@ -437,7 +438,7 @@
         try {
             manager = (IdentityMapManager)super.clone();
             manager.setIdentityMaps(new ConcurrentHashMap());
-            for (Iterator iterator = this.identityMaps.entrySet().iterator(); iterator.hasNext();) {
+            for (Iterator<Map.Entry<Class, IdentityMap>> iterator = this.identityMaps.entrySet().iterator(); iterator.hasNext();) {
                 Map.Entry entry = (Map.Entry)iterator.next();
                 manager.identityMaps.put((Class)entry.getKey(), (IdentityMap)((IdentityMap)entry.getValue()).clone());
             }
@@ -546,7 +547,7 @@
 
             // Bug #522635 - if policy is set to trigger indirection, then iterate over a copy of the cache keys collection
             //               to avoid a ConcurrentModificationException
-            final Enumeration cacheEnum = valueHolderPolicy == InMemoryQueryIndirectionPolicy.SHOULD_TRIGGER_INDIRECTION ? map.cloneKeys() : map.keys();
+            final Enumeration<CacheKey> cacheEnum = valueHolderPolicy == InMemoryQueryIndirectionPolicy.SHOULD_TRIGGER_INDIRECTION ? map.cloneKeys() : map.keys();
 
             // bug 327900 - If don't read subclasses is set on the descriptor heed it.
             boolean readSubclassesOrNoInheritance = (!descriptor.hasInheritance() || descriptor.getInheritancePolicy().shouldReadSubclasses());
@@ -647,7 +648,7 @@
                 // cache the current time to avoid calculating it every time through the loop
                 long currentTimeInMillis = System.currentTimeMillis();
                 //Enumeration doesn't checkReadLocks
-                for (Enumeration cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
+                for (Enumeration<CacheKey> cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
                     CacheKey key = (CacheKey)cacheEnum.nextElement();
                     Object object = key.getObject();
                     if (object == null || cacheInvalidationPolicy.isInvalidated(key, currentTimeInMillis)) {
@@ -685,7 +686,7 @@
                 // selectionCriteria == null
                 if(isChildDescriptor) {
                     // Must check for inheritance.
-                    for (Enumeration cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
+                    for (Enumeration<CacheKey> cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
                         CacheKey key = (CacheKey)cacheEnum.nextElement();
                         Object object = key.getObject();
                         if (object == null) {
@@ -698,7 +699,7 @@
                     }
                 } else {
                     // if it's either a root class or there is no inheritance just invalidate the whole identity map
-                    for (Enumeration cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
+                    for (Enumeration<CacheKey> cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
                         CacheKey key = (CacheKey)cacheEnum.nextElement();
                         key.setInvalidationState(CacheKey.CACHE_KEY_INVALID);
                     }
@@ -776,7 +777,7 @@
      * This method is used to get a list of those classes with IdentityMaps in the Session.
      */
     public Vector getClassesRegistered() {
-        Iterator classes = getIdentityMaps().keySet().iterator();
+        Iterator<Class> classes = getIdentityMaps().keySet().iterator();
         Vector results = new Vector(getIdentityMaps().size());
         while (classes.hasNext()) {
             results.add(((Class)classes.next()).getName());
@@ -861,7 +862,7 @@
 
             // Bug #321041 - if policy is set to trigger indirection, then iterate over a copy of the cache keys collection
             //               to avoid a ConcurrentModificationException
-            Enumeration cacheEnum = valueHolderPolicy == InMemoryQueryIndirectionPolicy.SHOULD_TRIGGER_INDIRECTION ? map.cloneKeys() : map.keys();
+            Enumeration<CacheKey> cacheEnum = valueHolderPolicy == InMemoryQueryIndirectionPolicy.SHOULD_TRIGGER_INDIRECTION ? map.cloneKeys() : map.keys();
 
             // cache the current time to avoid calculating it every time through the loop
             long currentTimeInMillis = System.currentTimeMillis();
@@ -1233,7 +1234,7 @@
             }
         }
 
-        for (Enumeration enumtr = map.keys(); enumtr.hasMoreElements();) {
+        for (Enumeration<CacheKey> enumtr = map.keys(); enumtr.hasMoreElements();) {
             org.eclipse.persistence.internal.identitymaps.CacheKey cacheKey = (org.eclipse.persistence.internal.identitymaps.CacheKey)enumtr.nextElement();
             Object object = cacheKey.getObject();
             if (businessClass.isInstance(object)) {
@@ -1246,7 +1247,7 @@
                     if (descriptor.usesOptimisticLocking() && descriptor.usesVersionLocking()) {
                         // Obtain writeLockValue and convert the value to String
                         Object writeLockValue = descriptor.getOptimisticLockingPolicy().getWriteLockValue(object, key, session);
-                        String version = (String) session.getPlatform().convertObject(writeLockValue, String.class);
+                        String version = session.getPlatform().convertObject(writeLockValue, String.class);
                         writer.write(LoggingLocalization.buildMessage("key_version_identity_hash_code_object", new Object[] { cr, key, "\t", hashCode, object, version }));
                     } else {
                         writer.write(LoggingLocalization.buildMessage("key_identity_hash_code_object", new Object[] { cr, key, "\t", hashCode, object }));
@@ -1263,8 +1264,8 @@
      * The output of this method will be logged to this session's SessionLog at SEVERE level.
      */
     public void printIdentityMaps() {
-        for (Iterator iterator = this.session.getDescriptors().keySet().iterator();
-                 iterator.hasNext();) {
+        for (Iterator<Class<?>> iterator = this.session.getDescriptors().keySet().iterator();
+             iterator.hasNext();) {
             Class businessClass = (Class)iterator.next();
             ClassDescriptor descriptor = this.session.getDescriptor(businessClass);
             if (descriptor.hasInheritance()) {
@@ -1285,7 +1286,7 @@
         StringWriter writer = new StringWriter();
         HashMap threadCollection = new HashMap();
         writer.write(TraceLocalization.buildMessage("lock_writer_header", null) + Helper.cr());
-        Iterator idenityMapsIterator = this.session.getIdentityMapAccessorInstance().getIdentityMapManager().getIdentityMaps().values().iterator();
+        Iterator<IdentityMap> idenityMapsIterator = this.session.getIdentityMapAccessorInstance().getIdentityMapManager().getIdentityMaps().values().iterator();
         while (idenityMapsIterator.hasNext()) {
             IdentityMap idenityMap = (IdentityMap)idenityMapsIterator.next();
             idenityMap.collectLocks(threadCollection);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/WeakIdentityMap.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/WeakIdentityMap.java
index 7197e3d..8c26a70 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/WeakIdentityMap.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/identitymaps/WeakIdentityMap.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
@@ -51,7 +51,7 @@
      * the total time still constant.
      */
     protected void cleanupDeadCacheKeys() {
-        for (Iterator iterator = getCacheKeys().values().iterator(); iterator.hasNext();) {
+        for (Iterator<CacheKey> iterator = getCacheKeys().values().iterator(); iterator.hasNext();) {
             CacheKey key = (CacheKey)iterator.next();
             if (key.getObject() == null) {
                 // Check lock first.
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 c7e6fa9..760d106 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
@@ -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
@@ -64,7 +64,7 @@
     public Object getValue(UnitOfWorkImpl uow) {
         if (this.references != null && this.references.length != 0){
             if (mapping.isCollectionMapping()){
-                Collection result = uow.getIdentityMapAccessorInstance().getAllFromIdentityMapWithEntityPK(this.references, this.mapping.getReferenceDescriptor()).values();
+                Collection<Object> result = uow.getIdentityMapAccessorInstance().getAllFromIdentityMapWithEntityPK(this.references, this.mapping.getReferenceDescriptor()).values();
                 if (result.size() == references.length){
                     ContainerPolicy cp = mapping.getContainerPolicy();
                     Object container = cp.containerInstance(result.size());
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 c70645f..9832c0a 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
@@ -175,7 +175,7 @@
     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());
@@ -227,7 +227,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try{
-                    this.containerConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(getContainerClass(), new Class[] { ClassConstants.ValueHolderInterface_Class }, false));
+                    this.containerConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<Class<?>>(getContainerClass(), new Class[] { ClassConstants.ValueHolderInterface_Class }, false));
                 }catch (PrivilegedActionException ex){
                     if (ex.getCause() instanceof NoSuchMethodException){
                         throw (NoSuchMethodException) ex.getCause();
@@ -245,7 +245,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try{
-                    this.containerConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(getContainerClass(), new Class[0], false));
+                    this.containerConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<Class<?>>(getContainerClass(), new Class[0], false));
                 }catch (PrivilegedActionException ex){
                     if (ex.getCause() instanceof NoSuchMethodException){
                         throw (NoSuchMethodException) ex.getCause();
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 db6f148..52a345f 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
@@ -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
@@ -82,10 +82,10 @@
                         result = "null";
                     } else {
                         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                            String toString = (String)AccessController.doPrivileged(new PrivilegedMethodInvoker(m, valueHolder.getValue(), args));
+                            String toString = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(m, valueHolder.getValue(), args));
                             result = "{ " + toString + " }";
                         }else{
-                            String toString = (String)PrivilegedAccessHelper.invokeMethod(m, valueHolder.getValue(), args);
+                            String toString = PrivilegedAccessHelper.invokeMethod(m, valueHolder.getValue(), args);
                             result = "{ " + toString + " }";
                         }
                     }
@@ -102,7 +102,7 @@
                     throw ValidationException.nullUnderlyingValueHolderValue(m.getName());
                 } else {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                        result = AccessController.doPrivileged(new PrivilegedMethodInvoker(m, value, args));
+                        result = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(m, value, args));
                     }else{
                         result = PrivilegedAccessHelper.invokeMethod(m, value, args);
                     }
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 0ff6a5e..19baa81 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
@@ -181,7 +181,7 @@
     public boolean objectIsInstantiated(Object object) {
         if (object instanceof Proxy) {
             ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(object);
-            ValueHolderInterface valueHolder = handler.getValueHolder();
+            ValueHolderInterface<?> valueHolder = handler.getValueHolder();
             return valueHolder.isInstantiated();
         } else {
             return true;
@@ -196,7 +196,7 @@
     public boolean objectIsEasilyInstantiated(Object object) {
         if (object instanceof Proxy) {
             ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(object);
-            ValueHolderInterface valueHolder = handler.getValueHolder();
+            ValueHolderInterface<?> valueHolder = handler.getValueHolder();
             if (valueHolder instanceof DatabaseValueHolder) {
                 return ((DatabaseValueHolder)valueHolder).isEasilyInstantiated();
             }
@@ -233,7 +233,7 @@
     public Object getRealAttributeValueFromObject(Object obj, Object object) {
         if (object instanceof Proxy) {
             ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(object);
-            ValueHolderInterface valueHolder = handler.getValueHolder();
+            ValueHolderInterface<?> valueHolder = handler.getValueHolder();
             return valueHolder.getValue();
         } else {
             return object;
@@ -267,7 +267,7 @@
     @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());
@@ -300,7 +300,7 @@
         }
 
         ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(referenceObject);
-        ValueHolderInterface valueHolder = handler.getValueHolder();
+        ValueHolderInterface<?> valueHolder = handler.getValueHolder();
 
         if (valueHolder.isInstantiated()) {
             return null;
@@ -325,7 +325,7 @@
 
         ValueHolderInterface newValueHolder;
         ProxyIndirectionHandler handler = (ProxyIndirectionHandler)Proxy.getInvocationHandler(attributeValue);
-        ValueHolderInterface oldValueHolder = handler.getValueHolder();
+        ValueHolderInterface<?> 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.
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 8276453..179aa2f 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
@@ -359,7 +359,7 @@
         }
         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());
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/ExpressionBuilderVisitor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/ExpressionBuilderVisitor.java
index ca440b5..82adb6c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/ExpressionBuilderVisitor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/ExpressionBuilderVisitor.java
@@ -1449,7 +1449,7 @@
             text = text.substring(0, text.length() - 1);
         }
 
-        Number number = queryContext.newInstance(type[0], String.class, text);
+        Number number = queryContext.newInstance((Class<? extends Number>) type[0], String.class, text);
 
         // Now create the numeric expression
         queryExpression = new ConstantExpression(number, queryContext.getBaseExpression());
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/JPQLQueryContext.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/JPQLQueryContext.java
index 50a9a64..15fc951 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/JPQLQueryContext.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/JPQLQueryContext.java
@@ -294,15 +294,14 @@
      * @param typeName The fully qualified type name
      * @return The Java type if it could be retrieved; <code>null</code> otherwise
      */
-    @SuppressWarnings("unchecked")
-    private Class<?> attemptLoadType(String typeName) {
+    private <T> Class<T> attemptLoadType(String typeName) {
 
         try {
 
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
                     return AccessController.doPrivileged(
-                        new PrivilegedClassForName(typeName, true, getClassLoader())
+                        new PrivilegedClassForName<>(typeName, true, getClassLoader())
                     );
                 }
                 catch (PrivilegedActionException exception) {
@@ -522,14 +521,12 @@
      * @return The {@link Constructor} or <code>null</code> if none exist or the privilege access
      * was denied
      */
-    @SuppressWarnings("unchecked")
-    <T> Constructor<T> getConstructor(Class<?> type, Class<?>[] parameterTypes) {
-
+    <T> Constructor<T> getConstructor(Class<T> type, Class<?>[] parameterTypes) {
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
                     return AccessController.doPrivileged(
-                        new PrivilegedGetConstructorFor(type, parameterTypes, true)
+                        new PrivilegedGetConstructorFor<>(type, parameterTypes, true)
                     );
                 }
                 catch (PrivilegedActionException exception) {
@@ -1004,8 +1001,7 @@
      * @param parameter The object to pass during instantiation
      * @return A new instance or <code>null</code> if a problem was encountered during instantiation
      */
-    @SuppressWarnings("unchecked")
-    <T> T newInstance(Class<?> type, Class<?> parameterType, Object parameter) {
+    <T> T newInstance(Class<T> type, Class<?> parameterType, Object parameter) {
         return newInstance(type, new Class[] { parameterType }, new Object[] { parameter });
     }
 
@@ -1018,7 +1014,7 @@
      * @return A new instance of the given type or <code>null</code> if a problem was encountered
      * during instantiation
      */
-    <T> T newInstance(Class<?> type, Class<?>[] parameterTypes, Object[] parameters) {
+    <T> T newInstance(Class<T> type, Class<?>[] parameterTypes, Object[] parameters) {
 
         Constructor<T> constructor = getConstructor(type, parameterTypes);
 
@@ -1036,15 +1032,14 @@
      * @param parameters The objects to pass during instantiation
      * @return A new instance or <code>null</code> if a problem was encountered during instantiation
      */
-    @SuppressWarnings("unchecked")
     <T> T newInstance(Constructor<T> constructor, Object[] parameters) {
 
         try {
 
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
-                    return (T) AccessController.doPrivileged(
-                        new PrivilegedInvokeConstructor(constructor, parameters)
+                    return AccessController.doPrivileged(
+                        new PrivilegedInvokeConstructor<>(constructor, parameters)
                     );
                 }
                 catch (PrivilegedActionException exception) {
@@ -1052,15 +1047,9 @@
                 }
             }
 
-            return (T) PrivilegedAccessHelper.invokeConstructor(constructor, parameters);
+            return PrivilegedAccessHelper.invokeConstructor(constructor, parameters);
         }
-        catch (InstantiationException e) {
-            return null;
-        }
-        catch (InvocationTargetException e) {
-            return null;
-        }
-        catch (IllegalAccessException e) {
+        catch (ReflectiveOperationException e) {
             return null;
         }
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ExistsNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ExistsNode.java
index d200875..ebf1dd9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ExistsNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ExistsNode.java
@@ -73,8 +73,8 @@
         // select clause expressions as non fetch join attributes to the
         // ReportQuery representing the subquery. This make sure the FK joins
         // get generated.
-        List items = reportQuery.getItems();
-        for (Iterator i = items.iterator(); i.hasNext();) {
+        List<ReportItem> items = reportQuery.getItems();
+        for (Iterator<ReportItem> i = items.iterator(); i.hasNext();) {
             ReportItem item = (ReportItem)i.next();
             Expression expr = item.getAttributeExpression();
             reportQuery.addNonFetchJoinedAttribute(expr);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelperImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelperImpl.java
index 357419e..b0fe3ec 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelperImpl.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelperImpl.java
@@ -60,7 +60,7 @@
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
                     return AccessController.doPrivileged(
-                        new PrivilegedClassForName(typeName, true, classLoader));
+                        new PrivilegedClassForName<>(typeName, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     return null;
                 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/Constants.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/Constants.java
index cc616fc..bd2841e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/Constants.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/Constants.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2012, 2018 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -22,6 +22,7 @@
 import javax.xml.namespace.QName;
 
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
+import org.xml.sax.Locator;
 
 public class Constants {
 
@@ -40,10 +41,10 @@
     public static final String JAXB_FRAGMENT = "jaxb.fragment";
     public static final String JAXB_MARSHALLER = "jaxb.marshaller";
     public static final String LEXICAL_HANDLER_PROPERTY = "http://xml.org/sax/properties/lexical-handler";
-    public static final Class LOCATOR_CLASS = org.xml.sax.Locator.class;
+    public static final Class<Locator> LOCATOR_CLASS = org.xml.sax.Locator.class;
     public static final String LOCATOR_CLASS_NAME = "org.xml.sax.Locator";
     public static final String NO_NS_SCHEMA_LOCATION = "noNamespaceSchemaLocation";
-    public static final Class QNAME_CLASS = QName.class;
+    public static final Class<QName> QNAME_CLASS = QName.class;
     public static final String REF_PREFIX = "ref";
     public static final String REF_URL = "http://ws-i.org/profiles/basic/1.1/xsd";
     public static final String SCHEMA_LOCATION = "schemaLocation";
@@ -54,8 +55,8 @@
     public static final String SWAREF_XSD = "http://ws-i.org/profiles/basic/1.1/swaref.xsd";
     public static final String TEXT = "text()";
     public static final String UNKNOWN_OR_TRANSIENT_CLASS = "UNKNOWN_OR_TRANSIENT_CLASS";
-    public static final Class URI = java.net.URI.class;
-    public static final Class UUID = java.util.UUID.class;
+    public static final Class<java.net.URI> URI = java.net.URI.class;
+    public static final Class<java.util.UUID> UUID = java.util.UUID.class;
     public static final String VALUE_WRAPPER = "value";
     public static final String XML_MIME_URL = "http://www.w3.org/2005/05/xmlmime";
     public static final String XML_NAMESPACE_SCHEMA_LOCATION = "http://www.w3.org/XML/2001/xml.xsd";
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/ConversionManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/ConversionManager.java
index 4e95e99..0cded7d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/ConversionManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/ConversionManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -42,7 +42,7 @@
      * @param schemaTypeQName - the XML schema that the object is being converted from
      * @return - the newly converted object
      */
-    Object convertObject(Object sourceObject, Class javaClass, QName schemaTypeQName);
+    <T> T convertObject(Object sourceObject, Class<T> javaClass, QName schemaTypeQName);
 
     /**
      * @since EclipseLink 2.6.0
@@ -61,7 +61,7 @@
      * @param schemaType The type you want to find a corresponding Java class for.
      * @return the Java class for the XML schema type.
      */
-    Class<?> javaType(QName schemaType);
+    <T> Class<T> javaType(QName schemaType);
 
     /**
      * Replaces any CR, Tab or LF characters in the string with a single ' ' character.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolver.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolver.java
index a5cec5d..a4648d6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolver.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolver.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
@@ -59,7 +59,7 @@
  */
 public class NamespaceResolver implements XMLNamespaceResolver {
     private static final String BASE_PREFIX = "ns";
-    private static final Vector EMPTY_VECTOR = VectorUtils.emptyVector();
+    private static final Vector<Namespace> EMPTY_VECTOR = VectorUtils.emptyVector();
 
     private String defaultNamespaceURI;
     private NamespaceResolverStorage prefixesToNamespaces;
@@ -275,7 +275,7 @@
      * Used for deployment XML
      * @param names A Vector of namespace URIs
      */
-    public void setNamespaces(Vector names) {
+    public void setNamespaces(Vector<Namespace> names) {
         prefixesToNamespaces = new NamespaceResolverStorage(names.size());
         prefixesToNamespaces.setNamespaces(names);
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolverStorage.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolverStorage.java
index 3321005..4be31b2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolverStorage.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolverStorage.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -25,7 +25,7 @@
 
 public class NamespaceResolverStorage extends LinkedHashMap<String, String> {
     private static final long serialVersionUID = -4697397620139076774L;
-    private transient Vector namespaces = emptyVector();
+    private transient Vector<Namespace> namespaces = emptyVector();
     private transient boolean modified = false;
 
     public NamespaceResolverStorage() {
@@ -94,7 +94,7 @@
         return response;
     }
 
-    public Vector getNamespaces() {
+    public Vector<Namespace> getNamespaces() {
         if (isModified()) {
             namespaces = buildNamespacesUnmodifiable();
             setModified(false);
@@ -102,7 +102,7 @@
         return namespaces;
     }
 
-    public void setNamespaces(Vector namespaces) {
+    public void setNamespaces(Vector<Namespace> namespaces) {
         super.clear();
         for (Namespace namespace : (Vector<Namespace>) namespaces) {
             if ((namespace.getPrefix() != null) && (namespace.getNamespaceURI() != null)) {
@@ -120,8 +120,8 @@
         this.modified = modified;
     }
 
-    private Vector buildNamespacesUnmodifiable() {
-        Vector names = new Vector(size());
+    private Vector<Namespace> buildNamespacesUnmodifiable() {
+        Vector<Namespace> names = new Vector<>(size());
         for (Map.Entry<String, String> entry : entrySet()) {
             Namespace namespace = new Namespace(entry.getKey(), entry.getValue());
             names.addElement(namespace);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/TreeObjectBuilder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/TreeObjectBuilder.java
index 180bfb0..9fc08f6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/TreeObjectBuilder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/TreeObjectBuilder.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
@@ -31,6 +31,8 @@
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.DatabaseMapping.WriteType;
+import org.eclipse.persistence.oxm.NamespaceResolver;
+import org.eclipse.persistence.oxm.XMLDescriptor;
 import org.eclipse.persistence.oxm.XMLField;
 import org.eclipse.persistence.oxm.record.NodeRecord;
 import org.eclipse.persistence.oxm.record.UnmarshalRecord;
@@ -100,14 +102,14 @@
     @Override
     public void initialize(org.eclipse.persistence.internal.sessions.AbstractSession session) {
         super.initialize(session);
-        Descriptor xmlDescriptor = (Descriptor)getDescriptor();
+        XMLDescriptor xmlDescriptor = (XMLDescriptor)getDescriptor();
 
         // INHERITANCE
         if (xmlDescriptor.hasInheritance()) {
-            CoreInheritancePolicy inheritancePolicy = xmlDescriptor.getInheritancePolicy();
+            CoreInheritancePolicy<AbstractRecord, AbstractSession, ClassDescriptor, DatabaseField> inheritancePolicy = xmlDescriptor.getInheritancePolicy();
 
             if (!inheritancePolicy.hasClassExtractor()) {
-                Field classIndicatorField = new XMLField(inheritancePolicy.getClassIndicatorFieldName());
+                Field<XMLConversionManager, NamespaceResolver> classIndicatorField = new XMLField(inheritancePolicy.getClassIndicatorFieldName());
                 classIndicatorField.setNamespaceResolver(xmlDescriptor.getNamespaceResolver());
             }
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataCollectionMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataCollectionMappingNodeValue.java
index 2124d7f..5b931b8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataCollectionMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataCollectionMappingNodeValue.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
@@ -64,7 +64,7 @@
     }
 
     protected String getValueToWrite(QName schemaType, Object value, CoreAbstractSession session) {
-        return (String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
+        return ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
     }
 
     @Override
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataHelper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataHelper.java
index 3cbd488..ecfa002 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataHelper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataHelper.java
@@ -191,7 +191,7 @@
         }
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         try {
-            Iterator itr = ImageIO.getImageWritersByMIMEType(mimeType);
+            Iterator<ImageWriter> itr = ImageIO.getImageWritersByMIMEType(mimeType);
             if (itr.hasNext()) {
                 ImageWriter w = (ImageWriter) itr.next();
                 w.setOutput(ImageIO.createImageOutputStream(outputStream));
@@ -311,7 +311,7 @@
         ByteArrayOutputStream output = new ByteArrayOutputStream();
         try {
             source.writeTo(output);
-            return (String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(output.toByteArray(), String.class, schemaTypeQName);
+            return ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(output.toByteArray(), String.class, schemaTypeQName);
         } catch (Exception ex) {
             throw ConversionException.couldNotBeConverted(source, CoreClassConstants.STRING, ex);
         }
@@ -325,7 +325,7 @@
         ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         try {
             String mimeType = "image/png";
-            Iterator itr = ImageIO.getImageWritersByMIMEType(mimeType);
+            Iterator<ImageWriter> itr = ImageIO.getImageWritersByMIMEType(mimeType);
             if (itr.hasNext()) {
                 ImageWriter w = (ImageWriter) itr.next();
                 w.setOutput(ImageIO.createImageOutputStream(outputStream));
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataMappingNodeValue.java
index 28caab5..a40263d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLBinaryDataMappingNodeValue.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
@@ -44,7 +44,7 @@
     private BinaryDataMapping xmlBinaryDataMapping;
 
     protected String getValueToWrite(QName schemaType, Object value, CoreAbstractSession session) {
-        return (String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
+        return ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
     }
 
     @Override
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLChoiceCollectionMappingMarshalNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLChoiceCollectionMappingMarshalNodeValue.java
index c884e90..8c0a46f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLChoiceCollectionMappingMarshalNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLChoiceCollectionMappingMarshalNodeValue.java
@@ -112,7 +112,7 @@
 
         }
 
-        Collection classes = this.classToNodeValues.keySet();
+        Collection<Class> classes = this.classToNodeValues.keySet();
         for(Class nextClass:((Map<Class, Mapping>)this.xmlChoiceCollectionMapping.getChoiceElementMappingsByClass()).keySet()) {
             //Create node values for any classes that aren't already processed
             if(!(classes.contains(nextClass))) {
@@ -328,7 +328,7 @@
                 if(xmlChoiceCollectionMapping.isAny()) {
                     return this.anyNodeValue;
                 }
-                Class theClass = fieldValue.getClass();
+                Class<? extends Object> theClass = fieldValue.getClass();
                 while(associatedField == null) {
                     associatedField = (Field) xmlChoiceCollectionMapping.getClassToFieldMappings().get(theClass);
                     if(theClass.getSuperclass() != null) {
@@ -342,7 +342,7 @@
                 nodeValue = this.fieldToNodeValues.get(associatedField);
             }
         } else {
-            Class theClass = value.getClass();
+            Class<? extends Object> theClass = value.getClass();
             while(associatedField == null) {
                 associatedField = (Field) xmlChoiceCollectionMapping.getClassToFieldMappings().get(theClass);
                 List<FieldNodeValue> fieldNodes = classToNodeValues.get(theClass);
@@ -374,7 +374,7 @@
         if(associatedField == null) {
             //check the field associations
             List<Field> sourceFields = null;
-            Class theClass = value.getClass();
+            Class<? extends Object> theClass = value.getClass();
             while(theClass != null) {
                 sourceFields = (List<Field>) xmlChoiceCollectionMapping.getClassToSourceFieldsMappings().get(theClass);
                 if(sourceFields != null) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.java
index 0564821..ab82092 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.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
@@ -153,7 +153,7 @@
                 UnmarshalKeepAsElementPolicy policy = xmlCompositeCollectionMapping.getKeepAsElementPolicy();
                 if (policy != null && ((xmlDescriptor == null && policy.isKeepUnknownAsElement()) || policy.isKeepAllAsElement())) {
                     if (unmarshalRecord.getTypeQName() != null) {
-                        Class theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
+                        Class<Object> theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
                         if (theClass == null) {
                             setupHandlerForKeepAsElementPolicy(unmarshalRecord, xPathFragment, atts);
                             return true;
@@ -218,7 +218,7 @@
 
                if (null != keepAsElementPolicy && (keepAsElementPolicy.isKeepUnknownAsElement() || keepAsElementPolicy.isKeepAllAsElement()) && builder.getNodes().size() > 1) {
                    if(unmarshalRecord.getTypeQName() != null){
-                       Class theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
+                       Class<Object> theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
                        if(theClass != null){
                            //handle simple text
                            endElementProcessText(unmarshalRecord, xmlCompositeCollectionMapping, xPathFragment, collection);
@@ -303,7 +303,7 @@
         if(descriptor == null){
             descriptor = (Descriptor) session.getDescriptor(value.getClass());
         }else if(descriptor.hasInheritance()){
-            Class objectValueClass = value.getClass();
+            Class<? extends Object> objectValueClass = value.getClass();
             if(!(objectValueClass == descriptor.getJavaClass())){
                 descriptor = (Descriptor) session.getDescriptor(objectValueClass);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeObjectMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeObjectMappingNodeValue.java
index aad7708..6fad5f2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeObjectMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeObjectMappingNodeValue.java
@@ -47,7 +47,6 @@
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
 import org.xml.sax.Attributes;
 import org.xml.sax.SAXException;
 import org.xml.sax.SAXParseException;
@@ -216,7 +215,7 @@
         if(descriptor == null){
             descriptor = (Descriptor) session.getDescriptor(objectValue.getClass());
         }else if(descriptor.hasInheritance()){
-            Class objectValueClass = objectValue.getClass();
+            Class<? extends Object> objectValueClass = objectValue.getClass();
             if(!(objectValueClass == descriptor.getJavaClass())){
                 descriptor = (Descriptor) session.getDescriptor(objectValueClass);
             }
@@ -331,7 +330,7 @@
                         unmarshalRecord.setTypeQName(schemaType);
                     }
                     if(schemaType != null){
-                        Class theClass = unmarshalRecord.getConversionManager().javaType(schemaType);
+                        Class<Object> theClass = unmarshalRecord.getConversionManager().javaType(schemaType);
                         if(theClass == null){
                             setupHandlerForKeepAsElementPolicy(unmarshalRecord, xPathFragment, atts);
                             return true;
@@ -403,7 +402,7 @@
             if (null != keepAsElementPolicy && (keepAsElementPolicy.isKeepUnknownAsElement() || keepAsElementPolicy.isKeepAllAsElement()) && builder.getNodes().size() != 0) {
 
                 if(unmarshalRecord.getTypeQName() != null){
-                    Class theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
+                    Class<Object> theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
                     if(theClass != null){
                         //handle simple text
                         endElementProcessText(unmarshalRecord, xmlCompositeObjectMapping, xPathFragment, null);
@@ -467,7 +466,7 @@
             SAXFragmentBuilder builder = unmarshalRecord.getFragmentBuilder();
             if ((((keepAsElementPolicy.isKeepUnknownAsElement()) || (keepAsElementPolicy.isKeepAllAsElement())))&& (builder.getNodes().size() != 0) ) {
                 if(unmarshalRecord.getTypeQName() != null){
-                    Class theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
+                    Class<Object> theClass = unmarshalRecord.getConversionManager().javaType(unmarshalRecord.getTypeQName());
                     if(theClass != null){
                         //handle simple text
                         endElementProcessText(unmarshalRecord, xmlCompositeObjectMapping, null, null);
@@ -497,7 +496,7 @@
                         }
                         QName qName = new QName(namespace, xsiType.substring(colonIndex + 1));
                         ConversionManager conversionManager = unmarshalRecord.getConversionManager();
-                        Class theClass = conversionManager.javaType(qName);
+                        Class<Object> theClass = conversionManager.javaType(qName);
                         if (theClass != null) {
                             value = conversionManager.convertObject(element.getTextContent(), theClass, qName);
                         }
@@ -506,7 +505,7 @@
                             QName qName = new QName(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI, xsiType);
 
                             ConversionManager conversionManager = unmarshalRecord.getConversionManager();
-                            Class theClass = conversionManager.javaType(qName);
+                            Class<Object> theClass = conversionManager.javaType(qName);
                             if (theClass != null) {
                                 value = conversionManager.convertObject(element.getTextContent(), theClass, qName);
                             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLConversionManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLConversionManager.java
index e48c7c9..3bde576 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLConversionManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLConversionManager.java
@@ -27,6 +27,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
+import java.util.Map;
 import java.util.StringTokenizer;
 import java.util.TimeZone;
 import java.util.UUID;
@@ -64,8 +65,8 @@
     protected static XMLConversionManager defaultXMLManager;
 
     // Static hash tables for the default conversion pairs
-    protected static HashMap defaultXMLTypes;
-    protected static HashMap defaultJavaTypes;
+    protected static Map<QName, Class<?>> defaultXMLTypes;
+    protected static Map<Class<?>, QName> defaultJavaTypes;
 
     protected boolean timeZoneQualified;
     protected TimeZone timeZone;
@@ -153,49 +154,50 @@
      * @return - the newly converted object
      */
     @Override
-    public Object convertObject(Object sourceObject, Class javaClass) throws ConversionException {
+    @SuppressWarnings({"unchecked"})
+    public <T> T convertObject(Object sourceObject, Class<T> javaClass) throws ConversionException {
         if (sourceObject == null) {//Let the parent handle default null values
             return super.convertObject(null, javaClass);
         } else if (javaClass == null || javaClass == CoreClassConstants.OBJECT || sourceObject.getClass() == javaClass) {
-            return sourceObject;
+            return (T) sourceObject;
         } else if (javaClass == CoreClassConstants.STRING) {
            if(sourceObject instanceof List){
-               return convertListToString(sourceObject, null);
+               return (T) convertListToString(sourceObject, null);
            } else if (sourceObject instanceof Character[]) {
-               return convertObjectToString(sourceObject);
+               return (T) convertObjectToString(sourceObject);
            } else if (sourceObject instanceof Object[]) {
-               return convertArrayToString((Object[]) sourceObject, null);
+               return (T) convertArrayToString((Object[]) sourceObject, null);
            } else {
-               return convertObjectToString(sourceObject);
+               return (T) convertObjectToString(sourceObject);
            }
         } else if (javaClass == CoreClassConstants.ASTRING && sourceObject instanceof String) {
-                return convertStringToList(sourceObject).toArray(new String[] {});
+                return (T) convertStringToList(sourceObject).toArray(new String[] {});
         // TODO else if (javaClass == CoreClassConstants.ArrayList_class) {
         //        return convertStringToList((Object[]) sourceObject, null);
         } else if ((javaClass == Constants.QNAME_CLASS) && (sourceObject != null)) {
-            return convertObjectToQName(sourceObject);
+            return (T) convertObjectToQName(sourceObject);
         } else if ((javaClass == CoreClassConstants.List_Class) && (sourceObject instanceof String)) {
-            return convertStringToList(sourceObject);
+            return (T) convertStringToList(sourceObject);
         } else if ((javaClass == CoreClassConstants.CALENDAR)) {
-            return convertObjectToCalendar(sourceObject);
+            return (T) convertObjectToCalendar(sourceObject);
         } else if ((javaClass == CoreClassConstants.UTILDATE)) {
-            return convertObjectToUtilDate(sourceObject, Constants.DATE_TIME_QNAME);
+            return (T) convertObjectToUtilDate(sourceObject, Constants.DATE_TIME_QNAME);
         } else if ((javaClass == CoreClassConstants.SQLDATE)) {
-            return convertObjectToSQLDate(sourceObject, Constants.DATE_QNAME);
+            return (T) convertObjectToSQLDate(sourceObject, Constants.DATE_QNAME);
         } else if ((javaClass == CoreClassConstants.TIME)) {
-            return convertObjectToSQLTime(sourceObject, Constants.TIME_QNAME);
+            return (T) convertObjectToSQLTime(sourceObject, Constants.TIME_QNAME);
         } else if ((javaClass == CoreClassConstants.TIMESTAMP)) {
-            return convertObjectToTimestamp(sourceObject, Constants.DATE_TIME_QNAME);
+            return (T) convertObjectToTimestamp(sourceObject, Constants.DATE_TIME_QNAME);
         } else if ((javaClass == java.net.URI.class)) {
-            return convertObjectToURI(sourceObject);
+            return (T) convertObjectToURI(sourceObject);
         } else if ((javaClass == CoreClassConstants.XML_GREGORIAN_CALENDAR)) {
-            return convertObjectToXMLGregorianCalendar(sourceObject);
+            return (T) convertObjectToXMLGregorianCalendar(sourceObject);
         } else if ((javaClass == CoreClassConstants.DURATION)) {
-            return convertObjectToDuration(sourceObject);
+            return (T) convertObjectToDuration(sourceObject);
         } else if ((javaClass == CoreClassConstants.FILE) && (sourceObject instanceof String)) {
-            return convertStringToFile((String) sourceObject);
+            return (T) convertStringToFile((String) sourceObject);
         } else if ((javaClass == Constants.UUID) && (sourceObject instanceof String)) {
-            return UUID.fromString((String) sourceObject);
+            return (T) UUID.fromString((String) sourceObject);
         } else {
             try {
                 return super.convertObject(sourceObject, javaClass);
@@ -218,7 +220,8 @@
      * @return - the newly converted object
      */
     @Override
-    public Object convertObject(Object sourceObject, Class javaClass, QName schemaTypeQName) throws ConversionException {
+    @SuppressWarnings({"unchecked"})
+    public <T> T convertObject(Object sourceObject, Class<T> javaClass, QName schemaTypeQName) throws ConversionException {
         if (schemaTypeQName == null) {
             return convertObject(sourceObject, javaClass);
         }
@@ -226,57 +229,57 @@
         if (sourceObject == null) {
             return super.convertObject(null, javaClass);
         } else if ((sourceObject.getClass() == javaClass) || (javaClass == null) || (javaClass == CoreClassConstants.OBJECT)) {
-            return sourceObject;
+            return (T) sourceObject;
         } else if ((javaClass == CoreClassConstants.CALENDAR) || (javaClass == CoreClassConstants.GREGORIAN_CALENDAR)) {
-            return convertObjectToCalendar(sourceObject, schemaTypeQName);
+            return (T) convertObjectToCalendar(sourceObject, schemaTypeQName);
         } else if (javaClass == CoreClassConstants.ABYTE) {
             if (schemaTypeQName.getLocalPart().equalsIgnoreCase(Constants.HEX_BINARY)) {
-                return super.convertObjectToByteObjectArray(sourceObject);
+                return (T) super.convertObjectToByteObjectArray(sourceObject);
             } else if (schemaTypeQName.getLocalPart().equalsIgnoreCase(Constants.BASE_64_BINARY)) {
-                return convertSchemaBase64ToByteObjectArray(sourceObject);
+                return (T) convertSchemaBase64ToByteObjectArray(sourceObject);
             }
         } else if (javaClass == CoreClassConstants.APBYTE) {
             if (schemaTypeQName.getLocalPart().equalsIgnoreCase(Constants.HEX_BINARY)) {
-                return super.convertObjectToByteArray(sourceObject);
+                return (T) super.convertObjectToByteArray(sourceObject);
             } else if (schemaTypeQName.getLocalPart().equalsIgnoreCase(Constants.BASE_64_BINARY)) {
-                return convertSchemaBase64ToByteArray(sourceObject);
+                return (T) convertSchemaBase64ToByteArray(sourceObject);
             }
         } else if ((javaClass == CoreClassConstants.List_Class) && (sourceObject instanceof String)) {
-            return convertStringToList(sourceObject);
+            return (T) convertStringToList(sourceObject);
         } else if ((javaClass == CoreClassConstants.STRING) && (sourceObject instanceof List)) {
-            return convertListToString(sourceObject, schemaTypeQName);
+            return (T) convertListToString(sourceObject, schemaTypeQName);
         } else if (sourceObject instanceof byte[]) {
             if (schemaTypeQName.getLocalPart().equalsIgnoreCase(Constants.BASE_64_BINARY)) {
-                return buildBase64StringFromBytes((byte[]) sourceObject);
+                return (T) buildBase64StringFromBytes((byte[]) sourceObject);
             }
-            return Helper.buildHexStringFromBytes((byte[]) sourceObject);
+            return (T) Helper.buildHexStringFromBytes((byte[]) sourceObject);
         } else if (sourceObject instanceof Byte[]) {
             if (schemaTypeQName.getLocalPart().equalsIgnoreCase(Constants.BASE_64_BINARY)) {
-                return buildBase64StringFromObjectBytes((Byte[]) sourceObject);
+                return (T) buildBase64StringFromObjectBytes((Byte[]) sourceObject);
             }
-            return buildHexStringFromObjectBytes((Byte[]) sourceObject);
+            return (T) buildHexStringFromObjectBytes((Byte[]) sourceObject);
         } else if ((javaClass == CoreClassConstants.STRING) && (sourceObject instanceof Object[])) {
-            return convertArrayToString((Object[]) sourceObject, schemaTypeQName);
+            return (T) convertArrayToString((Object[]) sourceObject, schemaTypeQName);
         } else if ((javaClass == CoreClassConstants.UTILDATE)) {
-            return convertObjectToUtilDate(sourceObject, schemaTypeQName);
+            return (T) convertObjectToUtilDate(sourceObject, schemaTypeQName);
         } else if (javaClass == CoreClassConstants.SQLDATE) {
-            return convertObjectToSQLDate(sourceObject, schemaTypeQName);
+            return (T) convertObjectToSQLDate(sourceObject, schemaTypeQName);
         } else if (javaClass == CoreClassConstants.TIME) {
-            return convertObjectToSQLTime(sourceObject, schemaTypeQName);
+            return (T) convertObjectToSQLTime(sourceObject, schemaTypeQName);
         } else if (javaClass ==  CoreClassConstants.TIMESTAMP) {
-            return convertObjectToTimestamp(sourceObject, schemaTypeQName);
+            return (T) convertObjectToTimestamp(sourceObject, schemaTypeQName);
         } else if (javaClass == Constants.QNAME_CLASS) {
-            return convertObjectToQName(sourceObject);
+            return (T) convertObjectToQName(sourceObject);
         } else if (javaClass == CoreClassConstants.STRING) {
-            return convertObjectToString(sourceObject, schemaTypeQName);
+            return (T) convertObjectToString(sourceObject, schemaTypeQName);
         } else if ((javaClass == java.net.URI.class)) {
-            return convertObjectToURI(sourceObject);
+            return (T) convertObjectToURI(sourceObject);
         } else if ((javaClass == CoreClassConstants.XML_GREGORIAN_CALENDAR)) {
-            return convertObjectToXMLGregorianCalendar(sourceObject, schemaTypeQName);
+            return (T) convertObjectToXMLGregorianCalendar(sourceObject, schemaTypeQName);
         } else if ((javaClass == CoreClassConstants.DURATION)) {
-            return convertObjectToDuration(sourceObject);
+            return (T) convertObjectToDuration(sourceObject);
         } else if ((javaClass == CoreClassConstants.CHAR)) {
-            return convertObjectToChar(sourceObject, schemaTypeQName);
+            return (T) convertObjectToChar(sourceObject, schemaTypeQName);
         } else {
             try {
                 return super.convertObject(sourceObject, javaClass);
@@ -632,7 +635,7 @@
       if(sourceObject instanceof String) {
           String sourceString = (String) sourceObject;
           if(sourceString.length() == 0) {
-              return 0l;
+              return 0L;
           } else if(sourceString.charAt(0) == PLUS) {
               return super.convertObjectToLong(sourceString.substring(1));
           }
@@ -1185,9 +1188,8 @@
             return null;
         }
         Calendar cal = toCalendar(xmlGregorianCalender);
-        Date returnDate = cal.getTime();
 
-        return returnDate;
+        return cal.getTime();
     }
 
     private Calendar toCalendar(XMLGregorianCalendar xgc) {
@@ -1649,8 +1651,8 @@
         return Helper.buildHexStringFromBytes(primitiveBytes);
     }
 
-    protected List convertStringToList(Object sourceObject) throws ConversionException {
-        ArrayList list = new ArrayList();
+    protected List<String> convertStringToList(Object sourceObject) throws ConversionException {
+        List<String> list = new ArrayList<>();
         if (sourceObject instanceof String) {
             StringTokenizer tokenizer = new StringTokenizer((String) sourceObject, " ");
             while (tokenizer.hasMoreElements()) {
@@ -1676,8 +1678,8 @@
      * @param elementType - the type of the elements contained in the list
      * @return - the newly converted object
      */
-    public Object convertStringToList(Object sourceObject, Class elementType, ContainerPolicy containerPolicy, QName schemaType) throws ConversionException {
-        Collection collection = (Collection) containerPolicy.containerInstance();
+    public <T> Collection<T> convertStringToList(Object sourceObject, Class<T> elementType, ContainerPolicy containerPolicy, QName schemaType) throws ConversionException {
+        Collection<T> collection = (Collection<T>) containerPolicy.containerInstance();
 
         if (sourceObject instanceof String) {
             StringTokenizer tokenizer = new StringTokenizer((String) sourceObject, " ");
@@ -1693,13 +1695,14 @@
     public String convertListToString(Object sourceObject, QName schemaType) throws ConversionException {
         StringBuilder returnStringBuilder = new StringBuilder();
         if (sourceObject instanceof List) {
-            List list = (List) sourceObject;
+            @SuppressWarnings({"unchecked"})
+            List<?> list = (List<?>) sourceObject;
             for (int i = 0, listSize = list.size(); i < listSize; i++) {
                 Object next = list.get(i);
-                    if (i > 0) {
-                        returnStringBuilder.append(' ');
-                    }
-                    returnStringBuilder.append((String)convertObject(next, String.class, schemaType));
+                if (i > 0) {
+                    returnStringBuilder.append(' ');
+                }
+                returnStringBuilder.append(convertObject(next, next.getClass().getComponentType(), schemaType));
             }
         }
         return returnStringBuilder.toString();
@@ -1712,19 +1715,19 @@
             if (i > 0) {
                 returnStringBuilder.append(' ');
             }
-            returnStringBuilder.append((String)convertObject(next, String.class, schemaType));
+            returnStringBuilder.append(convertObject(next, next.getClass().getComponentType(), schemaType));
         }
         return returnStringBuilder.toString();
     }
 
-    public static HashMap getDefaultXMLTypes() {
+    public static Map<QName, Class<?>> getDefaultXMLTypes() {
         if (defaultXMLTypes == null) {
             defaultXMLTypes = buildXMLTypes();
         }
         return defaultXMLTypes;
     }
 
-    public static HashMap getDefaultJavaTypes() {
+    public static Map<Class<?>, QName> getDefaultJavaTypes() {
         if (defaultJavaTypes == null) {
             defaultJavaTypes = buildJavaTypes();
         }
@@ -1734,8 +1737,8 @@
     /**
     * Build and return a Hashtable containing the default XML to Java conversion pairs
     */
-    private static HashMap buildXMLTypes() {
-        HashMap XMLTypes = new HashMap();
+    private static Map<QName, Class<?>> buildXMLTypes() {
+        Map<QName, Class<?>> XMLTypes = new HashMap<>();
 
         //jaxb 1.0 spec pairs
         XMLTypes.put(Constants.ANY_SIMPLE_TYPE_QNAME, CoreClassConstants.STRING);
@@ -1783,8 +1786,8 @@
     /**
      * Build and return a Hashtable containing the default Java to XML conversion pairs
      */
-    private static HashMap buildJavaTypes() {
-        HashMap javaTypes = new HashMap();
+    private static Map<Class<?>, QName> buildJavaTypes() {
+        Map<Class<?>, QName> javaTypes = new HashMap<>();
 
         //jaxb 1.0 spec pairs
         javaTypes.put(CoreClassConstants.APBYTE, Constants.HEX_BINARY_QNAME);
@@ -1978,9 +1981,7 @@
                 collapsedString.append(nextCharacter);
                 inSequence = false;
             } else {
-                if(inSequence) {
-                    continue;
-                } else {
+                if(!inSequence) {
                     collapsedString.append(' ');
                     inSequence = true;
                 }
@@ -2033,8 +2034,9 @@
      * @return the Java class for the XML schema type.
      */
     @Override
-    public Class<?> javaType(QName schemaType) {
-        return (Class<?>) getDefaultXMLTypes().get(schemaType);
+    @SuppressWarnings({"unchecked"})
+    public <T> Class<T> javaType(QName schemaType) {
+        return (Class<T>) getDefaultXMLTypes().get(schemaType);
     }
 
     /**
@@ -2044,7 +2046,7 @@
      */
     @Override
     public QName schemaType(Class<?> javaType) {
-         return (QName) getDefaultJavaTypes().get(javaType);
+         return getDefaultJavaTypes().get(javaType);
     }
 
     @Override
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLMarshaller.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLMarshaller.java
index 5554797..8d65256 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLMarshaller.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLMarshaller.java
@@ -40,7 +40,6 @@
 import org.eclipse.persistence.exceptions.XMLMarshalException;
 import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession;
-import org.eclipse.persistence.internal.localization.JAXBLocalization;
 import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
 import org.eclipse.persistence.internal.oxm.mappings.Field;
 import org.eclipse.persistence.internal.oxm.record.AbstractMarshalRecord;
@@ -113,12 +112,12 @@
                 staxResultGetStreamWriterMethod = PrivilegedAccessHelper.getDeclaredMethod(staxResultClass, GET_XML_STREAM_WRITER_METHOD_NAME, new Class[]{});
                 staxResultGetEventWriterMethod = PrivilegedAccessHelper.getDeclaredMethod(staxResultClass, GET_XML_EVENT_WRITER_METHOD_NAME, new Class[]{});
             }
-            Class streamWriterRecordClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_WRITER_RECORD_CLASS_NAME);
-            Class streamWriterClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_WRITER_CLASS_NAME);
+            Class<Object> streamWriterRecordClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_WRITER_RECORD_CLASS_NAME);
+            Class<Object> streamWriterClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_WRITER_CLASS_NAME);
             xmlStreamWriterRecordConstructor = PrivilegedAccessHelper.getConstructorFor(streamWriterRecordClass, new Class[]{streamWriterClass}, true);
 
-            Class eventWriterRecordClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_WRITER_RECORD_CLASS_NAME);
-            Class eventWriterClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_WRITER_CLASS_NAME);
+            Class<Object> eventWriterRecordClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_WRITER_RECORD_CLASS_NAME);
+            Class<Object> eventWriterClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_WRITER_CLASS_NAME);
             xmlEventWriterRecordConstructor = PrivilegedAccessHelper.getConstructorFor(eventWriterRecordClass, new Class[]{eventWriterClass}, true);
 
             domToStreamWriterClass = PrivilegedAccessHelper.getClassForName(DOM_TO_STREAM_WRITER_CLASS_NAME);
@@ -488,7 +487,7 @@
     }
 
     protected boolean isSimpleXMLRoot(Root xmlRoot) {
-        Class xmlRootObjectClass = xmlRoot.getObject().getClass();
+        Class<? extends Object> xmlRootObjectClass = xmlRoot.getObject().getClass();
 
         ConversionManager conversionManager = (ConversionManager) context.getSession().getDatasourcePlatform().getConversionManager();
         if (conversionManager.schemaType(xmlRootObjectClass) != null || CoreClassConstants.List_Class.isAssignableFrom(xmlRootObjectClass) || CoreClassConstants.XML_GREGORIAN_CALENDAR.isAssignableFrom(xmlRootObjectClass) || CoreClassConstants.DURATION.isAssignableFrom(xmlRootObjectClass)) {
@@ -546,7 +545,7 @@
                 }
             }
         }else{
-            Class objectClass = object.getClass();
+            Class<? extends Object> objectClass = object.getClass();
             session = context.getSession(objectClass);
             xmlDescriptor = getDescriptor(objectClass, session);
         }
@@ -588,7 +587,7 @@
                 }
             }
         }else{
-            Class objectClass = object.getClass();
+            Class<? extends Object> objectClass = object.getClass();
             session = context.getSession(objectClass);
             xmlDescriptor = getDescriptor(objectClass, session);
         }
@@ -854,7 +853,7 @@
                 }
             }
         }else{
-            Class objectClass = object.getClass();
+            Class<? extends Object> objectClass = object.getClass();
             session = context.getSession(objectClass);
             xmlDescriptor = getDescriptor(objectClass, session);
         }
@@ -981,7 +980,7 @@
                 }
             }
         }else{
-            Class objectClass = object.getClass();
+            Class<? extends Object> objectClass = object.getClass();
             session = context.getSession(objectClass);
             xmlDescriptor = getDescriptor(objectClass, session);
         }
@@ -1136,7 +1135,7 @@
                 }
             }
         }else{
-            Class objectClass = object.getClass();
+            Class<? extends Object> objectClass = object.getClass();
             if(object instanceof Collection) {
                 int valueSize = ((Collection)object).size();
                 if(marshalRecord.getMarshaller().isApplicationJSON() && (valueSize > 1 || !marshalRecord.getMarshaller().isReduceAnyArrays())) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLObjectBuilder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLObjectBuilder.java
index 86ce2a7..fb1a368 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLObjectBuilder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLObjectBuilder.java
@@ -547,8 +547,8 @@
             relationshipMappings.clear();
         }
 
-        for (Enumeration mappings = this.descriptor.getMappings().elements();
-                 mappings.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappings = this.descriptor.getMappings().elements();
+             mappings.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
 
             // Add attribute to mapping association
@@ -577,7 +577,7 @@
 
                 if (mapping.isReadOnly()) {
                     if(null != readOnlyMappingsByField) {
-                        List readOnlyMappings = getReadOnlyMappingsByField().get(field);
+                        List<DatabaseMapping> readOnlyMappings = getReadOnlyMappingsByField().get(field);
 
                         if (readOnlyMappings == null) {
                             readOnlyMappings = new ArrayList();
@@ -596,7 +596,7 @@
                         DatabaseMapping aggregatedFieldMapping = aggregateObjectBuilder.getMappingForField(field);
 
                         if (aggregatedFieldMapping == null) { // mapping must be read-only
-                            List readOnlyMappings = getReadOnlyMappingsByField().get(field);
+                            List<DatabaseMapping> readOnlyMappings = getReadOnlyMappingsByField().get(field);
 
                             if (readOnlyMappings == null) {
                                 readOnlyMappings = new ArrayList();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLRelationshipMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLRelationshipMappingNodeValue.java
index 737597f..64ac06f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLRelationshipMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLRelationshipMappingNodeValue.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
@@ -164,7 +164,7 @@
                     returnDescriptor = xmlContext.getDescriptorByGlobalType(frag);
                     if(returnDescriptor == null){
                         if(policy == null || (!policy.isKeepUnknownAsElement() && !policy.isKeepAllAsElement())){
-                            Class theClass = unmarshalRecord.getConversionManager().javaType(qname);
+                            Class<Object> theClass = unmarshalRecord.getConversionManager().javaType(qname);
                             if(theClass == null){
                                 throw XMLMarshalException.unknownXsiTypeValue(schemaType, mapping);
                             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLSequencedObjectBuilder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLSequencedObjectBuilder.java
index 63a7d5b..c1a29c4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLSequencedObjectBuilder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLSequencedObjectBuilder.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
@@ -49,7 +49,7 @@
     public Collection getSettingsFromObject(Object obj) {
         Method getSettingsMethod = ((XMLSequencedDescriptor)getDescriptor()).getGetSettingsMethod();
         try {
-            Collection settings = (Collection)PrivilegedAccessHelper.invokeMethod(getSettingsMethod, obj, new Object[0]);
+            Collection settings = PrivilegedAccessHelper.invokeMethod(getSettingsMethod, obj, new Object[0]);
             return settings;
         } catch(IllegalAccessException ex) {
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLUnmarshaller.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLUnmarshaller.java
index 48f4d24..5d480c2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLUnmarshaller.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLUnmarshaller.java
@@ -32,7 +32,6 @@
 import org.eclipse.persistence.exceptions.EclipseLinkException;
 import org.eclipse.persistence.exceptions.XMLMarshalException;
 import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession;
-import org.eclipse.persistence.internal.localization.JAXBLocalization;
 import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
 import org.eclipse.persistence.internal.oxm.record.PlatformUnmarshaller;
 import org.eclipse.persistence.internal.oxm.record.UnmarshalRecord;
@@ -179,18 +178,18 @@
             if(staxSourceClass != null) {
                 staxSourceGetStreamReaderMethod = PrivilegedAccessHelper.getDeclaredMethod(staxSourceClass, GET_XML_STREAM_READER_METHOD_NAME, new Class[]{});
                 staxSourceGetEventReaderMethod = PrivilegedAccessHelper.getDeclaredMethod(staxSourceClass, GET_XML_EVENT_READER_METHOD_NAME, new Class[]{});
-                Class xmlStreamReaderInputSourceClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_READER_INPUT_SOURCE_CLASS_NAME);
-                Class xmlEventReaderInputSourceClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_READER_INPUT_SOURCE_CLASS_NAME);
-                Class xmlStreamReaderClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_READER_CLASS_NAME);
+                Class<Object> xmlStreamReaderInputSourceClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_READER_INPUT_SOURCE_CLASS_NAME);
+                Class<Object> xmlEventReaderInputSourceClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_READER_INPUT_SOURCE_CLASS_NAME);
+                Class<Object> xmlStreamReaderClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_READER_CLASS_NAME);
                 xmlStreamReaderInputSourceConstructor = PrivilegedAccessHelper.getConstructorFor(xmlStreamReaderInputSourceClass, new Class[]{xmlStreamReaderClass}, true);
 
-                Class xmlEventReaderClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_READER_CLASS_NAME);
+                Class<Object> xmlEventReaderClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_READER_CLASS_NAME);
                 xmlEventReaderInputSourceConstructor = PrivilegedAccessHelper.getConstructorFor(xmlEventReaderInputSourceClass, new Class[]{xmlEventReaderClass}, true);
 
-                Class xmlStreamReaderReaderClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_READER_READER_CLASS_NAME);
+                Class<Object> xmlStreamReaderReaderClass = PrivilegedAccessHelper.getClassForName(XML_STREAM_READER_READER_CLASS_NAME);
                 xmlStreamReaderReaderConstructor = PrivilegedAccessHelper.getConstructorFor(xmlStreamReaderReaderClass, new Class[0], true);
 
-                Class xmlEventReaderReaderClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_READER_READER_CLASS_NAME);
+                Class<Object> xmlEventReaderReaderClass = PrivilegedAccessHelper.getClassForName(XML_EVENT_READER_READER_CLASS_NAME);
                 xmlEventReaderReaderConstructor = PrivilegedAccessHelper.getConstructorFor(xmlEventReaderReaderClass, new Class[0], true);
             }
         } catch(Exception ex) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLVariableXPathMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLVariableXPathMappingNodeValue.java
index d8822fb..ceef000 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLVariableXPathMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLVariableXPathMappingNodeValue.java
@@ -86,7 +86,7 @@
         Descriptor descriptor = (Descriptor)mapping.getReferenceDescriptor();
 
         if(descriptor.hasInheritance()){
-              Class objectValueClass = value.getClass();
+              Class<? extends Object> objectValueClass = value.getClass();
                if(!(objectValueClass == descriptor.getJavaClass())){
                    descriptor = (Descriptor) session.getDescriptor(objectValueClass);
                }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathEngine.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathEngine.java
index 3608029..a36a4f2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathEngine.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathEngine.java
@@ -282,7 +282,7 @@
                     if(schemaType != null && schemaType.equals(Constants.QNAME_QNAME)){
                         nextConvertedItem = getStringForQName((QName)nextItem, getNamespaceResolverForField(xmlField));
                     }else{
-                        nextConvertedItem = (String) ((ConversionManager)session.getDatasourcePlatform().getConversionManager()).convertObject(nextItem, CoreClassConstants.STRING, schemaType);
+                        nextConvertedItem = ((ConversionManager)session.getDatasourcePlatform().getConversionManager()).convertObject(nextItem, CoreClassConstants.STRING, schemaType);
                     }
                     returnStringBuilder.append(nextConvertedItem);
                     if (i < (((List)value).size() - 1)) {
@@ -301,7 +301,7 @@
                             String nextConvertedItem = getStringForQName((QName)nextItem, getNamespaceResolverForField(xmlField));
                             items.add(nextConvertedItem);
                         }else{
-                            String nextConvertedItem = (String) ((ConversionManager)session.getDatasourcePlatform().getConversionManager()).convertObject(nextItem, CoreClassConstants.STRING, schemaType);
+                            String nextConvertedItem = ((ConversionManager)session.getDatasourcePlatform().getConversionManager()).convertObject(nextItem, CoreClassConstants.STRING, schemaType);
                             items.add(nextConvertedItem);
                         }
                     }
@@ -343,7 +343,7 @@
                 }
             }
         }
-        return (String) ((ConversionManager)session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
+        return ((ConversionManager)session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
     }
 
     private Object getValueToWriteForUnion(UnionField xmlField, Object value, CoreAbstractSession session) {
@@ -398,14 +398,14 @@
         Node existingElement;
         NamespaceResolver namespaceResolver = getNamespaceResolverForField(xmlField);
         for (int i = 1; i < index; i++) {
-            Field field = new XMLField(element + "[" + i + "]");
+            Field<XMLConversionManager, NamespaceResolver> field = new XMLField(element + "[" + i + "]");
             field.setNamespaceResolver(namespaceResolver);
             existingElement = (Node)unmarshalXPathEngine.selectSingleNode(parent, field, namespaceResolver);
             if (existingElement == null) {
                 addElement(new XPathFragment(element), xmlField, parent, this, true, session);
             }
         }
-        Field field = new XMLField(fragment.getXPath());
+        Field<XMLConversionManager, NamespaceResolver> field = new XMLField(fragment.getXPath());
         field.setNamespaceResolver(namespaceResolver);
         existingElement = (Node)unmarshalXPathEngine.selectSingleNode(parent, field, namespaceResolver);
         if (existingElement == null) {
@@ -674,7 +674,7 @@
         for (int i = 0; i < size; i++) {
             next = elements.item(i);
             if (next.getNodeType() == Node.ELEMENT_NODE) {
-                Class valueClass = values.get(i).getClass();
+                Class<? extends Object> valueClass = values.get(i).getClass();
                 if(valueClass != CoreClassConstants.STRING){
                     ConversionManager conversionManager = (ConversionManager) session.getDatasourcePlatform().getConversionManager();
                     QName qname = field.getXMLType(valueClass, conversionManager);
@@ -920,7 +920,7 @@
                             addXsiNilToElement(parentElement, xmlField);
                             parentElement.removeChild(node);
                         } else {
-                            String stringValue = (String)session.getDatasourcePlatform().getConversionManager().convertObject(value, CoreClassConstants.STRING);
+                            String stringValue = session.getDatasourcePlatform().getConversionManager().convertObject(value, CoreClassConstants.STRING);
                             Element parentElement = (Element)node.getParentNode();
                             if(parentElement == null && parent.getNodeType() == Node.ELEMENT_NODE) {
                                 parentElement = (Element)parent;
@@ -1033,7 +1033,7 @@
                     Node grandParentNode = parentNode.getParentNode();
                     grandParentNode.removeChild(parentNode);
                 } else {
-                    oldChild.setNodeValue((String) session.getDatasourcePlatform().getConversionManager().convertObject(value, CoreClassConstants.STRING));
+                    oldChild.setNodeValue(session.getDatasourcePlatform().getConversionManager().convertObject(value, CoreClassConstants.STRING));
                 }
             } else {
                 Element element = (Element)oldChild;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathObjectBuilder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathObjectBuilder.java
index cfb202d..4993b9e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathObjectBuilder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathObjectBuilder.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -27,11 +27,13 @@
 import org.eclipse.persistence.core.descriptors.CoreDescriptor;
 import org.eclipse.persistence.core.mappings.CoreMapping;
 import org.eclipse.persistence.core.mappings.transformers.CoreFieldTransformer;
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.exceptions.XMLMarshalException;
 import org.eclipse.persistence.internal.core.descriptors.CoreObjectBuilder;
 import org.eclipse.persistence.internal.core.helper.CoreField;
 import org.eclipse.persistence.internal.core.sessions.CoreAbstractRecord;
 import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession;
+import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.oxm.mappings.AnyAttributeMapping;
 import org.eclipse.persistence.internal.oxm.mappings.AnyCollectionMapping;
 import org.eclipse.persistence.internal.oxm.mappings.AnyObjectMapping;
@@ -62,11 +64,18 @@
 import org.eclipse.persistence.internal.oxm.record.UnmarshalRecord;
 import org.eclipse.persistence.internal.oxm.record.UnmarshalRecordImpl;
 import org.eclipse.persistence.internal.oxm.record.XMLRecord;
+import org.eclipse.persistence.internal.queries.ContainerPolicy;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
+import org.eclipse.persistence.mappings.AttributeAccessor;
+import org.eclipse.persistence.mappings.converters.Converter;
 import org.eclipse.persistence.oxm.XMLContext;
+import org.eclipse.persistence.oxm.XMLMarshaller;
+import org.eclipse.persistence.oxm.XMLUnmarshaller;
+import org.eclipse.persistence.oxm.mappings.UnmarshalKeepAsElementPolicy;
 import org.eclipse.persistence.oxm.mappings.XMLCompositeObjectMapping;
 import org.eclipse.persistence.oxm.sequenced.SequencedObject;
+import org.eclipse.persistence.sessions.Session;
 
 public class XPathObjectBuilder extends CoreObjectBuilder<CoreAbstractRecord, CoreAbstractSession, CoreField, CoreMapping> implements ObjectBuilder {
 
@@ -236,7 +245,7 @@
             if (node == null) {
                 // No descriptor for this object, so manually create a MappingNodeValue and marshal it
                 XPathNode n = new XPathNode();
-                CompositeObjectMapping m = new XMLCompositeObjectMapping();
+                CompositeObjectMapping<AbstractSession, AttributeAccessor, ContainerPolicy, Converter, ClassDescriptor, DatabaseField, XMLMarshaller, Session, UnmarshalKeepAsElementPolicy, XMLUnmarshaller, org.eclipse.persistence.oxm.record.XMLRecord> m = new XMLCompositeObjectMapping();
                 m.setXPath(".");
                 XMLCompositeObjectMappingNodeValue nv = new XMLCompositeObjectMappingNodeValue(m);
                 n.setMarshalNodeValue(nv);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/CharacterEscapeHandlerWrapper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/CharacterEscapeHandlerWrapper.java
index 566174f..723f411 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/CharacterEscapeHandlerWrapper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/CharacterEscapeHandlerWrapper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -41,7 +41,7 @@
 
     public CharacterEscapeHandlerWrapper(Object sunHandler) {
         this.handler = sunHandler;
-        Class handlerClass = sunHandler.getClass();
+        Class<? extends Object> handlerClass = sunHandler.getClass();
 
         try {
             this.escapeMethod = PrivilegedAccessHelper.getMethod(handlerClass, ESCAPE_METHOD_NAME, PARAMS, false);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DOMReader.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DOMReader.java
index e8e4862..8f17465 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DOMReader.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DOMReader.java
@@ -29,13 +29,11 @@
 
 import org.w3c.dom.Attr;
 import org.w3c.dom.CDATASection;
-import org.w3c.dom.Comment;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
 import org.xml.sax.InputSource;
 import org.xml.sax.SAXException;
 import org.xml.sax.ext.Locator2;
@@ -122,7 +120,7 @@
             parent = parent.getParentNode();
         }
         // Pop off each node and call startPrefixMapping for each XMLNS attribute
-        for (Iterator stackIt = parentElements.iterator(); stackIt.hasNext(); ) {
+        for (Iterator<Node> stackIt = parentElements.iterator(); stackIt.hasNext(); ) {
             NamedNodeMap attrs = parentElements.remove(parentElements.size() - 1).getAttributes();
             if (attrs != null) {
                 for (int i=0, length = attrs.getLength(); i < length; i++) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/XMLEventReaderReader.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/XMLEventReaderReader.java
index aa56f95..8b85972 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/XMLEventReaderReader.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/XMLEventReaderReader.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
@@ -179,7 +179,7 @@
 
                 depth++;
                 StartElement startElement = xmlEvent.asStartElement();
-                Iterator namespaces = startElement.getNamespaces();
+                Iterator<Namespace> namespaces = startElement.getNamespaces();
                 List<Namespace> declaredNs = null;
                 if(namespaces.hasNext()) {
                     declaredNs = new ArrayList<>();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/namespaces/NamespacePrefixMapperWrapper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/namespaces/NamespacePrefixMapperWrapper.java
index 80165f4..19a49b1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/namespaces/NamespacePrefixMapperWrapper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/namespaces/NamespacePrefixMapperWrapper.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
@@ -44,7 +44,7 @@
 
     public NamespacePrefixMapperWrapper(Object prefixMapper) {
         this.prefixMapper = prefixMapper;
-        Class prefixMapperClass = prefixMapper.getClass();
+        Class<? extends Object> prefixMapperClass = prefixMapper.getClass();
         try {
             this.getPreferredPrefixMethod = PrivilegedAccessHelper.getMethod(prefixMapperClass, GET_PREF_PREFIX_METHOD_NAME, PREF_PREFIX_PARAM_TYPES, false);
         } catch(Exception ex) {
@@ -71,7 +71,7 @@
     @Override
     public String getPreferredPrefix(String namespaceUri, String suggestion, boolean requirePrefix) {
         try {
-            return (String)PrivilegedAccessHelper.invokeMethod(getPreferredPrefixMethod, prefixMapper, new Object[]{namespaceUri, suggestion, requirePrefix});
+            return PrivilegedAccessHelper.invokeMethod(getPreferredPrefixMethod, prefixMapper, new Object[]{namespaceUri, suggestion, requirePrefix});
         } catch(Exception ex) {
             throw XMLMarshalException.errorInvokingPrefixMapperMethod(GET_PREF_PREFIX_METHOD_NAME, prefixMapper);
         }
@@ -80,7 +80,7 @@
     @Override
     public String[] getContextualNamespaceDecls() {
         try {
-            return (String[])PrivilegedAccessHelper.invokeMethod(this.getContextualNamespaceDeclsMethod, prefixMapper, new Object[]{});
+            return PrivilegedAccessHelper.invokeMethod(this.getContextualNamespaceDeclsMethod, prefixMapper, new Object[]{});
         } catch(Exception ex) {
             throw XMLMarshalException.errorInvokingPrefixMapperMethod(GET_CONTEXTUAL_NAMESPACE_DECL_METHOD_NAME, prefixMapper);
         }
@@ -89,7 +89,7 @@
     @Override
     public String[] getPreDeclaredNamespaceUris() {
         try {
-            return (String[])PrivilegedAccessHelper.invokeMethod(getPredeclaredNamespaceUrisMethod, prefixMapper, new Object[]{});
+            return PrivilegedAccessHelper.invokeMethod(getPredeclaredNamespaceUrisMethod, prefixMapper, new Object[]{});
         } catch(Exception ex) {
             throw XMLMarshalException.errorInvokingPrefixMapperMethod(GET_PRE_DECL_NAMESPACE_URIS_METHOD_NAME, prefixMapper);
         }
@@ -98,7 +98,7 @@
     @Override
     public String[] getPreDeclaredNamespaceUris2() {
         try {
-            return (String[])PrivilegedAccessHelper.invokeMethod(getPredeclaredNamespaceUris2Method, prefixMapper, new Object[]{});
+            return PrivilegedAccessHelper.invokeMethod(getPredeclaredNamespaceUris2Method, prefixMapper, new Object[]{});
         } catch(Exception ex) {
             throw XMLMarshalException.errorInvokingPrefixMapperMethod(GET_PRE_DECL_NAMESPACE_URIS2_METHOD_NAME, prefixMapper);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ContainerPolicy.java
index 536c970..521a6ff 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ContainerPolicy.java
@@ -91,7 +91,7 @@
     /**
      * Allow the default collection class to be set.
      */
-    protected static Class defaultContainerClass = ClassConstants.Vector_class;
+    protected static Class<Vector> defaultContainerClass = ClassConstants.Vector_class;
 
     /** The descriptor is used to wrap and unwrap objects using the wrapper policy. **/
     protected transient ClassDescriptor elementDescriptor;
@@ -909,7 +909,7 @@
             Constructor constructor = null;
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(getContainerClass(), new Class[] { ClassConstants.PINT }, false));
+                    constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<Class<?>>(getContainerClass(), new Class[] { ClassConstants.PINT }, false));
                 } catch (PrivilegedActionException exception) {
                     // If there is no constructor then the default will be used.
                     return;
@@ -1116,7 +1116,7 @@
     protected void mergeChanges(CollectionChangeRecord changeRecord, Object valueOfTarget, boolean shouldMergeCascadeParts, MergeManager mergeManager, AbstractSession targetSession) {
         ObjectChangeSet objectChanges;
         // Step 1 - iterate over the removed changes and remove them from the container.
-        Iterator removeObjects = changeRecord.getRemoveObjectList().keySet().iterator();
+        Iterator<ObjectChangeSet> removeObjects = changeRecord.getRemoveObjectList().keySet().iterator();
         while (removeObjects.hasNext()) {
             objectChanges = (ObjectChangeSet) removeObjects.next();
             removeFrom(objectChanges.getOldKey(), objectChanges.getTargetVersionOfSourceObject(mergeManager, targetSession), valueOfTarget, targetSession);
@@ -1126,7 +1126,7 @@
         }
 
         // Step 2 - iterate over the added changes and add them to the container.
-        Iterator addObjects = changeRecord.getAddObjectList().keySet().iterator();
+        Iterator<ObjectChangeSet> addObjects = changeRecord.getAddObjectList().keySet().iterator();
         while (addObjects.hasNext()) {
             objectChanges = (ObjectChangeSet) addObjects.next();
             Object object = null;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/DatabaseQueryMechanism.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/DatabaseQueryMechanism.java
index 5e28a7b..d6f8910 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/DatabaseQueryMechanism.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/DatabaseQueryMechanism.java
@@ -842,7 +842,7 @@
         Object primaryKey = null;
         if (isFirstCallForInsert) {
             AbstractRecord pkToModify = new DatabaseRecord();
-            List primaryKeyFields = getDescriptor().getPrimaryKeyFields();
+            List<DatabaseField> primaryKeyFields = getDescriptor().getPrimaryKeyFields();
             for (int i = 0; i < primaryKeyFields.size(); i++) {
                 DatabaseField field = (DatabaseField)primaryKeyFields.get(i);
                 if (row.containsKey(field)) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ExpressionQueryMechanism.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ExpressionQueryMechanism.java
index 1d1017b..5fcd4a2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ExpressionQueryMechanism.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/ExpressionQueryMechanism.java
@@ -473,7 +473,7 @@
             return null;
         }
         HashSet aliasTables = new HashSet();
-        Iterator itEntries = selectStatement.getTableAliases().entrySet().iterator();
+        Iterator<Map.Entry<DatabaseTable, DatabaseTable>> itEntries = selectStatement.getTableAliases().entrySet().iterator();
         DatabaseTable aliasTable = null;
         while(itEntries.hasNext()) {
             Map.Entry entry = (Map.Entry)itEntries.next();
@@ -1338,7 +1338,7 @@
                 // In the case of multiple tables, build the sql statements list in insert order. When the
                 // actual SQL calls are sent they are sent in the reverse of this order.
                 for (DatabaseTable table : tablesInInsertOrder) {
-                    Collection primaryKeyFields = getPrimaryKeyFieldsForTable(table);
+                    Collection<DatabaseField> primaryKeyFields = getPrimaryKeyFieldsForTable(table);
                     SQLDeleteStatement deleteStatement;
 
                     // In Employee example, query with reference class:
@@ -1507,7 +1507,7 @@
                 tablesToIgnoreForChildren.addAll(tablesInInsertOrder);
             }
 
-            Iterator it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
+            Iterator<ClassDescriptor> it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
             while (it.hasNext()) {
                 // Define the same query for the child
                 ClassDescriptor childDescriptor = (ClassDescriptor)it.next();
@@ -2187,7 +2187,7 @@
             Map.Entry entry = (Map.Entry)tables_databaseFieldsToValues.entrySet().iterator().next();
             DatabaseTable table = (DatabaseTable)entry.getKey();
             HashMap databaseFieldsToValues = (HashMap)entry.getValue();
-            Collection primaryKeyFields = tablesToPrimaryKeyFields.values().iterator().next();
+            Collection<DatabaseField> primaryKeyFields = tablesToPrimaryKeyFields.values().iterator().next();
             setSQLStatement(buildUpdateAllStatement(table, databaseFieldsToValues, selectCallForExist, selectStatementForExist, primaryKeyFields));
         } else {
             // To figure out the order of statements we need to find dependencies
@@ -2384,7 +2384,7 @@
             for(int i=0; i < orderedTables.size(); i++) {
                 DatabaseTable table = (DatabaseTable)orderedTables.elementAt(i);
                 HashMap databaseFieldsToValues = (HashMap)tables_databaseFieldsToValues.get(table);
-                Collection primaryKeyFields = tablesToPrimaryKeyFields.get(table);
+                Collection<DatabaseField> primaryKeyFields = tablesToPrimaryKeyFields.get(table);
                 getSQLStatements().addElement(buildUpdateAllStatement(table, databaseFieldsToValues, selectCallForExist, selectStatementForExist, primaryKeyFields));
             }
         }
@@ -2532,7 +2532,7 @@
             rootDescriptor = rootDescriptor.getInheritancePolicy().getRootParentDescriptor();
         }
         Vector allFields = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
-        Iterator it = rootDescriptor.getFields().iterator();
+        Iterator<DatabaseField> it = rootDescriptor.getFields().iterator();
         while(it.hasNext()) {
             DatabaseField field = (DatabaseField)it.next();
             if(rootTable.equals(field.getTable())) {
@@ -2651,7 +2651,7 @@
                 tablesToIgnoreForChildren.addAll(tablesInInsertOrder);
             }
 
-            Iterator it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
+            Iterator<ClassDescriptor> it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
             while (it.hasNext()) {
                 ClassDescriptor childDescriptor = (ClassDescriptor)it.next();
 
@@ -2687,7 +2687,7 @@
         Vector statements = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance(4);
 
         Vector allFields = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
-        Iterator it = getDescriptor().getFields().iterator();
+        Iterator<DatabaseField> it = getDescriptor().getFields().iterator();
         while(it.hasNext()) {
             DatabaseField field = (DatabaseField)it.next();
             if(table.equals(field.getTable())) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/InterfaceContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/InterfaceContainerPolicy.java
index e242265..8ea0a02 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/InterfaceContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/InterfaceContainerPolicy.java
@@ -108,7 +108,7 @@
         }
 
         Method cloneMethod;
-        Class javaClass = container.getClass();
+        Class<? extends Object> javaClass = container.getClass();
         if (javaClass == getContainerClass()) {
             cloneMethod = getCloneMethod();
         } else {
@@ -135,7 +135,7 @@
         try{
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
-                    containerClass = AccessController.doPrivileged(new PrivilegedClassForName(getContainerClassName(), true, classLoader));
+                    containerClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getContainerClassName(), true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(getContainerClassName(), exception.getException());
                 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/JoinedAttributeManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/JoinedAttributeManager.java
index 150be19..9f1a94d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/JoinedAttributeManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/JoinedAttributeManager.java
@@ -253,7 +253,7 @@
         if (getBaseQuery().hasPartialAttributeExpressions()) {
             fieldIndex = getDescriptor().getPrimaryKeyFields().size(); // Query will select pks
             //next check for any partial attributes that are not joined attributes
-            Iterator partialAttributes = ((ObjectLevelReadQuery)getBaseQuery()).getPartialAttributeExpressions().iterator();
+            Iterator<Expression> partialAttributes = ((ObjectLevelReadQuery)getBaseQuery()).getPartialAttributeExpressions().iterator();
             while(partialAttributes.hasNext()){
                 Expression expression = (Expression)partialAttributes.next();
                 if (expression.isQueryKeyExpression()){
@@ -879,7 +879,7 @@
         }
         ObjectBuilder objectBuilder = getDescriptor().getObjectBuilder();
         if (objectBuilder.hasJoinedAttributes()) {
-            List mappingJoinedAttributes = objectBuilder.getJoinedAttributes();
+            List<DatabaseMapping> mappingJoinedAttributes = objectBuilder.getJoinedAttributes();
             if (!hasJoinedAttributeExpressions()) {
                 for (int i = 0; i < mappingJoinedAttributes.size(); i++) {
                     ForeignReferenceMapping mapping = (ForeignReferenceMapping) mappingJoinedAttributes.get(i);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/MapContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/MapContainerPolicy.java
index f825467..5d75295 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/MapContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/MapContainerPolicy.java
@@ -352,7 +352,7 @@
             Class elementClass = null;
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    elementClass = AccessController.doPrivileged(new PrivilegedClassForName(elementClassName, true, classLoader));
+                    elementClass = AccessController.doPrivileged(new PrivilegedClassForName<>(elementClassName, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(containerClassName, exception.getException());
                 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/MappedKeyMapContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/MappedKeyMapContainerPolicy.java
index 35c06f3..21afe47 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/MappedKeyMapContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/MappedKeyMapContainerPolicy.java
@@ -975,7 +975,7 @@
                 }
             }
 
-            Iterator keyIterator = keyObjects.iterator();
+            Iterator<Object> keyIterator = keyObjects.iterator();
             for(Object key : values){
                 addInto(keyIterator.next(), fromCache.get(key), result, session);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/OrderedListContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/OrderedListContainerPolicy.java
index 4f74e4c..bb934e6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/OrderedListContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/OrderedListContainerPolicy.java
@@ -158,7 +158,7 @@
                 failed = true;
                 break;
             }
-            int intOrderValue = (Integer) conversionManager.convertObject(orderValue, Integer.class);
+            int intOrderValue = conversionManager.convertObject(orderValue, Integer.class);
             try {
                 // one or more elements have the same order value
                 if(NOT_SET != ((List)container).set(intOrderValue, elements.get(i))) {
@@ -183,7 +183,7 @@
                 if(orderValue == null) {
                     orderList.add(null);
                 } else {
-                    orderList.add((Integer)conversionManager.convertObject(orderValue, Integer.class));
+                    orderList.add(conversionManager.convertObject(orderValue, Integer.class));
                 }
             }
 
@@ -477,7 +477,7 @@
             ((IndirectList)valueOfTarget).setIsListOrderBrokenInDb(false);
         }
         if (!changeRecord.getOrderedChangeObjectList().isEmpty()) {
-            Iterator objects =changeRecord.getOrderedChangeObjectList().iterator();
+            Iterator<OrderedChangeObject> objects =changeRecord.getOrderedChangeObjectList().iterator();
             while (objects.hasNext()){
                 OrderedChangeObject changeObject = (OrderedChangeObject)objects.next();
                 objectChanges = changeObject.getChangeSet();
@@ -547,7 +547,7 @@
             if (removedIndices.isEmpty()) {
                 // Check if we have removed objects via a
                 // simpleRemoveFromCollectionChangeRecord API call.
-                Iterator removedObjects = changeRecord.getRemoveObjectList().keySet().iterator();
+                Iterator<ObjectChangeSet> removedObjects = changeRecord.getRemoveObjectList().keySet().iterator();
 
                 while (removedObjects.hasNext()) {
                     objectChanges = (ObjectChangeSet) removedObjects.next();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/SortedCollectionContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/SortedCollectionContainerPolicy.java
index 305cb76..b0635d5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/SortedCollectionContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/SortedCollectionContainerPolicy.java
@@ -154,7 +154,7 @@
                 Constructor constructor = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(getContainerClass(), constructClass, false));
+                        constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<Class<?>>(getContainerClass(), constructClass, false));
                         return AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, arguments));
                     } catch (PrivilegedActionException exception) {
                         throw QueryException.couldNotInstantiateContainerClass(getContainerClass(), exception.getException());
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java
index 8761dd5..e7dc532 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedAccessHelper.java
@@ -74,12 +74,12 @@
             SystemProperties.CONCURRENCY_MANAGER_ALLOW_INTERRUPTED_EXCEPTION, SystemProperties.CONCURRENCY_MANAGER_ALLOW_CONCURRENCY_EXCEPTION, SystemProperties.CONCURRENCY_MANAGER_ALLOW_STACK_TRACE_READ_LOCK,
             ServerPlatformBase.JMX_REGISTER_RUN_MBEAN_PROPERTY, ServerPlatformBase.JMX_REGISTER_DEV_MBEAN_PROPERTY,
             XMLPlatformFactory.XML_PLATFORM_PROPERTY};
-    private final static Set<String> legalPropertiesSet = Collections.unmodifiableSet(new HashSet(Arrays.asList(legalProperties)));
+    private final static Set<String> legalPropertiesSet = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(legalProperties)));
 
     private final static String[] exemptedProperties = { "line.separator" };
-    private final static Set<String> exemptedPropertiesSet = Collections.unmodifiableSet(new HashSet(Arrays.asList(exemptedProperties)));
+    private final static Set<String> exemptedPropertiesSet = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(exemptedProperties)));
 
-    private static Map<String, Class> primitiveClasses;
+    private static final Map<String, Class<?>> primitiveClasses;
 
     static {
         primitiveClasses = new HashMap<>();
@@ -109,11 +109,11 @@
      * find the field.  This method is called by the public getDeclaredField() method and does a recursive
      * search for the named field in the given classes or it's superclasses.
      */
-    private static Field findDeclaredField(Class javaClass, String fieldName) throws NoSuchFieldException {
+    private static <T> Field findDeclaredField(Class<T> javaClass, String fieldName) throws NoSuchFieldException {
         try {
             return javaClass.getDeclaredField(fieldName);
         } catch (NoSuchFieldException ex) {
-            Class superclass = javaClass.getSuperclass();
+            Class<? super T> superclass = javaClass.getSuperclass();
             if (superclass == null) {
                 throw ex;
             } else {
@@ -127,13 +127,13 @@
      * find the method.  This method is called by the public getDeclaredMethod() method and does a recursive
      * search for the named method in the given classes or it's superclasses.
      */
-    private static Method findMethod(Class javaClass, String methodName, Class[] methodParameterTypes) throws NoSuchMethodException {
+    private static <T> Method findMethod(Class<T> javaClass, String methodName, Class<?>[] methodParameterTypes) throws NoSuchMethodException {
         try {
             // use a combination of getDeclaredMethod() and recursion to ensure we get the non-public methods
             // getMethod will not help because it returns only public methods
             return javaClass.getDeclaredMethod(methodName, methodParameterTypes);
         } catch (NoSuchMethodException ex) {
-            Class superclass = javaClass.getSuperclass();
+            Class<? super T> superclass = javaClass.getSuperclass();
             if (superclass == null) {
                 throw ex;
             } else {
@@ -149,31 +149,33 @@
     /**
      * Execute a java Class.forName().  Wrap the call in a doPrivileged block if necessary.
      */
-    public static Class getClassForName(final String className) throws ClassNotFoundException {
+    @SuppressWarnings({"unchecked"})
+    public static <T> Class<T> getClassForName(final String className) throws ClassNotFoundException {
         // Check for primitive types.
-        Class primitive = primitiveClasses.get(className);
+        Class<?> primitive = primitiveClasses.get(className);
         if (primitive != null) {
-            return primitive;
+            return (Class<T>) primitive;
         }
-        return Class.forName(className);
+        return (Class<T>) Class.forName(className);
     }
 
     /**
      * Execute a java Class.forName() wrap the call in a doPrivileged block if necessary.
      */
-    public static Class getClassForName(final String className, final boolean initialize, final ClassLoader loader) throws ClassNotFoundException {
+    @SuppressWarnings({"unchecked"})
+    public static <T> Class<T> getClassForName(final String className, final boolean initialize, final ClassLoader loader) throws ClassNotFoundException {
         // Check for primitive types.
-        Class primitive = primitiveClasses.get(className);
+        Class<?> primitive = primitiveClasses.get(className);
         if (primitive != null) {
-            return primitive;
+            return (Class<T>) primitive;
         }
-        return Class.forName(className, initialize, loader);
+        return (Class<T>) Class.forName(className, initialize, loader);
     }
 
     /**
      * Gets the class loader for a given class. Wraps the call in a privileged block if necessary
      */
-    public static ClassLoader getClassLoaderForClass(final Class clazz) {
+    public static ClassLoader getClassLoaderForClass(final Class<?> clazz) {
         return clazz.getClassLoader();
     }
 
@@ -185,18 +187,19 @@
      * @param args An array of classes representing the argument types of the constructor
      * @param shouldSetAccessible whether or not to call the setAccessible API
      */
-    public static Constructor getConstructorFor(final Class javaClass, final Class[] args, final boolean shouldSetAccessible) throws NoSuchMethodException {
-        Constructor result = null;
+    @SuppressWarnings({"unchecked"})
+    public static <T> Constructor<T> getConstructorFor(final Class<T> javaClass, final Class<?>[] args, final boolean shouldSetAccessible) throws NoSuchMethodException {
+        Constructor<T> result = null;
         try {
             result = javaClass.getConstructor(args);
         } catch (NoSuchMethodException missing) {
             // Search for any constructor with the same number of arguments and assignable types.
-            for (Constructor constructor : javaClass.getConstructors()) {
+            for (Constructor<?> constructor : javaClass.getConstructors()) {
                 if (constructor.getParameterTypes().length == args.length) {
                     boolean found = true;
                     for (int index = 0; index < args.length; index++) {
-                        Class parameterType = Helper.getObjectClass(constructor.getParameterTypes()[index]);
-                        Class argType = Helper.getObjectClass(args[index]);
+                        Class<?> parameterType = Helper.getObjectClass(constructor.getParameterTypes()[index]);
+                        Class<?> argType = Helper.getObjectClass(args[index]);
                         if ((!parameterType.isAssignableFrom(argType))
                                 && (!argType.isAssignableFrom(parameterType))) {
                             found = false;
@@ -204,7 +207,7 @@
                         }
                     }
                     if (found) {
-                        result = constructor;
+                        result = (Constructor<T>) constructor;
                         break;
                     }
                 }
@@ -238,8 +241,8 @@
      * @param args An array of classes representing the argument types of the constructor
      * @param shouldSetAccessible whether or not to call the setAccessible API
      */
-    public static Constructor getDeclaredConstructorFor(final Class javaClass, final Class[] args, final boolean shouldSetAccessible) throws NoSuchMethodException {
-        Constructor result = javaClass.getDeclaredConstructor(args);
+    public static <T> Constructor<T> getDeclaredConstructorFor(final Class<T> javaClass, final Class<?>[] args, final boolean shouldSetAccessible) throws NoSuchMethodException {
+        Constructor<T> result = javaClass.getDeclaredConstructor(args);
         if (shouldSetAccessible) {
             if (!result.trySetAccessible()) {
                 AbstractSessionLog.getLog().log(SessionLog.FINE, SessionLog.MISC, "set_accessible",
@@ -257,7 +260,7 @@
      * @param fieldName The name of the field
      * @param shouldSetAccessible whether or not to call the setAccessible API
      */
-    public static Field getField(final Class javaClass, final String fieldName, final boolean shouldSetAccessible) throws NoSuchFieldException {
+    public static Field getField(final Class<?> javaClass, final String fieldName, final boolean shouldSetAccessible) throws NoSuchFieldException {
         Field field = findDeclaredField(javaClass, fieldName);
         if (shouldSetAccessible) {
             if (!field.trySetAccessible()) {
@@ -276,7 +279,7 @@
      * @param fieldName The name of the field
      * @param shouldSetAccessible whether or not to call the setAccessible API
      */
-    public static Field getDeclaredField(final Class javaClass, final String fieldName, final boolean shouldSetAccessible) throws NoSuchFieldException {
+    public static Field getDeclaredField(final Class<?> javaClass, final String fieldName, final boolean shouldSetAccessible) throws NoSuchFieldException {
         Field field = javaClass.getDeclaredField(fieldName);
         if (shouldSetAccessible) {
             if (!field.trySetAccessible()) {
@@ -292,7 +295,7 @@
      * Excludes inherited fields.
      * @param clazz the class to get the fields from.
      */
-    public static Field[] getDeclaredFields(final Class clazz) {
+    public static Field[] getDeclaredFields(final Class<?> clazz) {
         return clazz.getDeclaredFields();
     }
 
@@ -300,7 +303,7 @@
      * Get the list of public fields in a class.  Wrap the call in doPrivileged if necessary
      * @param clazz the class to get the fields from.
      */
-    public static Field[] getFields(final Class clazz) {
+    public static Field[] getFields(final Class<?> clazz) {
         return clazz.getFields();
     }
 
@@ -313,7 +316,7 @@
      * @param methodParameterTypes a list of classes representing the classes of the
      *  parameters of the method.
      */
-    public static Method getDeclaredMethod(final Class clazz, final String methodName, final Class[] methodParameterTypes) throws NoSuchMethodException {
+    public static Method getDeclaredMethod(final Class<?> clazz, final String methodName, final Class<?>[] methodParameterTypes) throws NoSuchMethodException {
          return clazz.getDeclaredMethod(methodName, methodParameterTypes);
     }
 
@@ -328,7 +331,7 @@
      * @param methodParameterTypes A list of classes representing the classes of the parameters of the mthod
      * @param shouldSetAccessible whether or not to call the setAccessible API
      */
-    public static Method getMethod(final Class javaClass, final String methodName, final Class[] methodParameterTypes, final boolean shouldSetAccessible) throws NoSuchMethodException {
+    public static Method getMethod(final Class<?> javaClass, final String methodName, final Class<?>[] methodParameterTypes, final boolean shouldSetAccessible) throws NoSuchMethodException {
         Method method = findMethod(javaClass, methodName, methodParameterTypes);
         if (shouldSetAccessible) {
             if (!method.trySetAccessible()) {
@@ -350,7 +353,7 @@
      * @param methodParameterTypes A list of classes representing the classes of the parameters of the method
      * @param shouldSetAccessible whether or not to call the setAccessible API
      */
-    public static Method getPublicMethod(final Class javaClass, final String methodName, final Class[] methodParameterTypes, final boolean shouldSetAccessible) throws NoSuchMethodException {
+    public static Method getPublicMethod(final Class<?> javaClass, final String methodName, final Class<?>[] methodParameterTypes, final boolean shouldSetAccessible) throws NoSuchMethodException {
         // Return the (public) method - will traverse superclass(es) if necessary
         Method method = javaClass.getMethod(methodName, methodParameterTypes);
         if (shouldSetAccessible) {
@@ -367,15 +370,16 @@
      * necessary. Excludes inherited methods.
      * @param clazz the class to get the methods from.
      */
-    public static Method[] getDeclaredMethods(final Class clazz) {
+    public static Method[] getDeclaredMethods(final Class<?> clazz) {
         return clazz.getDeclaredMethods();
     }
 
     /**
      * Get the return type for a given method. Wrap the call in doPrivileged if necessary.
      */
-    public static Class getFieldType(final Field field) {
-        return field.getType();
+    @SuppressWarnings({"unchecked"})
+    public static <T> Class<T> getFieldType(final Field field) {
+        return (Class<T>) field.getType();
     }
 
     /**
@@ -410,7 +414,7 @@
      *         does not exist.
      * @since 2.6.2
      */
-    public static final String getSystemProperty(final String key) {
+    public static String getSystemProperty(final String key) {
         if (isIllegalProperty(key)) {
             throw new IllegalArgumentException(
                     ExceptionLocalization.buildMessage("unexpect_argument", new Object[] {key}));
@@ -431,7 +435,7 @@
      *         does not exist.
      * @since 2.6.2
      */
-    public static final String getSystemProperty(final String key, final String def) {
+    public static String getSystemProperty(final String key, final String def) {
         if (isIllegalProperty(key)) {
             throw new IllegalArgumentException(
                     ExceptionLocalization.buildMessage("unexpect_argument", new Object[] {key}));
@@ -453,7 +457,7 @@
      *         {@code false} otherwise.
      * @since 2.6.3
      */
-    public static final boolean getSystemPropertyBoolean(final String key, final boolean def) {
+    public static boolean getSystemPropertyBoolean(final String key, final boolean def) {
         return TRUE_STRING.equalsIgnoreCase(
                 getSystemProperty(key, def ? TRUE_STRING : ""));
     }
@@ -463,7 +467,7 @@
      * Get the line separator character.
      * @return The {@link String} containing the platform-appropriate characters for line separator.
      */
-    public static final String getLineSeparator() {
+    public static String getLineSeparator() {
         return getSystemProperty("line.separator");
     }
 
@@ -471,16 +475,17 @@
      * Get the list of parameter types for a given method.  Wrap the call in doPrivileged if necessary.
      * @param method The method to get the parameter types of
      */
-    public static Class[] getMethodParameterTypes(final Method method) {
+    public static Class<?>[] getMethodParameterTypes(final Method method) {
         return method.getParameterTypes();
     }
 
     /**
      * Get the return type for a given method. Wrap the call in doPrivileged if necessary.
      */
-    public static Class getMethodReturnType(final Method method) {
+    @SuppressWarnings({"unchecked"})
+    public static <T> Class<T> getMethodReturnType(final Method method) {
         // 323148: a null method as a possible problem with module ordering breaking weaving - has been trapped by implementors of this method.
-        return method.getReturnType();
+        return (Class<T>) method.getReturnType();
     }
 
     /**
@@ -488,22 +493,23 @@
      * necessary. This call will traverse the superclasses.
      * @param clazz the class to get the methods from.
      */
-    public static Method[] getMethods(final Class clazz) {
+    public static Method[] getMethods(final Class<?> clazz) {
         return clazz.getMethods();
     }
 
     /**
      * Get the value of the given field in the given object.
      */
-    public static Object getValueFromField(final Field field, final Object object) throws IllegalAccessException {
-        return field.get(object);
+    @SuppressWarnings({"unchecked"})
+    public static <T> T getValueFromField(final Field field, final Object object) throws IllegalAccessException {
+        return (T) field.get(object);
     }
 
     /**
      * Construct an object with the given Constructor and the given array of arguments.  Wrap the call in a
      * doPrivileged block if necessary.
      */
-    public static Object invokeConstructor(final Constructor constructor, final Object[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
+    public static <T> T invokeConstructor(final Constructor<T> constructor, final Object[] args) throws IllegalAccessException, InvocationTargetException, InstantiationException {
         return constructor.newInstance(args);
     }
 
@@ -511,7 +517,7 @@
      * Invoke the givenMethod on a givenObject. Assumes method does not take
      * parameters. Wrap in a doPrivileged block if necessary.
      */
-    public static Object invokeMethod(final Method method, final Object object) throws IllegalAccessException, InvocationTargetException {
+    public static <T> T invokeMethod(final Method method, final Object object) throws IllegalAccessException, InvocationTargetException {
         return invokeMethod(method, object, null);
     }
 
@@ -519,7 +525,8 @@
      * Invoke the givenMethod on a givenObject using the array of parameters given.  Wrap in a doPrivileged block
      * if necessary.
      */
-    public static Object invokeMethod(final Method method, final Object object, final Object[] parameters) throws IllegalAccessException, InvocationTargetException {
+    @SuppressWarnings({"unchecked"})
+    public static <T> T invokeMethod(final Method method, final Object object, final Object[] parameters) throws IllegalAccessException, InvocationTargetException {
         // Ensure the method is accessible.
         if (!method.isAccessible()) {
             if (!method.trySetAccessible()) {
@@ -527,7 +534,7 @@
                         "method", method.getName(), method.getDeclaringClass().getName() + " for invokation");
             }
         }
-        return method.invoke(object, parameters);
+        return (T) method.invoke(object, parameters);
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedClassForName.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedClassForName.java
index a3e9c88..fedca13 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedClassForName.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedClassForName.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
@@ -16,7 +16,7 @@
 
 import java.security.PrivilegedExceptionAction;
 
-public class PrivilegedClassForName  implements PrivilegedExceptionAction<Class> {
+public class PrivilegedClassForName<T> implements PrivilegedExceptionAction<Class<T>> {
 
     private final String className;
     private boolean initialize;
@@ -33,7 +33,7 @@
     }
 
     @Override
-    public Class run() throws ClassNotFoundException {
+    public Class<T> run() throws ClassNotFoundException {
         if (loader == null){
             return PrivilegedAccessHelper.getClassForName(className);
         } else {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedGetClassLoaderForClass.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedGetClassLoaderForClass.java
index 6ee4cb6..b56f23b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedGetClassLoaderForClass.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedGetClassLoaderForClass.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
@@ -18,9 +18,9 @@
 
 public class PrivilegedGetClassLoaderForClass implements PrivilegedExceptionAction<ClassLoader> {
 
-    private final Class clazz;
+    private final Class<?> clazz;
 
-    public PrivilegedGetClassLoaderForClass(Class clazz) {
+    public PrivilegedGetClassLoaderForClass(Class<?> clazz) {
         this.clazz = clazz;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedGetConstructorFor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedGetConstructorFor.java
index 954445d..0e6d7e0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedGetConstructorFor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedGetConstructorFor.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
@@ -17,20 +17,20 @@
 import java.lang.reflect.Constructor;
 import java.security.PrivilegedExceptionAction;
 
-public class PrivilegedGetConstructorFor implements PrivilegedExceptionAction<Constructor> {
+public class PrivilegedGetConstructorFor<T> implements PrivilegedExceptionAction<Constructor<T>> {
 
-    private final Class javaClass;
+    private final Class<T> javaClass;
     private final Class[] args;
     private final boolean shouldSetAccessible;
 
-    public PrivilegedGetConstructorFor(Class javaClass, Class[] args, boolean shouldSetAccessible) {
+    public PrivilegedGetConstructorFor(Class<T> javaClass, Class[] args, boolean shouldSetAccessible) {
         this.javaClass = javaClass;
         this.args = args;
         this.shouldSetAccessible = shouldSetAccessible;
     }
 
     @Override
-    public Constructor run() throws NoSuchMethodException {
+    public Constructor<T> run() throws NoSuchMethodException {
         return PrivilegedAccessHelper.getConstructorFor(javaClass, args, shouldSetAccessible);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedInvokeConstructor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedInvokeConstructor.java
index b96b28d..75032ca 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedInvokeConstructor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedInvokeConstructor.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
@@ -18,19 +18,19 @@
 import java.lang.reflect.InvocationTargetException;
 import java.security.PrivilegedExceptionAction;
 
-public class PrivilegedInvokeConstructor implements PrivilegedExceptionAction {
+public class PrivilegedInvokeConstructor<T> implements PrivilegedExceptionAction<T> {
 
-    private final Constructor constructor;
+    private final Constructor<T> constructor;
     private final Object[] args;
 
-    public PrivilegedInvokeConstructor(Constructor constructor, Object[] args) {
+    public PrivilegedInvokeConstructor(Constructor<T> constructor, Object[] args) {
         this.constructor = constructor;
         this.args = args;
     }
 
     @Override
-    public Object run() throws InstantiationException, InvocationTargetException, IllegalAccessException {
-        return PrivilegedAccessHelper.invokeConstructor(constructor, args);
+    public T run() throws InstantiationException, InvocationTargetException, IllegalAccessException {
+        return PrivilegedAccessHelper.<T>invokeConstructor(constructor, args);
     }
 }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedMethodInvoker.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedMethodInvoker.java
index 5df06f3..b7d1072 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedMethodInvoker.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/PrivilegedMethodInvoker.java
@@ -37,7 +37,7 @@
 
     @Override
     public T run() throws IllegalAccessException, InvocationTargetException {
-        return (T) PrivilegedAccessHelper.invokeMethod(method, target, args);
+        return PrivilegedAccessHelper.invokeMethod(method, target, args);
     }
 
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/SecurableObjectHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/SecurableObjectHolder.java
index 756d21e..2b03fd2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/SecurableObjectHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/security/SecurableObjectHolder.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
@@ -86,7 +86,7 @@
 
         try {
             ConversionManager cm = ConversionManager.getDefaultManager();
-            Class securableClass = (Class)cm.convertObject(m_securableClassName, Class.class);
+            Class securableClass = cm.convertObject(m_securableClassName, Class.class);
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
                     m_securableObject = (Securable)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(securableClass));
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SessionBrokerSequencing.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SessionBrokerSequencing.java
index 6908222..67be2da 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SessionBrokerSequencing.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SessionBrokerSequencing.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
@@ -15,7 +15,7 @@
 package org.eclipse.persistence.internal.sequencing;
 
 import java.util.Iterator;
-import org.eclipse.persistence.internal.sequencing.Sequencing;
+
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.sessions.broker.SessionBroker;
 
@@ -25,7 +25,7 @@
 
     public static boolean atLeastOneSessionHasSequencing(SessionBroker br) {
         boolean hasSequencing = false;
-        Iterator sessionEnum = br.getSessionsByName().values().iterator();
+        Iterator<AbstractSession> sessionEnum = br.getSessionsByName().values().iterator();
         while (sessionEnum.hasNext() && !hasSequencing) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             hasSequencing = session.getSequencing() != null;
@@ -41,7 +41,7 @@
     protected void initialize() {
         whenShouldAcquireValueForAll = UNDEFINED;
         boolean first = true;
-        Iterator sessionEnum = broker.getSessionsByName().values().iterator();
+        Iterator<AbstractSession> sessionEnum = broker.getSessionsByName().values().iterator();
         while ((first || (whenShouldAcquireValueForAll != UNDEFINED)) && sessionEnum.hasNext()) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             Sequencing sequencing = session.getSequencing();
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 bc45c40..f80509a 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
@@ -238,7 +238,7 @@
     transient protected ClassDescriptor lastDescriptorAccessed;
 
     /** PERF: cache descriptors from project. */
-    transient protected Map<Class, ClassDescriptor> descriptors;
+    transient protected Map<Class<?>, ClassDescriptor> descriptors;
 
     /** PERF: cache table per tenant descriptors needing to be initialized per EM */
     transient protected List<ClassDescriptor> tablePerTenantDescriptors;
@@ -335,7 +335,7 @@
     transient protected Serializer serializer;
 
     /** Allow CDI injection of entity listeners **/
-    transient protected InjectionManager injectionManager;
+    transient protected InjectionManager<?> injectionManager;
 
     /**
      * Indicates whether ObjectLevelReadQuery should by default use ResultSet Access optimization.
@@ -461,7 +461,7 @@
             // use class.forName() to avoid loading parser classes for JAXB
             // Use Class.forName not thread class loader to avoid class loader issues.
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                parserClass = AccessController.doPrivileged(new PrivilegedClassForName(queryBuilderClassName));
+                parserClass = AccessController.doPrivileged(new PrivilegedClassForName<>(queryBuilderClassName));
                 builder = (JPAQueryBuilder)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(parserClass));
             } else {
                 parserClass = PrivilegedAccessHelper.getClassForName(queryBuilderClassName);
@@ -1179,13 +1179,13 @@
     public <T> InjectionManager<T> createInjectionManager(Object beanManager){
         try{
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    Class elim = AccessController.doPrivileged(new PrivilegedClassForName(InjectionManager.DEFAULT_CDI_INJECTION_MANAGER, true, getLoader()));
-                    Constructor constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(elim, new Class[] {String.class}, false));
-                    return (InjectionManager<T>) AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, new Object[] {beanManager}));
+                    Class<InjectionManager<T>> elim = AccessController.doPrivileged(new PrivilegedClassForName<>(InjectionManager.DEFAULT_CDI_INJECTION_MANAGER, true, getLoader()));
+                    Constructor<InjectionManager<T>> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<InjectionManager<T>>(elim, new Class[] {String.class}, false));
+                    return AccessController.doPrivileged(new PrivilegedInvokeConstructor<InjectionManager<T>>(constructor, new Object[] {beanManager}));
             } else {
-                Class elim = org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(InjectionManager.DEFAULT_CDI_INJECTION_MANAGER, true, getLoader());
-                Constructor constructor = PrivilegedAccessHelper.getConstructorFor(elim, new Class[] {Object.class}, false);
-                return (InjectionManager<T>) PrivilegedAccessHelper.invokeConstructor(constructor, new Object[] {beanManager});
+                Class<InjectionManager<T>> elim = org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(InjectionManager.DEFAULT_CDI_INJECTION_MANAGER, true, getLoader());
+                Constructor<InjectionManager<T>> constructor = PrivilegedAccessHelper.<InjectionManager<T>>getConstructorFor(elim, new Class[] {Object.class}, false);
+                return PrivilegedAccessHelper.<InjectionManager<T>>invokeConstructor(constructor, new Object[] {beanManager});
             }
         } catch (Exception e){
             logThrowable(SessionLog.FINEST, SessionLog.JPA, e);
@@ -2301,7 +2301,7 @@
         if (injectionManager == null){
             injectionManager = createInjectionManager(this.getProperty(PersistenceUnitProperties.CDI_BEANMANAGER));
         }
-        return injectionManager;
+        return (InjectionManager<T>) injectionManager;
     }
 
     /**
@@ -2510,7 +2510,7 @@
      * Return all registered descriptors.
      */
     @Override
-    public Map<Class, ClassDescriptor> getDescriptors() {
+    public Map<Class<?>, ClassDescriptor> getDescriptors() {
         return this.project.getDescriptors();
     }
 
@@ -2995,7 +2995,7 @@
      */
     public List<DatabaseQuery> getAllQueries() {
         Vector allQueries = new Vector();
-        for (Iterator vectors = getQueries().values().iterator(); vectors.hasNext();) {
+        for (Iterator<List<DatabaseQuery>> vectors = getQueries().values().iterator(); vectors.hasNext();) {
             allQueries.addAll((Vector)vectors.next());
         }
         return allQueries;
@@ -3957,7 +3957,7 @@
     }
 
     public void setInjectionManager(
-            InjectionManager injectionManager) {
+            InjectionManager<?> injectionManager) {
         this.injectionManager = injectionManager;
     }
 
@@ -4964,9 +4964,9 @@
      */
     public void copyDescriptorNamedQueries(boolean allowSameQueryNameDiffArgsCopyToSession) {
         for (ClassDescriptor descriptor : getProject().getOrderedDescriptors()) {
-            Map queries  = descriptor.getQueryManager().getQueries();
+            Map<String, List<DatabaseQuery>> queries  = descriptor.getQueryManager().getQueries();
             if ((queries != null) && (queries.size() > 0)) {
-                for (Iterator keyValueItr = queries.entrySet().iterator(); keyValueItr.hasNext();){
+                for (Iterator<Map.Entry<String, List<DatabaseQuery>>> keyValueItr = queries.entrySet().iterator(); keyValueItr.hasNext();){
                     Map.Entry entry = (Map.Entry) keyValueItr.next();
                     Vector thisQueries = (Vector)entry.getValue();
                     if ((thisQueries != null) && (thisQueries.size() > 0)){
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CollectionChangeRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CollectionChangeRecord.java
index 4c253fe..bc64f06 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CollectionChangeRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CollectionChangeRecord.java
@@ -263,7 +263,7 @@
             }
         }
         Map<ObjectChangeSet, ObjectChangeSet> changeSets = new HashMap<>();
-        Iterator addEnum = ((CollectionChangeRecord)mergeFromRecord).getAddObjectList().keySet().iterator();
+        Iterator<ObjectChangeSet> addEnum = ((CollectionChangeRecord)mergeFromRecord).getAddObjectList().keySet().iterator();
         while (addEnum.hasNext()) {
             ObjectChangeSet mergingObject = (ObjectChangeSet)addEnum.next();
             ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet(mergingObject, mergeFromChangeSet);
@@ -275,7 +275,7 @@
         }
         getAddObjectList().putAll(changeSets);
         changeSets = new HashMap<>();
-        Iterator removeEnum = ((CollectionChangeRecord)mergeFromRecord).getRemoveObjectList().keySet().iterator();
+        Iterator<ObjectChangeSet> removeEnum = ((CollectionChangeRecord)mergeFromRecord).getRemoveObjectList().keySet().iterator();
         while (removeEnum.hasNext()) {
             ObjectChangeSet mergingObject = (ObjectChangeSet)removeEnum.next();
             ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet(mergingObject, mergeFromChangeSet);
@@ -288,7 +288,7 @@
         getRemoveObjectList().putAll(changeSets);
         //237545: merge the changes for ordered list's attribute change tracking. (still need to check if deferred changes need to be merged)
         List<OrderedChangeObject> orderedChangeSets = new ArrayList<>();
-        Iterator orderedChangeObjectEnum = ((CollectionChangeRecord)mergeFromRecord).getOrderedChangeObjectList().iterator();
+        Iterator<OrderedChangeObject> orderedChangeObjectEnum = ((CollectionChangeRecord)mergeFromRecord).getOrderedChangeObjectList().iterator();
         while (orderedChangeObjectEnum.hasNext()) {
             OrderedChangeObject changeObject = (OrderedChangeObject)orderedChangeObjectEnum.next();
             ObjectChangeSet mergingObject = changeObject.getChangeSet();
@@ -360,7 +360,7 @@
             setOrderedRemoveObjects(orderedRemoveList);
             // Don't need to worry about the vector of indices (Integer's), just leave them as is.
         } else {
-            Iterator changes = getAddObjectList().values().iterator();
+            Iterator<ObjectChangeSet> changes = getAddObjectList().values().iterator();
             while (changes.hasNext()) {
                 ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet((ObjectChangeSet)changes.next(), mergeFromChangeSet);
                 addList.put(localChangeSet, localChangeSet);
@@ -528,14 +528,14 @@
        ContainerPolicy cp = this.mapping.getContainerPolicy();
        if(orderedChangeObjectList == null || orderedChangeObjectList.isEmpty()) {
            if(this.removeObjectList != null) {
-               Iterator it = this.removeObjectList.keySet().iterator();
+               Iterator<ObjectChangeSet> it = this.removeObjectList.keySet().iterator();
                while(it.hasNext()) {
                    ObjectChangeSet changeSet = (ObjectChangeSet)it.next();
                    cp.addInto(changeSet.getUnitOfWorkClone(), currentCollection, session);
                }
            }
            if(this.addObjectList != null) {
-               Iterator it = this.addObjectList.keySet().iterator();
+               Iterator<ObjectChangeSet> it = this.addObjectList.keySet().iterator();
                while(it.hasNext()) {
                    ObjectChangeSet changeSet = (ObjectChangeSet)it.next();
                    cp.removeFrom(changeSet.getUnitOfWorkClone(), currentCollection, session);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitManager.java
index 985e69f..3663924 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitManager.java
@@ -153,7 +153,7 @@
                 }
             } else {
                 // The commit order is all of the classes ordered by dependencies, this is done for deadlock avoidance.
-                List commitOrder = getCommitOrder();
+                List<Class> commitOrder = getCommitOrder();
                 int size = commitOrder.size();
                 for (int index = 0; index < size; index++) {
                     Class theClass = (Class)commitOrder.get(index);
@@ -311,7 +311,7 @@
             if (objects.size() == 1) {
                 deleteAllObjects(objects.get(0).getClass(), objects, session);
             } else {
-                List commitOrder = getCommitOrder();
+                List<Class> commitOrder = getCommitOrder();
                 for (int orderIndex = commitOrder.size() - 1; orderIndex >= 0; orderIndex--) {
                     Class theClass = (Class)commitOrder.get(orderIndex);
                     deleteAllObjects(theClass, objects, session);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitOrderDependencyNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitOrderDependencyNode.java
index 6e6281a..9f2ef3f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitOrderDependencyNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitOrderDependencyNode.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
@@ -100,8 +100,8 @@
      * If my superclass is related to a class, I'm related to it.
      */
     public void recordMappingDependencies() {
-        for (Enumeration mappings = getDescriptor().getMappings().elements();
-                 mappings.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappings = getDescriptor().getMappings().elements();
+             mappings.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
             if (mapping.isForeignReferenceMapping()) {
                 if (mapping.hasConstraintDependency()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/IdentityMapAccessor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/IdentityMapAccessor.java
index 83584e3..7884a8c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/IdentityMapAccessor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/IdentityMapAccessor.java
@@ -855,7 +855,7 @@
         //removed synchronization that would result in deadlock
         //no need to synchronize as changes to identity map will not aversely affect this code
         //bug 275724: IdentityMapAccessor.invalidateClass() should not check ReadLock when invalidating
-        Enumeration keys = identityMap.keys(false); // do not check readlock
+        Enumeration<CacheKey> keys = identityMap.keys(false); // do not check readlock
         while (keys.hasMoreElements()) {
             CacheKey key = (CacheKey)keys.nextElement();
             Object obj = key.getObject();
@@ -1070,7 +1070,7 @@
      */
     @Override
     public Object removeFromIdentityMap(Object object) {
-        Class theClass = object.getClass();
+        Class<? extends Object> theClass = object.getClass();
         return removeFromIdentityMap(getSession().getId(object), theClass, getSession().getDescriptor(theClass), object);
     }
 
@@ -1153,7 +1153,7 @@
         };
 
         iterator.setSession(getSession());
-        Iterator descriptors = getSession().getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
             IdentityMap cache = getIdentityMap(descriptor, true);
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 5c955e3..4cc9f00 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
@@ -336,7 +336,7 @@
     }
 
     public void recordMerge(Object key, Object value, AbstractSession targetSession) {
-        Map sessionMap = this.objectsAlreadyMerged.get(targetSession);
+        Map<Object, Object> sessionMap = this.objectsAlreadyMerged.get(targetSession);
         if (sessionMap == null){
             sessionMap = new IdentityHashMap();
             this.objectsAlreadyMerged.put(targetSession, sessionMap);
@@ -345,7 +345,7 @@
     }
 
     public boolean isAlreadyMerged(Object object, AbstractSession targetSession) {
-        Map sessionMap = this.objectsAlreadyMerged.get(targetSession);
+        Map<Object, Object> sessionMap = this.objectsAlreadyMerged.get(targetSession);
         if (sessionMap == null){
             return false;
         }
@@ -353,7 +353,7 @@
     }
 
     public Object getMergedObject(Object key, AbstractSession targetSession){
-        Map sessionMap = this.objectsAlreadyMerged.get(targetSession);
+        Map<Object, Object> sessionMap = this.objectsAlreadyMerged.get(targetSession);
         if (sessionMap == null){
             return null;
         }
@@ -435,7 +435,7 @@
             }
             // Iterate over each clone and let the object build merge to clones into the originals.
             this.session.getIdentityMapAccessorInstance().getWriteLockManager().acquireRequiredLocks(this, uowChangeSet);
-            Iterator objectChangeEnum = uowChangeSet.getAllChangeSets().keySet().iterator();
+            Iterator<ObjectChangeSet> objectChangeEnum = uowChangeSet.getAllChangeSets().keySet().iterator();
             Set<Class> classesChanged = new HashSet<>();
             while (objectChangeEnum.hasNext()) {
                 ObjectChangeSet objectChangeSet = (ObjectChangeSet)objectChangeEnum.next();
@@ -454,7 +454,7 @@
                 classesChanged.add(objectChangeSet.getClassType(this.session));
             }
             if (uowChangeSet.hasDeletedObjects()) {
-                Iterator deletedObjects = uowChangeSet.getDeletedObjects().values().iterator();
+                Iterator<ObjectChangeSet> deletedObjects = uowChangeSet.getDeletedObjects().values().iterator();
                 while (deletedObjects.hasNext()) {
                     ObjectChangeSet changeSet = (ObjectChangeSet)deletedObjects.next();
                     changeSet.removeFromIdentityMap(this.session);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ObjectChangeSet.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ObjectChangeSet.java
index b069f27..c4eeb0b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ObjectChangeSet.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ObjectChangeSet.java
@@ -27,6 +27,7 @@
 import org.eclipse.persistence.descriptors.FetchGroupManager;
 import org.eclipse.persistence.descriptors.TimestampLockingPolicy;
 import org.eclipse.persistence.descriptors.VersionLockingPolicy;
+import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.descriptors.OptimisticLockingPolicy;
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.internal.identitymaps.CacheKey;
@@ -63,7 +64,7 @@
             // Sort by changes to keep same SQL together for batching.
             if ((left.changes != null) && right.changes != null) {
                 int size = left.changes.size();
-                List otherChanges = right.changes;
+                List<org.eclipse.persistence.sessions.changesets.ChangeRecord> otherChanges = right.changes;
                 int otherSize = otherChanges.size();
                 if (size > otherSize) {
                     return 1;
@@ -192,7 +193,7 @@
         }
         String attributeName = changeRecord.getAttribute();
         Map attributeToChanges = getAttributesToChanges();
-        List changes = getChanges();
+        List<org.eclipse.persistence.sessions.changesets.ChangeRecord> changes = getChanges();
         ChangeRecord existingChangeRecord = (ChangeRecord)attributeToChanges.get(attributeName);
         // change tracking may add a change to an existing attribute fix that here.
         if (existingChangeRecord != null) {
@@ -346,7 +347,7 @@
     @Override
     public Class getClassType(org.eclipse.persistence.sessions.Session session) {
         if (classType == null) {
-            classType = (Class) session.getDatasourcePlatform().getConversionManager().convertObject(getClassName(), ClassConstants.CLASS);
+            classType = session.getDatasourcePlatform().getConversionManager().convertObject(getClassName(), ClassConstants.CLASS);
         }
         return classType;
     }
@@ -781,7 +782,7 @@
                 }
             }
         }
-        List changesToMerge = changeSetToMergeFrom.getChanges();
+        List<org.eclipse.persistence.sessions.changesets.ChangeRecord> changesToMerge = changeSetToMergeFrom.getChanges();
         int size = changesToMerge.size();
         for (int index = 0; index < size; ++index) {
             ChangeRecord record = (ChangeRecord)changesToMerge.get(index);
@@ -1186,8 +1187,8 @@
      */
     protected void rebuildWriteLockValueFromUserFormat(ClassDescriptor descriptor, AbstractSession session) {
         if (descriptor.getOptimisticLockingPolicy() instanceof TimestampLockingPolicy) {
-            this.writeLockValue = session.getPlatform(descriptor.getJavaClass()).getConversionManager().convertObject(this.writeLockValue, ClassConstants.JavaSqlTimestamp_Class);
-            this.initialWriteLockValue = session.getPlatform(descriptor.getJavaClass()).getConversionManager().convertObject(this.initialWriteLockValue, ClassConstants.JavaSqlTimestamp_Class);
+            this.writeLockValue = session.getPlatform(descriptor.getJavaClass()).getConversionManager().convertObject(this.writeLockValue, CoreClassConstants.TIMESTAMP);
+            this.initialWriteLockValue = session.getPlatform(descriptor.getJavaClass()).getConversionManager().convertObject(this.initialWriteLockValue, CoreClassConstants.TIMESTAMP);
         } else if (descriptor.getOptimisticLockingPolicy() instanceof VersionLockingPolicy) {
             this.writeLockValue = session.getPlatform(descriptor.getJavaClass()).getConversionManager().convertObject(this.writeLockValue, ClassConstants.BIGDECIMAL);
             this.initialWriteLockValue = session.getPlatform(descriptor.getJavaClass()).getConversionManager().convertObject(this.initialWriteLockValue, ClassConstants.BIGDECIMAL);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/RepeatableWriteUnitOfWork.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/RepeatableWriteUnitOfWork.java
index f1ca712..dc38f57 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/RepeatableWriteUnitOfWork.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/RepeatableWriteUnitOfWork.java
@@ -139,7 +139,7 @@
                     if (this.classesToBeInvalidated == null) {
                         this.classesToBeInvalidated = new HashSet<>();
                     }
-                    Iterator enumDeleted = this.unregisteredDeletedObjectsCloneToBackupAndOriginal.keySet().iterator();
+                    Iterator<Object> enumDeleted = this.unregisteredDeletedObjectsCloneToBackupAndOriginal.keySet().iterator();
                     // classes of the deleted objects should be invalidated in the shared cache
                     while (enumDeleted.hasNext()) {
                         this.classesToBeInvalidated.add(getDescriptor(enumDeleted.next().getClass()));
@@ -649,8 +649,8 @@
      */
     public Object getUnregisteredDeletedCloneForOriginal(Object original) {
         if (unregisteredDeletedObjectsCloneToBackupAndOriginal != null) {
-            Iterator keys = unregisteredDeletedObjectsCloneToBackupAndOriginal.keySet().iterator();
-            Iterator values = unregisteredDeletedObjectsCloneToBackupAndOriginal.values().iterator();
+            Iterator<Object> keys = unregisteredDeletedObjectsCloneToBackupAndOriginal.keySet().iterator();
+            Iterator<Object> values = unregisteredDeletedObjectsCloneToBackupAndOriginal.values().iterator();
             while(keys.hasNext()) {
                 Object deletedObjectClone = keys.next();
                 Object[] backupAndOriginal = (Object[])values.next();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/SessionBrokerIdentityMapAccessor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/SessionBrokerIdentityMapAccessor.java
index f31be04..e237cd7 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/SessionBrokerIdentityMapAccessor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/SessionBrokerIdentityMapAccessor.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
@@ -15,7 +15,6 @@
 package org.eclipse.persistence.internal.sessions;
 
 import org.eclipse.persistence.internal.identitymaps.*;
-import org.eclipse.persistence.internal.sessions.IdentityMapAccessor;
 import org.eclipse.persistence.sessions.broker.*;
 import java.util.*;
 
@@ -40,8 +39,8 @@
      */
     @Override
     public void initializeAllIdentityMaps() {
-        for (Iterator sessionEnum = ((SessionBroker)session).getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = ((SessionBroker)session).getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.getIdentityMapAccessorInstance().initializeAllIdentityMaps();
         }
@@ -58,8 +57,8 @@
      */
     @Override
     public void initializeIdentityMaps() {
-        for (Iterator sessionEnum = ((SessionBroker)session).getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = ((SessionBroker)session).getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.getIdentityMapAccessorInstance().initializeIdentityMaps();
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkChangeSet.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkChangeSet.java
index ef2b08f..a3929b9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkChangeSet.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/UnitOfWorkChangeSet.java
@@ -598,7 +598,7 @@
      * inserted and added to the objectChangesList
      */
     public void removeObjectChangeSetFromNewList(ObjectChangeSet objectChangeSet, AbstractSession session) {
-        Map table = getNewObjectChangeSets().get(objectChangeSet.getClassType(session));
+        Map<ObjectChangeSet, ObjectChangeSet> table = getNewObjectChangeSets().get(objectChangeSet.getClassType(session));
         if (table != null) {
             table.remove(objectChangeSet);
         }
@@ -616,7 +616,7 @@
         if (changeSet.isAggregate()) {
             getAggregateChangeSets().remove(changeSet);
         } else {
-            Map classChanges = getObjectChanges().get(object.getClass());
+            Map<ObjectChangeSet, ObjectChangeSet> classChanges = getObjectChanges().get(object.getClass());
             if (classChanges != null) {
                 classChanges.remove(changeSet);
             }
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 b28d29a..715c7d1 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
@@ -3812,8 +3812,8 @@
     protected void postMergeChanges(Set classesChanged) {
         //bug 4730595: objects removed during flush are not removed from the cache during commit
         if (this.unitOfWorkChangeSet.hasDeletedObjects()) {
-            Map deletedObjects = this.unitOfWorkChangeSet.getDeletedObjects();
-            for (Iterator removedObjects = deletedObjects.keySet().iterator(); removedObjects.hasNext(); ) {
+            Map<ObjectChangeSet, ObjectChangeSet> deletedObjects = this.unitOfWorkChangeSet.getDeletedObjects();
+            for (Iterator<ObjectChangeSet> removedObjects = deletedObjects.keySet().iterator(); removedObjects.hasNext(); ) {
                 ObjectChangeSet removedObjectChangeSet = (ObjectChangeSet) removedObjects.next();
                 Object primaryKey = removedObjectChangeSet.getId();
                 ClassDescriptor descriptor = removedObjectChangeSet.getDescriptor();
@@ -5426,7 +5426,7 @@
     public void resumeUnitOfWork() {
         // Resume new objects.
         if (hasNewObjects() && !this.isNestedUnitOfWork) {
-            Iterator newEntries = this.newObjectsCloneToOriginal.entrySet().iterator();
+            Iterator<Map.Entry<Object, Object>> newEntries = this.newObjectsCloneToOriginal.entrySet().iterator();
             Map cloneToOriginals = getCloneToOriginals();
             while (newEntries.hasNext()) {
                 Map.Entry entry = (Map.Entry)newEntries.next();
@@ -5468,7 +5468,7 @@
             if (this.unregisteredDeletedObjectsCloneToBackupAndOriginal == null) {
                 this.unregisteredDeletedObjectsCloneToBackupAndOriginal = new IdentityHashMap(this.objectsDeletedDuringCommit.size());
             }
-            Iterator iterator = this.objectsDeletedDuringCommit.keySet().iterator();
+            Iterator<Object> iterator = this.objectsDeletedDuringCommit.keySet().iterator();
             Map cloneToOriginals = getCloneToOriginals();
             while (iterator.hasNext()) {
                 Object deletedObject = iterator.next();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/coordination/CommandPropagator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/coordination/CommandPropagator.java
index 5f8f17a..9397a86 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/coordination/CommandPropagator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/coordination/CommandPropagator.java
@@ -87,7 +87,7 @@
      */
     public void synchronousPropagateCommand() {
         rcm.logDebug("sync_propagation", null);
-        Iterator connections = rcm.getTransportManager().getConnectionsToExternalServicesForCommandPropagation().values().iterator();
+        Iterator<RemoteConnection> connections = rcm.getTransportManager().getConnectionsToExternalServicesForCommandPropagation().values().iterator();
 
         while (connections.hasNext()) {
             connection = (RemoteConnection)connections.next();
@@ -197,8 +197,8 @@
                 this.rcm.getCommandProcessor().endOperationProfile(SessionProfiler.CacheCoordination);
             }
         } else {
-            Map mapConnections = this.rcm.getTransportManager().getConnectionsToExternalServicesForCommandPropagation();
-            Iterator iterator = mapConnections.values().iterator();
+            Map<String, RemoteConnection> mapConnections = this.rcm.getTransportManager().getConnectionsToExternalServicesForCommandPropagation();
+            Iterator<RemoteConnection> iterator = mapConnections.values().iterator();
             if (mapConnections.size() == 1) {
                 // There is only one connection - no need for yet another thread.
                 // Set the connection into the current one
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/DirectToXMLTypeMappingHelper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/DirectToXMLTypeMappingHelper.java
index 8acd1bb..34a5cb7 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/DirectToXMLTypeMappingHelper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/DirectToXMLTypeMappingHelper.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
@@ -38,7 +38,7 @@
             Class helperClass = null;
 
             try {
-                helperClass = new PrivilegedClassForName("org.eclipse.persistence.sessions.factories.OracleDirectToXMLTypeMappingHelper").run();
+                helperClass = new PrivilegedClassForName<>("org.eclipse.persistence.sessions.factories.OracleDirectToXMLTypeMappingHelper").run();
             } catch (Throwable cnfe) {
                 helperClass = DirectToXMLTypeMappingHelper.class;
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/MissingDescriptorListener.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/MissingDescriptorListener.java
index 1696cb8..a63ac32 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/MissingDescriptorListener.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/MissingDescriptorListener.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
@@ -67,7 +67,7 @@
                 Class javaClass = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try{
-                        javaClass = AccessController.doPrivileged(new PrivilegedClassForName(XML_INTERACTION_CLASS));
+                        javaClass = AccessController.doPrivileged(new PrivilegedClassForName<>(XML_INTERACTION_CLASS));
                     }catch (PrivilegedActionException ex){
                         if (ex.getCause() instanceof ClassNotFoundException){
                             throw (ClassNotFoundException) ex.getCause();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/NamespaceResolvableProject.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/NamespaceResolvableProject.java
index 6688fc4..3dbf3b6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/NamespaceResolvableProject.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/NamespaceResolvableProject.java
@@ -24,6 +24,7 @@
 import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
 
 // EclipseLink imports
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.oxm.XMLDescriptor;
 import org.eclipse.persistence.sessions.Project;
 
@@ -114,7 +115,7 @@
     protected abstract void buildDescriptors();
 
     protected void setNamespaceResolverOnDescriptors() {
-        for (Iterator descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
+        for (Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
             XMLDescriptor descriptor = (XMLDescriptor)descriptors.next();
             descriptor.setNamespaceResolver(ns);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject.java
index 8c8e103..0c9b851 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject.java
@@ -307,7 +307,7 @@
         addDescriptor(buildDirectToFieldMappingDescriptor());
         addDescriptor(buildXMLDirectMappingDescriptor());
         try {
-            Class typesafeenumClass = new PrivilegedClassForName("org.eclipse.persistence.jaxb.JAXBTypesafeEnumConverter").run();
+            Class<Object> typesafeenumClass = new PrivilegedClassForName<>("org.eclipse.persistence.jaxb.JAXBTypesafeEnumConverter").run();
             addDescriptor(buildTypesafeEnumConverterDescriptor(typesafeenumClass));
         }
         catch (ClassNotFoundException cnfe) {
@@ -450,8 +450,8 @@
             @Override
             public Object getAttributeValueFromObject(Object object) {
                 AggregateCollectionMapping mapping = (AggregateCollectionMapping)object;
-                List sourceFields = mapping.getSourceKeyFields();
-                List targetFields = mapping.getTargetForeignKeyFields();
+                List<DatabaseField> sourceFields = mapping.getSourceKeyFields();
+                List<DatabaseField> targetFields = mapping.getTargetForeignKeyFields();
                 List associations = new ArrayList(sourceFields.size());
                 for (int index = 0; index < sourceFields.size(); index++) {
                     associations.add(new Association(targetFields.get(index), sourceFields.get(index)));
@@ -579,7 +579,7 @@
                  * changed getAggregateToSourceFieldAssociations to hold String->DatabaseField associations
                  */
                 AggregateObjectMapping mapping = (AggregateObjectMapping)object;
-                Vector associations = mapping.getAggregateToSourceFieldAssociations();
+                Vector<Association> associations = mapping.getAggregateToSourceFieldAssociations();
                 Vector translations = new Vector(associations.size());
                 for (int index = 0; index < associations.size(); index++) {
                     Association association = (Association)associations.get(index);
@@ -762,7 +762,7 @@
                 }
 
                 Object attributeValue;
-                Class attributeClass = (Class) session.getDatasourcePlatform().convertObject(fieldValue, ClassConstants.CLASS);
+                Class attributeClass = session.getDatasourcePlatform().convertObject(fieldValue, ClassConstants.CLASS);
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                         try {
@@ -2608,8 +2608,8 @@
         sourceToReferenceKeyFieldAssociationsMapping.setAttributeAccessor(new AttributeAccessor() {
             @Override
             public Object getAttributeValueFromObject(Object object) {
-                List sourceFields = ((DirectCollectionMapping)object).getSourceKeyFields();
-                List referenceFields = ((DirectCollectionMapping)object).getReferenceKeyFields();
+                List<DatabaseField> sourceFields = ((DirectCollectionMapping)object).getSourceKeyFields();
+                List<DatabaseField> referenceFields = ((DirectCollectionMapping)object).getReferenceKeyFields();
                 List associations = new ArrayList(sourceFields.size());
                 for (int index = 0; index < sourceFields.size(); index++) {
                     associations.add(new Association(referenceFields.get(index), sourceFields.get(index)));
@@ -3112,7 +3112,7 @@
         descriptor.getInheritancePolicy().addClassIndicator(TypeConversionConverter.class, getPrimaryNamespaceXPath() + "type-conversion-converter");
         descriptor.getInheritancePolicy().addClassIndicator(SerializedObjectConverter.class, getPrimaryNamespaceXPath() + "serialized-object-converter");
         try {
-            Class typesafeenumClass = new PrivilegedClassForName("org.eclipse.persistence.jaxb.JAXBTypesafeEnumConverter").run();
+            Class<Object> typesafeenumClass = new PrivilegedClassForName<>("org.eclipse.persistence.jaxb.JAXBTypesafeEnumConverter").run();
             descriptor.getInheritancePolicy().addClassIndicator(typesafeenumClass, getPrimaryNamespaceXPath() + "typesafe-enumeration-converter");
         }
         catch (ClassNotFoundException cnfe) {
@@ -3219,8 +3219,8 @@
         sourceToRelationKeyFieldAssociationsMapping.setAttributeAccessor(new AttributeAccessor() {
             @Override
             public Object getAttributeValueFromObject(Object object) {
-                List sourceFields = ((ManyToManyMapping)object).getSourceKeyFields();
-                List relationFields = ((ManyToManyMapping)object).getSourceRelationKeyFields();
+                List<DatabaseField> sourceFields = ((ManyToManyMapping)object).getSourceKeyFields();
+                List<DatabaseField> relationFields = ((ManyToManyMapping)object).getSourceRelationKeyFields();
                 List associations = new ArrayList(sourceFields.size());
                 for (int index = 0; index < sourceFields.size(); index++) {
                     associations.add(new Association(relationFields.get(index), sourceFields.get(index)));
@@ -3252,8 +3252,8 @@
         targetToRelationKeyFieldAssociationsMapping.setAttributeAccessor(new AttributeAccessor() {
             @Override
             public Object getAttributeValueFromObject(Object object) {
-                List targetFields = ((ManyToManyMapping)object).getTargetKeyFields();
-                List relationFields = ((ManyToManyMapping)object).getTargetRelationKeyFields();
+                List<DatabaseField> targetFields = ((ManyToManyMapping)object).getTargetKeyFields();
+                List<DatabaseField> relationFields = ((ManyToManyMapping)object).getTargetRelationKeyFields();
                 List associations = new ArrayList(targetFields.size());
                 for (int index = 0; index < targetFields.size(); index++) {
                     associations.add(new Association(relationFields.get(index), targetFields.get(index)));
@@ -3505,8 +3505,8 @@
         sourceToTargetKeyFieldAssociationsMapping.setAttributeAccessor(new AttributeAccessor() {
             @Override
             public Object getAttributeValueFromObject(Object object) {
-                List sourceFields = ((OneToManyMapping)object).getSourceKeyFields();
-                List targetFields = ((OneToManyMapping)object).getTargetForeignKeyFields();
+                List<DatabaseField> sourceFields = ((OneToManyMapping)object).getSourceKeyFields();
+                List<DatabaseField> targetFields = ((OneToManyMapping)object).getTargetForeignKeyFields();
                 List associations = new ArrayList(sourceFields.size());
                 for (int index = 0; index < sourceFields.size(); index++) {
                     associations.add(new Association(targetFields.get(index), sourceFields.get(index)));
@@ -3605,9 +3605,9 @@
         sourceToTargetKeyFieldAssociationsMapping.setAttributeAccessor(new AttributeAccessor() {
             @Override
             public Object getAttributeValueFromObject(Object object) {
-                Map sourceToTargetKeyFields = ((OneToOneMapping)object).getSourceToTargetKeyFields();
+                Map<DatabaseField, DatabaseField> sourceToTargetKeyFields = ((OneToOneMapping)object).getSourceToTargetKeyFields();
                 List associations = new ArrayList(sourceToTargetKeyFields.size());
-                Iterator iterator = sourceToTargetKeyFields.entrySet().iterator();
+                Iterator<Map.Entry<DatabaseField, DatabaseField>> iterator = sourceToTargetKeyFields.entrySet().iterator();
                 while (iterator.hasNext()) {
                     Map.Entry entry = (Map.Entry)iterator.next();
                     associations.add(new Association(entry.getKey(), entry.getValue()));
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject_11_1_1.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject_11_1_1.java
index 87d85d8..440e34a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject_11_1_1.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject_11_1_1.java
@@ -995,9 +995,9 @@
         @Override
         public Object getAttributeValueFromObject(Object anObject) throws DescriptorException {
             StoredProcedureCall spc = (StoredProcedureCall)anObject;
-            List parameterTypes = spc.getParameterTypes();
+            List<Integer> parameterTypes = spc.getParameterTypes();
             List parameters = spc.getParameters();
-            List procedureArgumentNames = spc.getProcedureArgumentNames();
+            List<String> procedureArgumentNames = spc.getProcedureArgumentNames();
             List storedProcedureArguments = new Vector();
             for (int i = spc.getFirstParameterIndexForCallString(); i < parameterTypes.size(); i++) {
                 StoredProcedureArgument spa = null;
@@ -1713,9 +1713,9 @@
          fieldsMapping.setAttributeAccessor(new AttributeAccessor() {
              @Override
             public Object getAttributeValueFromObject(Object object) {
-                 Map fields = ((OracleObjectType) object).getFields();
+                 Map<String, DatabaseType> fields = ((OracleObjectType) object).getFields();
                  List associations = new ArrayList(fields.size());
-                 Iterator iterator = fields.entrySet().iterator();
+                 Iterator<Map.Entry<String, DatabaseType>> iterator = fields.entrySet().iterator();
                  while (iterator.hasNext()) {
                      Map.Entry entry = (Map.Entry)iterator.next();
                      associations.add(new ObjectTypeFieldAssociation(entry.getKey().toString(),  wrapType((DatabaseType) entry.getValue())));
@@ -1725,12 +1725,12 @@
              @Override
             public void setAttributeValueInObject(Object object, Object value) {
                  OracleObjectType objectType = (OracleObjectType) object;
-                 List associations = (List) value;
-                 Map fieldMap = new LinkedHashMap<String, DatabaseType>(associations.size() + 1);
-                 Iterator iterator = associations.iterator();
+                 List<ObjectTypeFieldAssociation> associations = (List<ObjectTypeFieldAssociation>) value;
+                 Map<String, DatabaseType> fieldMap = new LinkedHashMap<>(associations.size() + 1);
+                 Iterator<ObjectTypeFieldAssociation> iterator = associations.iterator();
                  while (iterator.hasNext()) {
                      ObjectTypeFieldAssociation association = (ObjectTypeFieldAssociation)iterator.next();
-                     fieldMap.put(association.getKey(), unwrapType((DatabaseTypeWrapper)association.getValue()));
+                     fieldMap.put((String) association.getKey(), unwrapType((DatabaseTypeWrapper)association.getValue()));
                  }
                  objectType.setFields(fieldMap);
              }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/SessionsFactory.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/SessionsFactory.java
index 9105b8c..c489f24 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/SessionsFactory.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/SessionsFactory.java
@@ -197,11 +197,12 @@
         String sessionCustomizerClassName = sessionConfig.getSessionCustomizerClass();
         if (sessionCustomizerClassName != null) {
             try {
-                Class sessionCustomizerClass = m_classLoader.loadClass(sessionCustomizerClassName);
+                @SuppressWarnings({"unchecked"})
+                Class<SessionCustomizer> sessionCustomizerClass = (Class<SessionCustomizer>) m_classLoader.loadClass(sessionCustomizerClassName);
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    ((SessionCustomizer)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(sessionCustomizerClass))).customize(session);
+                    AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(sessionCustomizerClass)).customize(session);
                 }else{
-                    ((SessionCustomizer)PrivilegedAccessHelper.newInstanceFromClass(sessionCustomizerClass)).customize(session);
+                    PrivilegedAccessHelper.newInstanceFromClass(sessionCustomizerClass).customize(session);
                 }
             } catch (Exception exception) {
                 throw SessionLoaderException.failedToLoadTag("session-customizer-class", sessionCustomizerClassName, exception);
@@ -342,6 +343,7 @@
      * Load a projectConfig from the session.xml file. This method will determine
      * the proper loading scheme, that is, for a class or xml project.
      */
+    @SuppressWarnings({"unchecked"})
     protected Project loadProjectConfig(ProjectConfig projectConfig) {
         Project project = null;
         String projectString = projectConfig.getProjectString().trim();
@@ -349,9 +351,9 @@
         if (projectConfig.isProjectClassConfig()) {
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    project = (Project) AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(m_classLoader.loadClass(projectString)));
+                    project = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>((Class<Project>) m_classLoader.loadClass(projectString)));
                 }else{
-                    project = (Project) PrivilegedAccessHelper.newInstanceFromClass(m_classLoader.loadClass(projectString));
+                    project = PrivilegedAccessHelper.newInstanceFromClass((Class<Project>)m_classLoader.loadClass(projectString));
                 }
             } catch (Exception exception) {
                 throw SessionLoaderException.failedToLoadProjectClass(projectString, exception);
@@ -403,12 +405,13 @@
         String specClassName = eisLoginConfig.getConnectionSpecClass();
         if (specClassName != null) {
             try {
-                Class specClass = m_classLoader.loadClass(specClassName);
+                @SuppressWarnings({"unchecked"})
+                Class<EISConnectionSpec> specClass = (Class<EISConnectionSpec>) m_classLoader.loadClass(specClassName);
                 EISConnectionSpec spec = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    spec = (EISConnectionSpec)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(specClass));
+                    spec = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(specClass));
                 }else{
-                    spec = (EISConnectionSpec)PrivilegedAccessHelper.newInstanceFromClass(specClass);
+                    spec = PrivilegedAccessHelper.newInstanceFromClass(specClass);
                 }
                 eisLogin.setConnectionSpec(spec);
             } catch (Exception exception) {
@@ -454,7 +457,7 @@
         String driverClassName = databaseLoginConfig.getDriverClass();
         if (driverClassName != null) {
             try {
-                Class driverClass = m_classLoader.loadClass(driverClassName);
+                Class<?> driverClass = m_classLoader.loadClass(driverClassName);
                 databaseLogin.setDriverClass(driverClass);
             } catch (Exception exception) {
                 throw SessionLoaderException.failedToLoadTag("driver-class", driverClassName, exception);
@@ -543,25 +546,26 @@
     /**
      * INTERNAL:
      */
+    @SuppressWarnings({"unchecked"})
     protected void processStructConverterConfig(StructConverterConfig converterClassConfig, DatabaseLogin login) {
         if (converterClassConfig != null) {
             Platform platform = login.getDatasourcePlatform();
             if (platform instanceof DatabasePlatform){
-                Iterator i = converterClassConfig.getStructConverterClasses().iterator();
+                Iterator<String> i = converterClassConfig.getStructConverterClasses().iterator();
 
                 while (i.hasNext()) {
                     String converterClassName = (String)i.next();
                     try {
-                        Class converterClass = m_classLoader.loadClass(converterClassName);
+                        Class<StructConverter> converterClass = (Class<StructConverter>) m_classLoader.loadClass(converterClassName);
                         StructConverter converter = null;
                         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                             try{
-                                converter = (StructConverter)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(converterClass));
+                                converter = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(converterClass));
                             }catch (PrivilegedActionException ex){
                                 throw (Exception)ex.getCause();
                             }
                         }else{
-                            converter = (StructConverter)PrivilegedAccessHelper.newInstanceFromClass(converterClass);
+                            converter = PrivilegedAccessHelper.newInstanceFromClass(converterClass);
                         }
                         ((DatabasePlatform)platform).addStructConverter(converter);
                     } catch (Exception exception) {
@@ -581,11 +585,12 @@
         String platformClassName = loginConfig.getPlatformClass();
         if (platformClassName != null) {
             try {
-                Class platformClass = m_classLoader.loadClass(platformClassName);
+                @SuppressWarnings({"unchecked"})
+                Class<DatasourcePlatform> platformClass = (Class<DatasourcePlatform>) m_classLoader.loadClass(platformClassName);
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    login.usePlatform((DatasourcePlatform)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(platformClass)));
+                    login.usePlatform(AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(platformClass)));
                 }else{
-                    login.usePlatform((DatasourcePlatform)PrivilegedAccessHelper.newInstanceFromClass(platformClass));
+                    login.usePlatform(PrivilegedAccessHelper.newInstanceFromClass(platformClass));
                 }
             } catch (Exception exception) {
                 throw SessionLoaderException.failedToLoadTag("platform-class", platformClassName, exception);
@@ -736,13 +741,14 @@
         // Server class - XML schema default is org.eclipse.persistence.platform.server.CustomServerPlatform
         String serverClassName = platformConfig.getServerClassName();
         try {
-            Class serverClass = m_classLoader.loadClass(serverClassName);
+            @SuppressWarnings({"unchecked"})
+            Class<ServerPlatform> serverClass = (Class<ServerPlatform>) m_classLoader.loadClass(serverClassName);
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                Constructor constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(serverClass, new Class[] { org.eclipse.persistence.sessions.DatabaseSession.class }, false));
-                platform = (ServerPlatform)AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, new Object[] { session }));
+                Constructor<ServerPlatform> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(serverClass, new Class[] { org.eclipse.persistence.sessions.DatabaseSession.class }, false));
+                platform = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(constructor, new Object[] { session }));
             }else{
-                Constructor constructor = PrivilegedAccessHelper.getConstructorFor(serverClass, new Class[] { org.eclipse.persistence.sessions.DatabaseSession.class }, false);
-                platform = (ServerPlatform)PrivilegedAccessHelper.invokeConstructor(constructor, new Object[] { session });
+                Constructor<ServerPlatform> constructor = PrivilegedAccessHelper.getConstructorFor(serverClass, new Class[] { org.eclipse.persistence.sessions.DatabaseSession.class }, false);
+                platform = PrivilegedAccessHelper.invokeConstructor(constructor, new Object[] { session });
             }
         } catch (Exception e) {
             throw SessionLoaderException.failedToLoadTag("server-class", serverClassName, e);
@@ -854,11 +860,12 @@
         String exceptionHandlerClassName = sessionConfig.getExceptionHandlerClass();
         if (exceptionHandlerClassName != null) {
             try {
-                Class exceptionHandlerClass = m_classLoader.loadClass(exceptionHandlerClassName);
+                @SuppressWarnings({"unchecked"})
+                Class<ExceptionHandler> exceptionHandlerClass = (Class<ExceptionHandler>) m_classLoader.loadClass(exceptionHandlerClassName);
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    session.setExceptionHandler((ExceptionHandler)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(exceptionHandlerClass)));
+                    session.setExceptionHandler(AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(exceptionHandlerClass)));
                 }else{
-                    session.setExceptionHandler((ExceptionHandler)PrivilegedAccessHelper.newInstanceFromClass(exceptionHandlerClass));
+                    session.setExceptionHandler(PrivilegedAccessHelper.newInstanceFromClass(exceptionHandlerClass));
                 }
             } catch (Exception e) {
                 throw SessionLoaderException.failedToLoadTag("exception-handler-class", exceptionHandlerClassName, e);
@@ -998,8 +1005,9 @@
         } else if (sequenceConfig instanceof XMLFileSequenceConfig) {
             try {
                 // Can no longer reference class directly as in a different project.
-                Class xmlClass = Class.forName("org.eclipse.persistence.eis.adapters.xmlfile.XMLFileSequence");
-                Sequence sequence = (Sequence)xmlClass.getConstructor().newInstance();
+                @SuppressWarnings({"unchecked"})
+                Class<Sequence> xmlClass = (Class<Sequence>) Class.forName("org.eclipse.persistence.eis.adapters.xmlfile.XMLFileSequence");
+                Sequence sequence = xmlClass.getConstructor().newInstance();
                 sequence.setName(name);
                 sequence.setInitialValue(size);
                 return sequence;
@@ -1077,13 +1085,14 @@
     protected void buildOc4jJGroupsTransportManagerConfig(Oc4jJGroupsTransportManagerConfig tmConfig, RemoteCommandManager rcm) {
         TransportManager tm = null;
         try {
-            Class tmClass = m_classLoader.loadClass(tmConfig.getTransportManagerClassName());
+            @SuppressWarnings({"unchecked"})
+            Class<TransportManager> tmClass = (Class<TransportManager>) m_classLoader.loadClass(tmConfig.getTransportManagerClassName());
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                Constructor constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(tmClass, new Class[] { RemoteCommandManager.class, boolean.class, String.class }, false));
-                tm = (TransportManager)AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, new Object[] { rcm, tmConfig.useSingleThreadedNotification(), tmConfig.getTopicName() }));
+                Constructor<TransportManager> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(tmClass, new Class[] { RemoteCommandManager.class, boolean.class, String.class }, false));
+                tm = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(constructor, new Object[] { rcm, tmConfig.useSingleThreadedNotification(), tmConfig.getTopicName() }));
             }else{
-                Constructor constructor = PrivilegedAccessHelper.getConstructorFor(tmClass, new Class[] { RemoteCommandManager.class, boolean.class, String.class }, false);
-                tm = (TransportManager)PrivilegedAccessHelper.invokeConstructor(constructor, new Object[] { rcm, tmConfig.useSingleThreadedNotification(), tmConfig.getTopicName() });
+                Constructor<TransportManager> constructor = PrivilegedAccessHelper.getConstructorFor(tmClass, new Class[] { RemoteCommandManager.class, boolean.class, String.class }, false);
+                tm = PrivilegedAccessHelper.invokeConstructor(constructor, new Object[] { rcm, tmConfig.useSingleThreadedNotification(), tmConfig.getTopicName() });
             }
         } catch (Exception e) {
             throw SessionLoaderException.failedToParseXML("Oc4jJGroupsTransportManager class is invalid: " + tmConfig.getTransportManagerClassName(), e);
@@ -1106,11 +1115,12 @@
         String transportManagerClassName = tmConfig.getTransportClass();
         if (transportManagerClassName != null) {
             try {
-                Class transportManagerClass = m_classLoader.loadClass(transportManagerClassName);
+                @SuppressWarnings({"unchecked"})
+                Class<TransportManager> transportManagerClass = (Class<TransportManager>) m_classLoader.loadClass(transportManagerClassName);
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    tm = (TransportManager)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(transportManagerClass));
+                    tm = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(transportManagerClass));
                 }else{
-                    tm = (TransportManager)PrivilegedAccessHelper.newInstanceFromClass(transportManagerClass);
+                    tm = PrivilegedAccessHelper.newInstanceFromClass(transportManagerClass);
                 }
             } catch (Exception exception) {
                 throw SessionLoaderException.failedToLoadTag("transport-class", transportManagerClassName, exception);
@@ -1201,13 +1211,14 @@
                 String listenerClassName = (String)e.nextElement();
 
                 try {
-                    Class listenerClass = m_classLoader.loadClass(listenerClassName);
+                    @SuppressWarnings({"unchecked"})
+                    Class<SessionEventListener> listenerClass = (Class<SessionEventListener>) m_classLoader.loadClass(listenerClassName);
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                        session.getEventManager().addListener((SessionEventListener)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(listenerClass)));
+                        session.getEventManager().addListener(AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(listenerClass)));
                     }else{
 
                     }
-                    session.getEventManager().addListener((SessionEventListener)PrivilegedAccessHelper.newInstanceFromClass(listenerClass));
+                    session.getEventManager().addListener(PrivilegedAccessHelper.newInstanceFromClass(listenerClass));
                 } catch (Exception exception) {
                     throw SessionLoaderException.failedToLoadTag("event-listener-class", listenerClassName, exception);
                 }
@@ -1239,7 +1250,7 @@
             // use ConversionManager to avoid loading the JDK 1.4 class unless it is needed.
             ConversionManager conversionManager = new ConversionManager();
             conversionManager.setLoader(getClass().getClassLoader());
-            javaLog = (SessionLog)((Class)conversionManager.convertObject("org.eclipse.persistence.logging.JavaLog", Class.class)).getConstructor().newInstance();
+            javaLog = ((Class<SessionLog>)conversionManager.convertObject("org.eclipse.persistence.logging.JavaLog", Class.class)).getConstructor().newInstance();
             javaLog.setSession(session);
         } catch (Exception exception) {
             throw ValidationException.unableToLoadClass("org.eclipse.persistence.logging.JavaLog", exception);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject.java
index 4ba6b91..0b1d559 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject.java
@@ -234,7 +234,7 @@
         namespaceResolver.put("xsi", W3C_XML_SCHEMA_INSTANCE_NS_URI);
         namespaceResolver.put("xsd", W3C_XML_SCHEMA_NS_URI);
 
-        for (Iterator descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
+        for (Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
             XMLDescriptor descriptor = (XMLDescriptor)descriptors.next();
             descriptor.setNamespaceResolver(namespaceResolver);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject_11_1_1.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject_11_1_1.java
index daf14d0..b5b1733 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject_11_1_1.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject_11_1_1.java
@@ -88,7 +88,7 @@
         namespaceResolver.put("xsi", W3C_XML_SCHEMA_INSTANCE_NS_URI);
         namespaceResolver.put("xsd", W3C_XML_SCHEMA_NS_URI);
 
-        for (Iterator descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
+        for (Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator(); descriptors.hasNext();) {
             XMLDescriptor descriptor = (XMLDescriptor)descriptors.next();
             descriptor.setNamespaceResolver(namespaceResolver);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/RemoteConnection.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/RemoteConnection.java
index 24c715f..da58610 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/RemoteConnection.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/RemoteConnection.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
@@ -285,7 +285,7 @@
      */
     public void fixObjectReferences(Transporter remoteCursoredStream, ObjectLevelReadQuery query, DistributedSession session) {
         RemoteCursoredStream stream = (RemoteCursoredStream)remoteCursoredStream.getObject();
-        List remoteObjectCollection = stream.getObjectCollection();
+        List<Object> remoteObjectCollection = stream.getObjectCollection();
         if (query.isReadAllQuery() && (!query.isReportQuery())) {// could be DataReadQuery
             Vector clientObjectCollection = new Vector(remoteObjectCollection.size());
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/DefaultSessionLog.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/DefaultSessionLog.java
index 747f0f9..4ba6f51 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/DefaultSessionLog.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/DefaultSessionLog.java
@@ -60,7 +60,7 @@
      * Represents the Map that stores log levels per the name space strings. The
      * keys are category names. The values are log levels.
      */
-    private Map<String, Integer> categoryLogLevelMap = new HashMap();
+    private final Map<String, Integer> categoryLogLevelMap = new HashMap<>();
 
     public DefaultSessionLog() {
         super();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/JavaLog.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/JavaLog.java
index 8ad1f09..fac673b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/JavaLog.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/JavaLog.java
@@ -57,7 +57,7 @@
      * Represents the HashMap that stores all the name space strings.
      * The keys are category names.  The values are namespace strings.
      */
-    private Map nameSpaceMap  = new HashMap();
+    private final Map<String, String> nameSpaceMap  = new HashMap<>();
 
     /**
      * Stores the namespace for session, i.e."{@code org.eclipse.persistence.session.<sessionname>}".
@@ -69,7 +69,7 @@
      */
     private Logger sessionLogger;
 
-    private Map categoryloggers = new HashMap<String, Logger>();
+    private final Map<String, Logger> categoryloggers = new HashMap<>();
 
     /**
      * INTERNAL:
@@ -92,7 +92,7 @@
      * INTERNAL:
      * Return catagoryloggers
      */
-     public Map getCategoryLoggers() {
+     public Map<String, Logger> getCategoryLoggers() {
          return categoryloggers;
      }
 
@@ -160,7 +160,7 @@
     @Override
     public void setWriter(OutputStream fileOutputStream){
         StreamHandler sh = new StreamHandler(fileOutputStream,new LogFormatter());
-        ((Logger)categoryloggers.get(DEFAULT_TOPLINK_NAMESPACE)).addHandler(sh);
+        categoryloggers.get(DEFAULT_TOPLINK_NAMESPACE).addHandler(sh);
         if(sessionLogger!=null){
             sessionLogger.addHandler(sh);
         }
@@ -176,7 +176,7 @@
         } else if ((category == null) || (category.length() == 0)) {
             return sessionNameSpace;
         } else {
-            return  (String)nameSpaceMap.get(category);
+            return nameSpaceMap.get(category);
         }
     }
 
@@ -186,11 +186,11 @@
      */
     protected Logger getLogger(String category) {
         if (session == null) {
-            return (Logger)categoryloggers.get(DEFAULT_TOPLINK_NAMESPACE);
+            return categoryloggers.get(DEFAULT_TOPLINK_NAMESPACE);
         } else if ((category == null) || (category.length() == 0) || !this.categoryloggers.containsKey(category)) {
-            return (Logger) categoryloggers.get(sessionNameSpace);
+            return categoryloggers.get(sessionNameSpace);
         } else {
-            Logger logger = (Logger) categoryloggers.get(category);
+            Logger logger = categoryloggers.get(category);
             // If session != null, categoryloggers should have an entry for this category
             assert logger != null;
             return logger;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogCategory.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogCategory.java
index 1095d77..fdbd649 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogCategory.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogCategory.java
@@ -124,7 +124,7 @@
      * @param id   Logging category ID.
      * @param name Logging category name.
      */
-    private LogCategory(final byte id, final String name) {
+    LogCategory(final byte id, final String name) {
         this.id = id;
         this.name = name;
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogFormatter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogFormatter.java
index ef3f14f..cae451d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogFormatter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogFormatter.java
@@ -34,7 +34,7 @@
     Date dat = new Date();
     private final static String format = "{0,date} {0,time}";
     private MessageFormat formatter;
-    private Object[] args = new Object[1];
+    private final Object[] args = new Object[1];
 
     // Line separator string.  This is the value of the line.separator
     // property at the moment that the SimpleFormatter was created.
@@ -52,7 +52,8 @@
         } else {
             EclipseLinkLogRecord record = (EclipseLinkLogRecord)record0;
 
-            StringBuffer sb = new StringBuffer();
+            //method is synchronized
+            StringBuilder sb = new StringBuilder();
 
             if (record.shouldPrintDate()) {
                 // Minimize memory allocations here.
@@ -81,11 +82,11 @@
             }
             if (record.getConnection() != null) {
                 sb.append(" ");
-                sb.append(AbstractSessionLog.CONNECTION_STRING + "(" + String.valueOf(System.identityHashCode(record.getConnection())) + ")");
+                sb.append(AbstractSessionLog.CONNECTION_STRING + "(").append(System.identityHashCode(record.getConnection())).append(")");
             }
             if (record.shouldPrintThread()) {
                 sb.append(" ");
-                sb.append(AbstractSessionLog.THREAD_STRING + "(" + String.valueOf(record.getThreadID()) + ")");
+                sb.append(AbstractSessionLog.THREAD_STRING + "(").append(record.getThreadID()).append(")");
             }
             sb.append(lineSeparator);
             String message = formatMessage(record);
@@ -106,7 +107,7 @@
                             pw.write(lineSeparator);
                         }
                     }
-                    sb.append(sw.toString());
+                    sb.append(sw);
                 }
             }
             return sb.toString();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogLevel.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogLevel.java
index aac7988..cff8a9b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogLevel.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/LogLevel.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2016, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2016, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -87,7 +87,7 @@
     }
 
     /** Array for id to {@link LogLevel} lookup. */
-    private static final LogLevel idValues[] = new LogLevel[length];
+    private static final LogLevel[] idValues = new LogLevel[length];
 
     // Initialize id to LogLevel lookup array.
     static {
@@ -102,7 +102,7 @@
      * @return {@link LogLevel} object holding the value represented by the string argument or {@code null} when
      *         there exists no corresponding {@link LogLevel} object to provided argument value.
      */
-    public static final LogLevel toValue(final String name) {
+    public static LogLevel toValue(final String name) {
         return name != null ? stringValuesMap.get(name.toUpperCase()) : null;
     }
 
@@ -113,7 +113,7 @@
      * @return {@link LogLevel} object holding the value represented by the string argument or {@code fallBack} when
      *         there exists no corresponding {@link LogLevel} object to provided argument value.
      */
-    public static final LogLevel toValue(final String name, final LogLevel fallBack) {
+    public static LogLevel toValue(final String name, final LogLevel fallBack) {
         if (name != null) {
             final LogLevel level = stringValuesMap.get(name.toUpperCase());
             return level != null ? level : fallBack;
@@ -128,10 +128,10 @@
      * @return {@link LogLevel} object holding the value represented by the {@code id} argument.
      * @throws IllegalArgumentException when {@link LogLevel} ID is out of valid {@link LogLevel} IDs range.
      */
-    public static final LogLevel toValue(final int id) {
+    public static LogLevel toValue(final int id) {
         if (id < 0 || id >= length) {
             throw new IllegalArgumentException(
-                    "Log level ID " + id + "is out of range <0, " + Integer.toString(length) + ">.");
+                    "Log level ID " + id + "is out of range <0, " + length + ">.");
         }
         return idValues[id];
     }
@@ -144,7 +144,7 @@
      *         when provided ID is not valid {@link LogLevel} ID.
      * @throws IllegalArgumentException when {@link LogLevel} ID is out of valid {@link LogLevel} IDs range.
      */
-    public static final LogLevel toValue(final int id, final LogLevel fallBack) {
+    public static LogLevel toValue(final int id, final LogLevel fallBack) {
         if (id >= 0 && id < length) {
             return idValues[id];
         }
@@ -163,7 +163,7 @@
      * @param id   Logging level ID.
      * @param name Logging level name.
      */
-    private LogLevel(final byte id, final String name) {
+    LogLevel(final byte id, final String name) {
         this.id = id;
         this.name = name;
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/XMLLogFormatter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/XMLLogFormatter.java
index 45b2199..9737cce 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/XMLLogFormatter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/logging/XMLLogFormatter.java
@@ -138,7 +138,7 @@
 
             if (record.getConnection() != null) {
                 sb.append("  <connection>");
-                sb.append(String.valueOf(System.identityHashCode(record.getConnection())));
+                sb.append(System.identityHashCode(record.getConnection()));
                 sb.append("</connection>\n");
             }
 
@@ -161,7 +161,10 @@
             // bundle name, and params.
             ResourceBundle bundle = record.getResourceBundle();
             try {
-                if ((bundle != null) && (bundle.getString(record.getMessage()) != null)) {
+                if ((bundle != null)) {
+                    //check for missing entry in the bundle,
+                    //throws exception if not found
+                    bundle.getString(record.getMessage());
                     sb.append("  <key>");
                     escape(sb, record.getMessage());
                     sb.append("</key>\n");
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 ccb485f..47165f1 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
@@ -1369,7 +1369,7 @@
     public AbstractRecord getAggregateRow(ObjectLevelModifyQuery query, Object object) {
         Vector referenceObjectKeys = getReferenceObjectKeys(query);
         AbstractRecord aggregateRow = new DatabaseRecord();
-        Vector keys = getTargetForeignKeyFields();
+        Vector<DatabaseField> keys = getTargetForeignKeyFields();
         for (int keyIndex = 0; keyIndex < keys.size(); keyIndex++) {
             aggregateRow.put(keys.elementAt(keyIndex), referenceObjectKeys.elementAt(keyIndex));
         }
@@ -1387,7 +1387,7 @@
         Expression criteria = null;
         Expression builder = new ExpressionBuilder();
 
-        for (Iterator keys = getTargetForeignKeyToSourceKeys().keySet().iterator(); keys.hasNext();) {
+        for (Iterator<DatabaseField> keys = getTargetForeignKeyToSourceKeys().keySet().iterator(); keys.hasNext();) {
             DatabaseField targetForeignKey = (DatabaseField)keys.next();
             DatabaseField sourceKey = getTargetForeignKeyToSourceKeys().get(targetForeignKey);
 
@@ -1454,8 +1454,8 @@
         //For CR#2587-S.M.  For nested aggregate collections the source keys can easily be read from the original query.
         AbstractRecord translationRow = query.getTranslationRow();
 
-        for (Enumeration sourcekeys = getSourceKeyFields().elements();
-                 sourcekeys.hasMoreElements();) {
+        for (Enumeration<DatabaseField> sourcekeys = getSourceKeyFields().elements();
+             sourcekeys.hasMoreElements();) {
             DatabaseField sourceKey = (DatabaseField)sourcekeys.nextElement();
 
             // CR#2587.  Try first to get the source key from the original query.  If that fails try to get it from the object.
@@ -1478,8 +1478,8 @@
      */
     public Vector getSourceKeyFieldNames() {
         Vector fieldNames = new Vector(getSourceKeyFields().size());
-        for (Enumeration fieldsEnum = getSourceKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getSourceKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -1501,8 +1501,8 @@
      */
     public Vector getTargetForeignKeyFieldNames() {
         Vector fieldNames = new Vector(getTargetForeignKeyFields().size());
-        for (Enumeration fieldsEnum = getTargetForeignKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getTargetForeignKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -2029,7 +2029,7 @@
         Expression criteria;
         Expression builder = new ExpressionBuilder();
 
-        for (Iterator keys = getTargetForeignKeyToSourceKeys().keySet().iterator(); keys.hasNext();) {
+        for (Iterator<DatabaseField> keys = getTargetForeignKeyToSourceKeys().keySet().iterator(); keys.hasNext();) {
             DatabaseField targetForeignKey = (DatabaseField)keys.next();
             DatabaseField sourceKey = getTargetForeignKeyToSourceKeys().get(targetForeignKey);
 
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 828d56c..90b5536 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
@@ -377,7 +377,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        setReferenceClass(AccessController.doPrivileged(new PrivilegedClassForName(getReferenceClassName(), true, classLoader)));
+                        setReferenceClass(AccessController.doPrivileged(new PrivilegedClassForName<>(getReferenceClassName(), true, classLoader)));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(getReferenceClassName(), exception.getException());
                     }
@@ -1084,8 +1084,8 @@
         if (attributeValue == null) {
             return true;
         }
-        for (Enumeration mappings = getReferenceDescriptor(attributeValue, session).getMappings().elements();
-                 mappings.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappings = getReferenceDescriptor(attributeValue, session).getMappings().elements();
+             mappings.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
             if (!mapping.verifyDelete(attributeValue, session)) {
                 return false;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateObjectMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateObjectMapping.java
index 5de646f..7149937 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateObjectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/AggregateObjectMapping.java
@@ -306,7 +306,7 @@
      * row are NULL.
      */
     protected boolean allAggregateFieldsAreNull(AbstractRecord databaseRow) {
-        Vector fields = getReferenceFields();
+        Vector<DatabaseField> fields = getReferenceFields();
         int size = fields.size();
         for (int index = 0; index < size; index++) {
             DatabaseField field = (DatabaseField)fields.get(index);
@@ -554,7 +554,7 @@
         if ((value != null) && !referenceDescriptor.getJavaClass().isInstance(value)) {
             throw QueryException.incorrectClassForObjectComparison(expression, value, this);
         }
-        Enumeration mappings = referenceDescriptor.getMappings().elements();
+        Enumeration<DatabaseMapping> mappings = referenceDescriptor.getMappings().elements();
         for (; mappings.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
             if (value == null) {
@@ -581,7 +581,7 @@
         Expression attributeByAttributeComparison = null;
 
         //Enumeration mappingsEnum = getSourceToTargetKeyFields().elements();
-        Enumeration mappingsEnum = getReferenceDescriptor().getMappings().elements();
+        Enumeration<DatabaseMapping> mappingsEnum = getReferenceDescriptor().getMappings().elements();
         for (; mappingsEnum.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
             String attributeName = mapping.getAttributeName();
@@ -1166,8 +1166,8 @@
      */
     public Vector<Association> getAggregateToSourceFieldAssociations() {
         Vector<Association> associations = new Vector(getAggregateToSourceFields().size());
-        Iterator aggregateEnum = getAggregateToSourceFields().keySet().iterator();
-        Iterator sourceEnum = getAggregateToSourceFields().values().iterator();
+        Iterator<String> aggregateEnum = getAggregateToSourceFields().keySet().iterator();
+        Iterator<DatabaseField> sourceEnum = getAggregateToSourceFields().values().iterator();
         while (aggregateEnum.hasNext()) {
             associations.addElement(new Association(aggregateEnum.next(), sourceEnum.next()));
         }
@@ -1613,7 +1613,7 @@
         // Use the mapping reference descriptor when initialized, otherwise find the uninitialized one.
         ClassDescriptor referencedDescriptor = getReferenceDescriptor();
         if (referencedDescriptor == null) {
-            Iterator ordered = project.getOrderedDescriptors().iterator();
+            Iterator<ClassDescriptor> ordered = project.getOrderedDescriptors().iterator();
             while (ordered.hasNext() && referencedDescriptor == null){
                 ClassDescriptor descriptor = (ClassDescriptor)ordered.next();
                 if (descriptor.getJavaClassName().equals(getReferenceClassName())){
@@ -1627,7 +1627,7 @@
             }
             // Also check subclasses.
             if (referencedDescriptor.hasInheritance()) {
-                for (Iterator iterator = referencedDescriptor.getInheritancePolicy().getChildDescriptors().iterator(); iterator.hasNext(); ) {
+                for (Iterator<ClassDescriptor> iterator = referencedDescriptor.getInheritancePolicy().getChildDescriptors().iterator(); iterator.hasNext(); ) {
                     ClassDescriptor subclassDescriptor = (ClassDescriptor)iterator.next();
                     if (!subclassDescriptor.supportsChangeTracking(project)) {
                         return false;
@@ -1758,9 +1758,9 @@
             }
             AbstractRecord aggregateRow = new DatabaseRecord();
             int size = row.size();
-            List fields = row.getFields();
+            List<DatabaseField> fields = row.getFields();
             List values = row.getValues();
-            List aggregateFields = getReferenceFields();
+            List<DatabaseField> aggregateFields = getReferenceFields();
             for(int i=0; i < size; i++) {
                 DatabaseField field = (DatabaseField)fields.get(i);
                 if(aggregateFields.contains(field)) {
@@ -1888,8 +1888,8 @@
      */
     public void setAggregateToSourceFieldAssociations(Vector<Association> fieldAssociations) {
         Hashtable fieldNames = new Hashtable(fieldAssociations.size() + 1);
-        for (Enumeration associationsEnum = fieldAssociations.elements();
-                 associationsEnum.hasMoreElements();) {
+        for (Enumeration<Association> associationsEnum = fieldAssociations.elements();
+             associationsEnum.hasMoreElements();) {
             Association association = (Association)associationsEnum.nextElement();
             fieldNames.put(association.getKey(), association.getValue());
         }
@@ -2013,7 +2013,7 @@
     protected void translateFields(ClassDescriptor clonedDescriptor, AbstractSession session) {
         // EL Bug 326977
         Vector fieldsToTranslate = (Vector) clonedDescriptor.getFields().clone();
-        for (Iterator qkIterator = clonedDescriptor.getQueryKeys().values().iterator(); qkIterator.hasNext();) {
+        for (Iterator<QueryKey> qkIterator = clonedDescriptor.getQueryKeys().values().iterator(); qkIterator.hasNext();) {
             QueryKey queryKey = (QueryKey)qkIterator.next();
             if (queryKey.isDirectQueryKey()) {
                 DatabaseField field = ((DirectQueryKey)queryKey).getField();
@@ -2023,7 +2023,7 @@
 
         // EL Bug 332080 - translate foreign reference mapping source key fields
         if (!clonedDescriptor.getObjectBuilder().isSimple()) {
-            for (Iterator dcIterator = clonedDescriptor.getMappings().iterator(); dcIterator.hasNext();) {
+            for (Iterator<DatabaseMapping> dcIterator = clonedDescriptor.getMappings().iterator(); dcIterator.hasNext();) {
                 DatabaseMapping mapping = (DatabaseMapping)dcIterator.next();
                 if (mapping.isForeignReferenceMapping()) {
                     Collection fkFields = ((ForeignReferenceMapping)mapping).getFieldsForTranslationInAggregate();
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 71e13a7..c9e04a2 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
@@ -1794,7 +1794,7 @@
         // no need for private owned check.  This code is only registered for private owned mappings.
         // targets are added to and/or removed to/from the source.
         CollectionChangeRecord collectionChangeRecord = (CollectionChangeRecord)changeRecord;
-        Iterator it = collectionChangeRecord.getRemoveObjectList().values().iterator();
+        Iterator<ObjectChangeSet> it = collectionChangeRecord.getRemoveObjectList().values().iterator();
         while(it.hasNext()) {
             ObjectChangeSet ocs = (ObjectChangeSet)it.next();
             containerPolicy.postCalculateChanges(ocs, referenceDescriptor, this, uow);
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 63be30f..c6e525d 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
@@ -562,7 +562,7 @@
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                         try {
-                            valueType = AccessController.doPrivileged(new PrivilegedClassForName(valueTypeName, true, classLoader));
+                            valueType = AccessController.doPrivileged(new PrivilegedClassForName<>(valueTypeName, true, classLoader));
                         } catch (PrivilegedActionException exception) {
                             throw ValidationException.classNotFoundWhileConvertingClassNames(valueTypeName, exception.getException());
                         }
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 d2c24fe..9b5629b 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
@@ -955,7 +955,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        valueConverterClass = AccessController.doPrivileged(new PrivilegedClassForName(valueConverterClassName, true, classLoader));
+                        valueConverterClass = AccessController.doPrivileged(new PrivilegedClassForName<>(valueConverterClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(valueConverterClassName, exception.getException());
                     }
@@ -986,7 +986,7 @@
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                         try {
-                            attributeClassification = AccessController.doPrivileged(new PrivilegedClassForName(attributeClassificationName, true, classLoader));
+                            attributeClassification = AccessController.doPrivileged(new PrivilegedClassForName<>(attributeClassificationName, true, classLoader));
                         } catch (PrivilegedActionException pae) {
                             throw ValidationException.classNotFoundWhileConvertingClassNames(attributeClassificationName, pae.getException());
                         }
@@ -1350,8 +1350,8 @@
      */
     public Vector getReferenceKeyFieldNames() {
         Vector fieldNames = new Vector(getReferenceKeyFields().size());
-        for (Enumeration fieldsEnum = getReferenceKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getReferenceKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -1417,8 +1417,8 @@
      */
     public Vector getSourceKeyFieldNames() {
         Vector fieldNames = new Vector(getSourceKeyFields().size());
-        for (Enumeration fieldsEnum = getSourceKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getSourceKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -1751,8 +1751,8 @@
         SQLInsertStatement statement = new SQLInsertStatement();
         statement.setTable(getReferenceTable());
         AbstractRecord directRow = new DatabaseRecord();
-        for (Enumeration referenceEnum = getReferenceKeyFields().elements();
-                 referenceEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> referenceEnum = getReferenceKeyFields().elements();
+             referenceEnum.hasMoreElements();) {
             directRow.put((DatabaseField)referenceEnum.nextElement(), null);
         }
         directRow.put(getDirectField(), null);
@@ -1780,7 +1780,7 @@
             throw DescriptorException.noReferenceKeyIsSpecified(this);
         }
 
-        for (Enumeration referenceEnum = getReferenceKeyFields().elements(); referenceEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> referenceEnum = getReferenceKeyFields().elements(); referenceEnum.hasMoreElements();) {
             DatabaseField field = (DatabaseField)referenceEnum.nextElement();
 
             // Update the field first if the mapping is on a table per tenant entity.
@@ -2653,8 +2653,8 @@
     @Override
     protected void prepareTranslationRow(AbstractRecord translationRow, Object object, ClassDescriptor descriptor, AbstractSession session) {
         // Make sure that each source key field is in the translation row.
-        for (Enumeration sourceFieldsEnum = getSourceKeyFields().elements();
-                 sourceFieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> sourceFieldsEnum = getSourceKeyFields().elements();
+             sourceFieldsEnum.hasMoreElements();) {
             DatabaseField sourceKey = (DatabaseField)sourceFieldsEnum.nextElement();
             if (!translationRow.containsKey(sourceKey)) {
                 Object value = descriptor.getObjectBuilder().extractValueFromObjectForField(object, sourceKey, session);
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 06cdb86..40e490d 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
@@ -425,7 +425,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        referenceClass = AccessController.doPrivileged(new PrivilegedClassForName(getReferenceClassName(), true, classLoader));
+                        referenceClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getReferenceClassName(), true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(getReferenceClassName(), exception.getException());
                     }
@@ -729,7 +729,7 @@
                 }
             }
 
-            List nestedJoins = extractNestedNonAggregateExpressions(joinManager.getJoinedAttributeExpressions(), nestedQuery.getExpressionBuilder(), false);
+            List<Expression> nestedJoins = extractNestedNonAggregateExpressions(joinManager.getJoinedAttributeExpressions(), nestedQuery.getExpressionBuilder(), false);
             if (nestedJoins.size() > 0) {
                 // Recompute the joined indexes based on the nested join expressions.
                 nestedQuery.getJoinedAttributeManager().clear();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ManyToManyMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ManyToManyMapping.java
index a4e8682..207e7a9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ManyToManyMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/ManyToManyMapping.java
@@ -955,8 +955,8 @@
     @Override
     protected void prepareTranslationRow(AbstractRecord translationRow, Object object, ClassDescriptor descriptor, AbstractSession session) {
         // Make sure that each source key field is in the translation row.
-        for (Enumeration sourceFieldsEnum = getSourceKeyFields().elements();
-                 sourceFieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> sourceFieldsEnum = getSourceKeyFields().elements();
+             sourceFieldsEnum.hasMoreElements();) {
             DatabaseField sourceKey = (DatabaseField)sourceFieldsEnum.nextElement();
             if (!translationRow.containsKey(sourceKey)) {
                 Object value = descriptor.getObjectBuilder().extractValueFromObjectForField(object, sourceKey, session);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/OneToManyMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/OneToManyMapping.java
index eb5849b..7b0a04d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/OneToManyMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/OneToManyMapping.java
@@ -246,8 +246,8 @@
         Expression selectionCriteria = null;
         Expression builder = new ExpressionBuilder();
 
-        for (Iterator keys = getTargetForeignKeysToSourceKeys().keySet().iterator();
-                 keys.hasNext();) {
+        for (Iterator<DatabaseField> keys = getTargetForeignKeysToSourceKeys().keySet().iterator();
+             keys.hasNext();) {
             DatabaseField targetForeignKey = (DatabaseField)keys.next();
             DatabaseField sourceKey = getTargetForeignKeysToSourceKeys().get(targetForeignKey);
 
@@ -273,9 +273,9 @@
         Expression selectionCriteria = null;
         Expression builder = new ExpressionBuilder();
 
-        Enumeration sourceKeys = getSourceKeyFields().elements();
-        for (Enumeration targetForeignKeys = getTargetForeignKeyFields().elements();
-                 targetForeignKeys.hasMoreElements();) {
+        Enumeration<DatabaseField> sourceKeys = getSourceKeyFields().elements();
+        for (Enumeration<DatabaseField> targetForeignKeys = getTargetForeignKeyFields().elements();
+             targetForeignKeys.hasMoreElements();) {
             DatabaseField targetForeignKey = (DatabaseField)targetForeignKeys.nextElement();
             DatabaseField sourceKey = (DatabaseField)sourceKeys.nextElement();
             Expression targetExpression = builder.getField(targetForeignKey);
@@ -472,8 +472,8 @@
      */
     public Vector getSourceKeyFieldNames() {
         Vector fieldNames = new Vector(getSourceKeyFields().size());
-        for (Enumeration fieldsEnum = getSourceKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getSourceKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -515,8 +515,8 @@
      */
     public Vector getTargetForeignKeyFieldNames() {
         Vector fieldNames = new Vector(getTargetForeignKeyFields().size());
-        for (Enumeration fieldsEnum = getTargetForeignKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getTargetForeignKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -734,7 +734,7 @@
             throw DescriptorException.multipleTargetForeignKeyTables(this.getDescriptor(), this, tables);
         }
 
-        List defaultTablePrimaryKeyFields = getReferenceDescriptor().getPrimaryKeyFields();
+        List<DatabaseField> defaultTablePrimaryKeyFields = getReferenceDescriptor().getPrimaryKeyFields();
         if(this.targetForeignKeyTable.equals(getReferenceDescriptor().getDefaultTable())) {
             this.targetPrimaryKeyFields = defaultTablePrimaryKeyFields;
         } else {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/OneToOneMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/OneToOneMapping.java
index 9e13492..085fc05 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/OneToOneMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/OneToOneMapping.java
@@ -156,7 +156,7 @@
      */
     @Override
     public void addFieldsForMapKey(AbstractRecord joinRow){
-        Iterator i = getForeignKeyFields().iterator();
+        Iterator<DatabaseField> i = getForeignKeyFields().iterator();
         while (i.hasNext()){
             joinRow.put((DatabaseField)i.next(), null);
         }
@@ -307,7 +307,7 @@
                     }
                 }
 
-                Iterator keyIterator = Arrays.asList(((CacheId)extractKeyFromReferenceObject(value, session)).getPrimaryKey()).iterator();
+                Iterator<Object> keyIterator = Arrays.asList(((CacheId)extractKeyFromReferenceObject(value, session)).getPrimaryKey()).iterator();
                 for (DatabaseField field : getSourceToTargetKeyFields().keySet()) {
                     Expression join = null;
                     join = base.getField(field).equal(keyIterator.next());
@@ -379,8 +379,8 @@
         Expression foreignKeyJoin = null;
         if(this.mechanism == null) {
             if (expression==argument){
-                for (Iterator sourceFieldsEnum = getSourceToTargetKeyFields().keySet().iterator();
-                         sourceFieldsEnum.hasNext();) {
+                for (Iterator<DatabaseField> sourceFieldsEnum = getSourceToTargetKeyFields().keySet().iterator();
+                     sourceFieldsEnum.hasNext();) {
                     DatabaseField field = (DatabaseField)sourceFieldsEnum.next();
                     Expression join = base.getField(field);
                     join = join.equal(join);
@@ -391,9 +391,9 @@
                     }
                 }
             }else{
-                Iterator targetFieldsEnum = getSourceToTargetKeyFields().values().iterator();
-                for (Iterator sourceFieldsEnum = getSourceToTargetKeyFields().keySet().iterator();
-                         sourceFieldsEnum.hasNext();) {
+                Iterator<DatabaseField> targetFieldsEnum = getSourceToTargetKeyFields().values().iterator();
+                for (Iterator<DatabaseField> sourceFieldsEnum = getSourceToTargetKeyFields().keySet().iterator();
+                     sourceFieldsEnum.hasNext();) {
                     DatabaseField sourceField = (DatabaseField)sourceFieldsEnum.next();
                     DatabaseField targetField = (DatabaseField)targetFieldsEnum.next();
                     Expression join = null;
@@ -750,7 +750,7 @@
      */
     @Override
     public Object extractPrimaryKeysForReferenceObjectFromRow(AbstractRecord row) {
-        List primaryKeyFields = getReferenceDescriptor().getPrimaryKeyFields();
+        List<DatabaseField> primaryKeyFields = getReferenceDescriptor().getPrimaryKeyFields();
         Object[] result = new  Object[primaryKeyFields.size()];
         for (int index = 0; index < primaryKeyFields.size(); index++) {
             DatabaseField targetKeyField = (DatabaseField)primaryKeyFields.get(index);
@@ -919,8 +919,8 @@
      */
     public Vector getForeignKeyFieldNames() {
         Vector fieldNames = new Vector(getForeignKeyFields().size());
-        for (Enumeration fieldsEnum = getForeignKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -999,7 +999,7 @@
      * as the corresponding primary key fields are in their descriptor.
      */
     public Vector getOrderedForeignKeyFields() {
-        List primaryKeyFields = getPrimaryKeyDescriptor().getPrimaryKeyFields();
+        List<DatabaseField> primaryKeyFields = getPrimaryKeyDescriptor().getPrimaryKeyFields();
         Vector result = new Vector(primaryKeyFields.size());
 
         for (int index = 0; index < primaryKeyFields.size(); index++) {
@@ -1051,8 +1051,8 @@
      */
     public Vector getSourceToTargetKeyFieldAssociations() {
         Vector associations = new Vector(getSourceToTargetKeyFields().size());
-        Iterator sourceFieldEnum = getSourceToTargetKeyFields().keySet().iterator();
-        Iterator targetFieldEnum = getSourceToTargetKeyFields().values().iterator();
+        Iterator<DatabaseField> sourceFieldEnum = getSourceToTargetKeyFields().keySet().iterator();
+        Iterator<DatabaseField> targetFieldEnum = getSourceToTargetKeyFields().values().iterator();
         while (sourceFieldEnum.hasNext()) {
             Object fieldValue = ((DatabaseField)sourceFieldEnum.next()).getQualifiedName();
             Object attributeValue = ((DatabaseField)targetFieldEnum.next()).getQualifiedName();
@@ -1404,7 +1404,7 @@
                 throw DescriptorException.noForeignKeysAreSpecified(this);
             }
 
-            for (Iterator keys = getSourceToTargetKeyFields().keySet().iterator(); keys.hasNext();) {
+            for (Iterator<DatabaseField> keys = getSourceToTargetKeyFields().keySet().iterator(); keys.hasNext();) {
                 DatabaseField foreignKey = (DatabaseField)keys.next();
                 DatabaseField targetKey = getSourceToTargetKeyFields().get(foreignKey);
 
@@ -1449,7 +1449,7 @@
         ClassDescriptor descriptor = getReferenceDescriptor();
         AbstractRecord targetRow = new DatabaseRecord();
 
-        for (Iterator keys = getSourceToTargetKeyFields().keySet().iterator(); keys.hasNext();) {
+        for (Iterator<DatabaseField> keys = getSourceToTargetKeyFields().keySet().iterator(); keys.hasNext();) {
             DatabaseField foreignKey = (DatabaseField)keys.next();
             DatabaseField targetKey = getSourceToTargetKeyFields().get(foreignKey);
 
@@ -1764,7 +1764,7 @@
     @Override
     public void writeFromAttributeIntoRow(Object attribute, AbstractRecord row, AbstractSession session)
     {
-          for (Enumeration fieldsEnum = getForeignKeyFields().elements(); fieldsEnum.hasMoreElements();) {
+          for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements(); fieldsEnum.hasMoreElements();) {
                   DatabaseField sourceKey = (DatabaseField) fieldsEnum.nextElement();
                   DatabaseField targetKey = getSourceToTargetKeyFields().get(sourceKey);
                   Object referenceValue = null;
@@ -2078,8 +2078,8 @@
             return;
         }
 
-        for (Enumeration fieldsEnum = getForeignKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             DatabaseField sourceKey = (DatabaseField)fieldsEnum.nextElement();
             databaseRow.add(sourceKey, null);
         }
@@ -2095,7 +2095,7 @@
             return;
         }
 
-        for (Enumeration fieldsEnum = getForeignKeyFields().elements(); fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements(); fieldsEnum.hasMoreElements();) {
             DatabaseField sourceKey = (DatabaseField)fieldsEnum.nextElement();
 
             if (shouldWriteField(sourceKey, WriteType.INSERT)) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/RelationTableMechanism.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/RelationTableMechanism.java
index 6b418f8..f577eb3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/RelationTableMechanism.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/RelationTableMechanism.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
@@ -316,8 +316,8 @@
      */
     public Vector getSourceKeyFieldNames() {
         Vector fieldNames = new Vector(getSourceKeyFields().size());
-        for (Enumeration fieldsEnum = getSourceKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getSourceKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -417,8 +417,8 @@
      */
     public Vector getSourceRelationKeyFieldNames() {
         Vector fieldNames = new Vector(getSourceRelationKeyFields().size());
-        for (Enumeration fieldsEnum = getSourceRelationKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getSourceRelationKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -440,8 +440,8 @@
      */
     public Vector getTargetKeyFieldNames() {
         Vector fieldNames = new Vector(getTargetKeyFields().size());
-        for (Enumeration fieldsEnum = getTargetKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getTargetKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -475,8 +475,8 @@
      */
     public Vector getTargetRelationKeyFieldNames() {
         Vector fieldNames = new Vector(getTargetRelationKeyFields().size());
-        for (Enumeration fieldsEnum = getTargetRelationKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getTargetRelationKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -733,7 +733,7 @@
             throw DescriptorException.noSourceRelationKeysSpecified(mapping);
         }
 
-        for (Enumeration entry = getSourceRelationKeyFields().elements(); entry.hasMoreElements();) {
+        for (Enumeration<DatabaseField> entry = getSourceRelationKeyFields().elements(); entry.hasMoreElements();) {
             DatabaseField field = (DatabaseField)entry.nextElement();
 
             // Update the fields table first if the mapping is from a table per tenant entity.
@@ -780,7 +780,7 @@
             throw DescriptorException.noTargetRelationKeysSpecified(mapping);
         }
 
-        for (Enumeration targetEnum = getTargetRelationKeyFields().elements(); targetEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> targetEnum = getTargetRelationKeyFields().elements(); targetEnum.hasMoreElements();) {
             DatabaseField field = (DatabaseField)targetEnum.nextElement();
 
             // Update the fields table first if the mapping is from a table per tenant entity.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/UnidirectionalOneToManyMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/UnidirectionalOneToManyMapping.java
index 5f3294e..a605bb5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/UnidirectionalOneToManyMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/UnidirectionalOneToManyMapping.java
@@ -245,7 +245,7 @@
     public void postCalculateChanges(org.eclipse.persistence.sessions.changesets.ChangeRecord changeRecord, UnitOfWorkImpl uow) {
         // targets are added to and/or removed to/from the source.
         CollectionChangeRecord collectionChangeRecord = (CollectionChangeRecord)changeRecord;
-        Iterator it = collectionChangeRecord.getAddObjectList().values().iterator();
+        Iterator<ObjectChangeSet> it = collectionChangeRecord.getAddObjectList().values().iterator();
         while(it.hasNext()) {
             ObjectChangeSet change = (ObjectChangeSet)it.next();
             if(!change.hasChanges()) {
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 fa28eba..e534ab9 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
@@ -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
@@ -194,7 +194,7 @@
             sourceToTarget.put(clonedField, getSourceToTargetQueryKeyNames().get(field));
         }
 
-        for (Enumeration enumtr = getForeignKeyFields().elements(); enumtr.hasMoreElements();) {
+        for (Enumeration<DatabaseField> enumtr = getForeignKeyFields().elements(); enumtr.hasMoreElements();) {
             DatabaseField field = (DatabaseField)enumtr.nextElement();
             foreignKeys.addElement(setOfKeys.get(field));
         }
@@ -323,7 +323,7 @@
             return null;
         }
         // Search any of the implementor descriptors for a mapping for the query-key.
-        Iterator iterator = getReferenceDescriptor().getInterfacePolicy().getChildDescriptors().iterator();
+        Iterator<ClassDescriptor> iterator = getReferenceDescriptor().getInterfacePolicy().getChildDescriptors().iterator();
         if (iterator.hasNext()) {
             ClassDescriptor firstChild = (ClassDescriptor)iterator.next();
             DatabaseMapping mapping = firstChild.getObjectBuilder().getMappingForAttributeName(queryKey);
@@ -345,8 +345,8 @@
      */
     public Vector getForeignKeyFieldNames() {
         Vector fieldNames = new Vector(getForeignKeyFields().size());
-        for (Enumeration fieldsEnum = getForeignKeyFields().elements();
-                 fieldsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements();
+             fieldsEnum.hasMoreElements();) {
             fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
         }
 
@@ -475,7 +475,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        referenceClass = AccessController.doPrivileged(new PrivilegedClassForName(referenceClassName, true, classLoader));
+                        referenceClass = AccessController.doPrivileged(new PrivilegedClassForName<>(referenceClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(referenceClassName, exception.getException());
                     }
@@ -822,7 +822,7 @@
             return;
         }
         if (isForeignKeyRelationship()) {
-            Enumeration foreignKeys = getForeignKeyFields().elements();
+            Enumeration<DatabaseField> foreignKeys = getForeignKeyFields().elements();
             while (foreignKeys.hasMoreElements()) {
                 record.put((DatabaseField)foreignKeys.nextElement(), null);
                 // EL Bug 319759 - if a field is null, then the update call cache should not be used
@@ -853,7 +853,7 @@
             writeFromNullObjectIntoRow(record);
         } else {
             if (isForeignKeyRelationship()) {
-                Enumeration sourceFields = getForeignKeyFields().elements();
+                Enumeration<DatabaseField> sourceFields = getForeignKeyFields().elements();
                 ClassDescriptor descriptor = session.getDescriptor(referenceObject.getClass());
                 while (sourceFields.hasMoreElements()) {
                     DatabaseField sourceKey = (DatabaseField)sourceFields.nextElement();
@@ -894,7 +894,7 @@
         } else {
             Object referenceObject = changeSet.getUnitOfWorkClone();
             if (isForeignKeyRelationship()) {
-                Enumeration sourceFields = getForeignKeyFields().elements();
+                Enumeration<DatabaseField> sourceFields = getForeignKeyFields().elements();
                 ClassDescriptor descriptor = session.getDescriptor(referenceObject.getClass());
                 while (sourceFields.hasMoreElements()) {
                     DatabaseField sourceKey = (DatabaseField)sourceFields.nextElement();
@@ -972,7 +972,7 @@
             writeFromNullObjectIntoRow(record);
         } else {
             if (isForeignKeyRelationship()) {
-                Enumeration sourceFields = getForeignKeyFields().elements();
+                Enumeration<DatabaseField> sourceFields = getForeignKeyFields().elements();
                 ClassDescriptor descriptor = query.getSession().getDescriptor(referenceObject.getClass());
                 while (sourceFields.hasMoreElements()) {
                     DatabaseField sourceKey = (DatabaseField)sourceFields.nextElement();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ClassInstanceConverter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ClassInstanceConverter.java
index a05630b..972c756 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ClassInstanceConverter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ClassInstanceConverter.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
@@ -52,7 +52,7 @@
     public Object convertDataValueToObjectValue(Object fieldValue, Session session) {
         Object attributeValue = null;
         if (fieldValue != null) {
-            Class attributeClass = (Class) session.getDatasourcePlatform().convertObject(fieldValue, ClassConstants.CLASS);
+            Class attributeClass = session.getDatasourcePlatform().convertObject(fieldValue, ClassConstants.CLASS);
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ConverterClass.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ConverterClass.java
index 492b259..ef6a3cb 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ConverterClass.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ConverterClass.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2019 Payara Services Ltd.
  *
  * This program and the accompanying materials are made available under the
@@ -122,17 +122,16 @@
         }
     }
 
-    @SuppressWarnings("unchecked")
     private Class<T> getAttributeConverterClass(ClassLoader classLoader) {
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
-                    return AccessController.doPrivileged(new PrivilegedClassForName(attributeConverterClassName, true, classLoader));
+                    return AccessController.doPrivileged(new PrivilegedClassForName<T>(attributeConverterClassName, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(attributeConverterClassName, exception.getException());
                 }
             } else {
-                return PrivilegedAccessHelper.getClassForName(attributeConverterClassName, true, classLoader);
+                return PrivilegedAccessHelper.<T>getClassForName(attributeConverterClassName, true, classLoader);
             }
         } catch (ClassNotFoundException exception) {
             throw ValidationException.classNotFoundWhileConvertingClassNames(attributeConverterClassName, exception);
@@ -143,7 +142,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    fieldClassification = AccessController.doPrivileged(new PrivilegedClassForName(fieldClassificationName, true, classLoader));
+                    fieldClassification = AccessController.doPrivileged(new PrivilegedClassForName<>(fieldClassificationName, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(fieldClassificationName, exception.getException());
                 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/EnumTypeConverter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/EnumTypeConverter.java
index 19f32b0..f1d3868 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/EnumTypeConverter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/EnumTypeConverter.java
@@ -117,7 +117,7 @@
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
                         m_enumClass = AccessController.doPrivileged(
-                            new PrivilegedClassForName(m_enumClassName, true, classLoader));
+                            new PrivilegedClassForName<>(m_enumClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(
                             m_enumClassName, exception.getException());
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ObjectTypeConverter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ObjectTypeConverter.java
index eac8609..618d1b3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ObjectTypeConverter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ObjectTypeConverter.java
@@ -197,7 +197,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    return AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                    return AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                 } catch (PrivilegedActionException e) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(className, e.getException());
                 }
@@ -418,7 +418,7 @@
     private Object initObject(Class type, String value, boolean isData) {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
             try {
-                Constructor constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(type, new Class[] {String.class}, false));
+                Constructor<Class<?>> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<Class<?>>(type, new Class[] {String.class}, false));
                 return AccessController.doPrivileged(new PrivilegedInvokeConstructor(constructor, new Object[] {value}));
             } catch (PrivilegedActionException exception) {
                 throwInitObjectException(exception, type, value, isData);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/SerializedObjectConverter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/SerializedObjectConverter.java
index 34469b1..3857e6d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/SerializedObjectConverter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/SerializedObjectConverter.java
@@ -96,7 +96,7 @@
             if (this.serializerClassName != null) {
                 Class serializerClass = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    serializerClass = AccessController.doPrivileged(new PrivilegedClassForName(this.serializerClassName, true, classLoader));
+                    serializerClass = AccessController.doPrivileged(new PrivilegedClassForName<>(this.serializerClassName, true, classLoader));
                 } else {
                     serializerClass = PrivilegedAccessHelper.getClassForName(this.serializerClassName, true, classLoader);
                 }
@@ -133,7 +133,7 @@
         } else if (this.serializer.getType() == ClassConstants.STRING) {
             String text;
             try {
-                text = (String) session.getDatasourcePlatform().convertObject(fieldValue, ClassConstants.STRING);
+                text = session.getDatasourcePlatform().convertObject(fieldValue, ClassConstants.STRING);
             } catch (ConversionException exception) {
                 throw ConversionException.couldNotBeConverted(this.mapping, this.mapping.getDescriptor(), exception);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/TypeConversionConverter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/TypeConversionConverter.java
index 7675482..1666123 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/TypeConversionConverter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/TypeConversionConverter.java
@@ -78,7 +78,7 @@
             if (dataClassName != null){
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        dataClass = AccessController.doPrivileged(new PrivilegedClassForName(dataClassName, true, classLoader));
+                        dataClass = AccessController.doPrivileged(new PrivilegedClassForName<>(dataClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(dataClassName, exception.getException());
                     }
@@ -94,7 +94,7 @@
             if (objectClassName != null){
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        objectClass = AccessController.doPrivileged(new PrivilegedClassForName(objectClassName, true, classLoader));
+                        objectClass = AccessController.doPrivileged(new PrivilegedClassForName<>(objectClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(objectClassName, exception.getException());
                     }
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 d010594..437974e 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
@@ -148,7 +148,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        converterClass = AccessController.doPrivileged(new PrivilegedClassForName(converterClassName, true, classLoader));
+                        converterClass = AccessController.doPrivileged(new PrivilegedClassForName<>(converterClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(converterClassName, exception.getException());
                     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractDirectMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractDirectMapping.java
index 7a68602..52aabcc 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractDirectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/foundation/AbstractDirectMapping.java
@@ -463,7 +463,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        attributeClass = AccessController.doPrivileged(new PrivilegedClassForName(getAttributeClassificationName(), true, classLoader));
+                        attributeClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getAttributeClassificationName(), true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(getAttributeClassificationName(), exception.getException());
                     }
@@ -481,7 +481,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        fieldClassification = AccessController.doPrivileged(new PrivilegedClassForName(fieldClassificationClassName, true, classLoader));
+                        fieldClassification = AccessController.doPrivileged(new PrivilegedClassForName<>(fieldClassificationClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(fieldClassificationClassName, exception.getException());
                     }
@@ -952,7 +952,7 @@
             }
         }
 
-        Map nullValues = session.getPlatform(this.descriptor.getJavaClass()).getConversionManager().getDefaultNullValues();
+        Map<Class<?>, Object> nullValues = session.getPlatform(this.descriptor.getJavaClass()).getConversionManager().getDefaultNullValues();
         bypassDefaultNullValueCheck = (!this.attributeClassification.isPrimitive()) &&
                 ((nullValues == null) || (!nullValues.containsKey(this.attributeClassification)));
     }
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 1d207ee..cac226d 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
@@ -559,7 +559,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        attributeTransformerClass = AccessController.doPrivileged(new PrivilegedClassForName(attributeTransformerClassName, true, classLoader));
+                        attributeTransformerClass = AccessController.doPrivileged(new PrivilegedClassForName<>(attributeTransformerClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(attributeTransformerClassName, exception.getException());
                     }
@@ -584,7 +584,7 @@
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                         try {
-                            transformerClass = AccessController.doPrivileged(new PrivilegedClassForName(transformerClassName, true, classLoader));
+                            transformerClass = AccessController.doPrivileged(new PrivilegedClassForName<>(transformerClassName, true, classLoader));
                         } catch (PrivilegedActionException exception) {
                             throw ValidationException.classNotFoundWhileConvertingClassNames(transformerClassName, exception.getException());
                         }
@@ -802,7 +802,7 @@
      */
     public Hashtable getFieldNameToMethodNames() {
         Hashtable table = new Hashtable(getFieldTransformations().size());
-        Iterator transformations = getFieldTransformations().iterator();
+        Iterator<FieldTransformation> transformations = getFieldTransformations().iterator();
         while (transformations.hasNext()) {
             FieldTransformation transformation = (FieldTransformation)transformations.next();
             if (transformation instanceof MethodBasedFieldTransformation) {
@@ -850,7 +850,7 @@
                 } else if (field.getColumnDefinition() != null) {
                     // Search for the type for this field definition.
                     if (session.getDatasourcePlatform() instanceof DatabasePlatform) {
-                        Iterator iterator = session.getPlatform().getFieldTypes().entrySet().iterator();
+                        Iterator<Map.Entry<Class, FieldTypeDefinition>> iterator = session.getPlatform().getFieldTypes().entrySet().iterator();
                         while (iterator.hasNext()) {
                             Map.Entry entry = (Map.Entry)iterator.next();
                             if (((FieldTypeDefinition)entry.getValue()).getName().equals(field.getColumnDefinition())) {
@@ -1161,7 +1161,7 @@
      */
     public Vector getFieldNameToMethodNameAssociations() {
         Vector associations = new Vector();
-        for (Iterator source = getFieldTransformations().iterator(); source.hasNext();) {
+        for (Iterator<FieldTransformation> source = getFieldTransformations().iterator(); source.hasNext();) {
             FieldTransformation tf = (FieldTransformation)source.next();
             if (tf instanceof MethodBasedFieldTransformation) {
                 Association ass = new Association();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/querykeys/ForeignReferenceQueryKey.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/querykeys/ForeignReferenceQueryKey.java
index 7aef98a..4ec7f0e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/querykeys/ForeignReferenceQueryKey.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/querykeys/ForeignReferenceQueryKey.java
@@ -58,7 +58,7 @@
             if (referenceClassName != null){
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        referenceClass = AccessController.doPrivileged(new PrivilegedClassForName(referenceClassName, true, classLoader));
+                        referenceClass = AccessController.doPrivileged(new PrivilegedClassForName<>(referenceClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(referenceClassName, exception.getException());
                     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLContext.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLContext.java
index 2537d03..f720116 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLContext.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLContext.java
@@ -454,7 +454,7 @@
     */
     public void applyORMMetadata(AbstractSession ormSession) {
         //Iterate over the ORM descriptors and check for matching OXM descriptors
-        Iterator ormDescriptors = ormSession.getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> ormDescriptors = ormSession.getDescriptors().values().iterator();
         while(ormDescriptors.hasNext()) {
             ClassDescriptor ormDescriptor = (ClassDescriptor)ormDescriptors.next();
             Class javaClass = ormDescriptor.getJavaClass();
@@ -732,7 +732,7 @@
          */
         private void addSession(DatabaseSession sessionToAdd) {
             if ((sessionToAdd.getDatasourceLogin() == null) || !(sessionToAdd.getDatasourceLogin().getDatasourcePlatform() instanceof XMLPlatform)) {
-                XMLPlatform platform = new SAXPlatform();
+                XMLPlatform<org.eclipse.persistence.internal.oxm.XMLUnmarshaller> platform = new SAXPlatform();
                 sessionToAdd.setLogin(new XMLLogin(platform));
             }
             DatabaseSession session = sessionToAdd.getProject().createDatabaseSession();
@@ -772,7 +772,7 @@
                 dbSession = (DatabaseSession) SessionManager.getManager().getSession(sessionLoader, sessionName, privilegedGetClassLoaderForClass(this.getClass()), false, false, false);
             }
             if ((dbSession.getDatasourceLogin() == null) || !(dbSession.getDatasourceLogin().getDatasourcePlatform() instanceof XMLPlatform)) {
-                XMLPlatform platform = new SAXPlatform();
+                XMLPlatform<org.eclipse.persistence.internal.oxm.XMLUnmarshaller> platform = new SAXPlatform();
                 dbSession.setLogin(new XMLLogin(platform));
             }
             DatabaseSession session = dbSession.getProject().createDatabaseSession();
@@ -896,7 +896,7 @@
         @Override
         protected void preLogin(Project project, ClassLoader classLoader) {
             if ((project.getDatasourceLogin() == null) || !(project.getDatasourceLogin().getDatasourcePlatform() instanceof XMLPlatform)) {
-                XMLPlatform platform = new SAXPlatform();
+                XMLPlatform<org.eclipse.persistence.internal.oxm.XMLUnmarshaller> platform = new SAXPlatform();
                 platform.getConversionManager().setLoader(classLoader);
                 project.setLogin(new XMLLogin(platform));
             }
@@ -905,7 +905,7 @@
         private void setupDocumentPreservationPolicy(DatabaseSession session) {
             XMLLogin login = (XMLLogin) session.getDatasourceLogin();
             if (login.getDocumentPreservationPolicy() == null) {
-                Iterator iterator = session.getProject().getOrderedDescriptors().iterator();
+                Iterator<ClassDescriptor> iterator = session.getProject().getOrderedDescriptors().iterator();
                 while (iterator.hasNext()) {
                     Descriptor xmlDescriptor = (Descriptor) iterator.next();
                     if (xmlDescriptor.shouldPreserveDocument()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLDescriptor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLDescriptor.java
index d2d1013..9c5d5f2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLDescriptor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLDescriptor.java
@@ -583,7 +583,7 @@
         setInitializationStage(PREINITIALIZED);
 
         // Allow mapping pre init, must be done before validate.
-        for (Enumeration mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
             try {
                 DatabaseMapping mapping = (DatabaseMapping) mappingsEnum.nextElement();
                 mapping.preInitialize(session);
@@ -764,7 +764,7 @@
             }
         }
 
-        for (Enumeration mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
+        for (Enumeration<DatabaseMapping> mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
             DatabaseMapping mapping = (DatabaseMapping) mappingsEnum.nextElement();
             validateMappingType(mapping);
             mapping.initialize(session);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLMarshaller.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLMarshaller.java
index caf8fa3..90b9b47 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLMarshaller.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLMarshaller.java
@@ -147,7 +147,7 @@
                 }
             }
         }else{
-            Class objectClass = object.getClass();
+            Class<? extends Object> objectClass = object.getClass();
             if(result instanceof ExtendedResult){
                 MarshalRecord writerRecord = ((ExtendedResult)result).createRecord();
                 if(object instanceof Collection){
@@ -374,7 +374,7 @@
                 }
             }
         }else{
-            Class objectClass = object.getClass();
+            Class<? extends Object> objectClass = object.getClass();
             session = context.getSession(objectClass);
             descriptor = getDescriptor(objectClass, session);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLUnionField.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLUnionField.java
index 1a6f733..3b38acc 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLUnionField.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLUnionField.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
@@ -247,7 +247,7 @@
                 return theClass;
             }
         }
-        Class javaClass = conversionManager.javaType(qname);
+        Class<Object> javaClass = conversionManager.javaType(qname);
         return XMLConversionManager.getObjectClass(javaClass);
     }
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAbstractAnyMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAbstractAnyMapping.java
index 1f41c52..e6fff6f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAbstractAnyMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLAbstractAnyMapping.java
@@ -36,7 +36,6 @@
 import org.eclipse.persistence.queries.ObjectBuildingQuery;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
-import org.w3c.dom.Text;
 
 /**
  * <p><b>Purpose:</b> An abstract superclass for XMLAnyObjectMapping and XMLAnyCollectionMapping.
@@ -154,7 +153,7 @@
                 Object convertedValue = stringValue;
                 if (schemaTypeQName != null) {
                     ConversionManager conversionManager = (ConversionManager) session.getDatasourcePlatform().getConversionManager();
-                    Class theClass = conversionManager.javaType(schemaTypeQName);
+                    Class<Object> theClass = conversionManager.javaType(schemaTypeQName);
                     if (theClass != null) {
                         convertedValue = conversionManager.convertObject(convertedValue, theClass, schemaTypeQName);
                     }
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 971c289..8a541c3 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
@@ -196,7 +196,7 @@
         }
         ContainerPolicy cp = getContainerPolicy();
         if (cp != null && cp.getContainerClass() == null) {
-            Class cls = session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(cp.getContainerClassName());
+            Class<Object> cls = session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(cp.getContainerClassName());
             cp.setContainerClass(cls);
         }
     }
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 1866fc3..17aefba 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
@@ -754,7 +754,7 @@
         }
         XMLDescriptor parentDesc = (XMLDescriptor) this.getDescriptor();
         XMLField field = (XMLField) this.getField();
-        Iterator mappings = parentDesc.getMappings().iterator();
+        Iterator<DatabaseMapping> mappings = parentDesc.getMappings().iterator();
         int mappingsInContext = 0;
         while (mappings.hasNext()) {
             DatabaseMapping next = (DatabaseMapping) mappings.next();
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 473af49..38d71a2 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
@@ -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
@@ -573,7 +573,7 @@
         }
         XMLDescriptor parentDesc = (XMLDescriptor) this.getDescriptor();
         XMLField field = (XMLField) this.getField();
-        Iterator mappings = parentDesc.getMappings().iterator();
+        Iterator<DatabaseMapping> mappings = parentDesc.getMappings().iterator();
         int mappingsInContext = 0;
         while (mappings.hasNext()) {
             DatabaseMapping next = (DatabaseMapping) mappings.next();
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 f180055..9f026b1 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
@@ -346,7 +346,7 @@
     }
 
     private XMLField getFieldForName(String localName, String namespaceUri) {
-        Iterator fields = getFields().iterator();
+        Iterator<DatabaseField> fields = getFields().iterator();
         while(fields.hasNext()) {
             XMLField nextField = (XMLField)fields.next();
             XPathFragment fragment = nextField.getXPathFragment();
@@ -614,7 +614,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                        elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                     }
@@ -637,7 +637,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                        elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                     }
@@ -659,7 +659,7 @@
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                         try {
-                            elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                            elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                         } catch (PrivilegedActionException exception) {
                             throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                         }
@@ -679,7 +679,7 @@
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                         try {
-                            elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                            elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                         } catch (PrivilegedActionException exception) {
                             throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                         }
@@ -771,7 +771,7 @@
                  XMLBinaryDataCollectionMapping xmlMapping = new XMLBinaryDataCollectionMapping();
                  xmlMapping.setField(xmlField);
                  xmlMapping.setAttributeAccessor(temporaryAccessor);
-                 Class theClass = XMLConversionManager.getDefaultXMLManager().convertClassNameToClass(className);
+                 Class<Object> theClass = XMLConversionManager.getDefaultXMLManager().convertClassNameToClass(className);
                  xmlMapping.setAttributeElementClass(theClass);
                  this.choiceElementMappings.put(xmlField, xmlMapping);
                  this.choiceElementMappingsByClassName.put(className, xmlMapping);
@@ -973,7 +973,7 @@
         }
         XMLField field = new XMLField(xpath);
         XMLCompositeDirectCollectionMapping xmlMapping = new XMLCompositeDirectCollectionMapping();
-        Class theClass = ClassConstants.STRING;
+        Class<String> theClass = ClassConstants.STRING;
         xmlMapping.setAttributeElementClass(theClass);
         xmlMapping.setField(field);
         xmlMapping.setAttributeAccessor(temporaryAccessor);
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 4f6982f..3240233 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
@@ -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
@@ -269,7 +269,7 @@
     @Override
     public void writeFromObjectIntoRow(Object object, AbstractRecord row, AbstractSession session, WriteType writeType) throws DescriptorException {
         Object value = getAttributeValueFromObject(object);
-        Class valueClass = value.getClass();
+        Class<? extends Object> valueClass = value.getClass();
         if(valueClass == XMLRoot.class) {
             //look for a nested mapping based on the Root's QName
             XMLRoot root = (XMLRoot)value;
@@ -508,7 +508,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                        elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                     }
@@ -532,7 +532,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                        elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                     }
@@ -555,7 +555,7 @@
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                         try {
-                            elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                            elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                         } catch (PrivilegedActionException exception) {
                             throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                         }
@@ -578,7 +578,7 @@
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                         try {
-                            elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                            elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                         } catch (PrivilegedActionException exception) {
                             throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                         }
@@ -598,7 +598,7 @@
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                         try {
-                            elementType = AccessController.doPrivileged(new PrivilegedClassForName(className, true, classLoader));
+                            elementType = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, classLoader));
                         } catch (PrivilegedActionException exception) {
                             throw ValidationException.classNotFoundWhileConvertingClassNames(className, exception.getException());
                         }
@@ -691,7 +691,7 @@
              if(isBinaryType(className)) {
                  XMLBinaryDataMapping xmlMapping = new XMLBinaryDataMapping();
                  xmlMapping.setField(xmlField);
-                 Class theClass = XMLConversionManager.getDefaultXMLManager().convertClassNameToClass(className);
+                 Class<Object> theClass = XMLConversionManager.getDefaultXMLManager().convertClassNameToClass(className);
                  xmlMapping.setAttributeClassification(theClass);
                  xmlMapping.setAttributeAccessor(temporaryAccessor);
                  if(this.choiceElementMappings.get(xmlField) == null) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCollectionReferenceMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCollectionReferenceMapping.java
index 596a6b9..6564e72 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCollectionReferenceMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCollectionReferenceMapping.java
@@ -274,7 +274,7 @@
         ContainerPolicy cp = getContainerPolicy();
         if (cp != null) {
             if (cp.getContainerClass() == null) {
-                Class cls = session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(cp.getContainerClassName());
+                Class<Object> cls = session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(cp.getContainerClassName());
                 cp.setContainerClass(cls);
             }
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeCollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeCollectionMapping.java
index b1901cc..fd758f1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeCollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeCollectionMapping.java
@@ -60,7 +60,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
 
 /**
  * <p>Composite collection XML mappings map an attribute that contains a homogeneous collection of objects
@@ -326,7 +325,7 @@
         ContainerPolicy cp = getContainerPolicy();
         if (cp != null) {
             if (cp.getContainerClass() == null) {
-                Class cls = session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(cp.getContainerClassName());
+                Class<Object> cls = session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(cp.getContainerClassName());
                 cp.setContainerClass(cls);
             }
             if (cp instanceof MapContainerPolicy) {
@@ -620,7 +619,7 @@
             typeFragment.setNamespaceURI(namespaceURI);
             QName schemaTypeQName = new QName(namespaceURI, typeFragment.getLocalName());
             ConversionManager conversionManager = (ConversionManager) executionSession.getDatasourcePlatform().getConversionManager();
-            Class theClass = conversionManager.javaType(schemaTypeQName);
+            Class<Object> theClass = conversionManager.javaType(schemaTypeQName);
             if (theClass != null) {
                 objectToAdd = conversionManager.convertObject(stringValue, theClass, schemaTypeQName);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeDirectCollectionMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeDirectCollectionMapping.java
index e3543e9..0d9a2b2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeDirectCollectionMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeDirectCollectionMapping.java
@@ -283,7 +283,7 @@
         ContainerPolicy cp = getContainerPolicy();
         if (cp != null) {
             if (cp.getContainerClass() == null) {
-                Class cls = session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(cp.getContainerClassName());
+                Class<Object> cls = session.getDatasourcePlatform().getConversionManager().convertClassNameToClass(cp.getContainerClassName());
                 cp.setContainerClass(cls);
             }
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeObjectMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeObjectMapping.java
index fb9bb72..9b5e81a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeObjectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLCompositeObjectMapping.java
@@ -55,7 +55,6 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
 
 /**
  * <p>Composite object XML mappings represent a relationship between two classes.  In XML, the "owned"
@@ -610,7 +609,7 @@
 
             QName schemaTypeQName = new QName(namespaceURI, typeFragment.getLocalName());
             ConversionManager conversionManager = (ConversionManager) executionSession.getDatasourcePlatform().getConversionManager();
-            Class theClass = conversionManager.javaType(schemaTypeQName);
+            Class<Object> theClass = conversionManager.javaType(schemaTypeQName);
             if (theClass != null) {
                 toReturn = conversionManager.convertObject(stringValue, theClass, schemaTypeQName);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLObjectReferenceMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLObjectReferenceMapping.java
index 17abadf..30cef4c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLObjectReferenceMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLObjectReferenceMapping.java
@@ -163,7 +163,7 @@
             }
             primaryKeys.set(0, object);
         } else {
-            Vector pkFieldNames = referenceDescriptor.getPrimaryKeyFieldNames();
+            Vector<String> pkFieldNames = referenceDescriptor.getPrimaryKeyFieldNames();
             // if reference is null, create a new instance and set it on the resolver
             if (reference == null) {
                 primaryKeys = new CacheId(new Object[pkFieldNames.size()]);
@@ -302,7 +302,7 @@
      *
      */
     protected String getValueToWrite(QName schemaType, Object value, AbstractSession session) {
-        return (String) ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.STRING, schemaType);
+        return ((XMLConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, ClassConstants.STRING, schemaType);
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/converters/XMLListConverter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/converters/XMLListConverter.java
index 8ff677b..fc9a660 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/converters/XMLListConverter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/converters/XMLListConverter.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
@@ -60,7 +60,7 @@
         try {
             if (getObjectClassName() != null) {
                 ClassLoader loader = session.getDatasourcePlatform().getConversionManager().getLoader();
-                Class aClass = AccessController.doPrivileged(new PrivilegedClassForName(getObjectClassName(), true, loader));
+                Class<Object> aClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getObjectClassName(), true, loader));
                 setObjectClass(aClass);
             }
         } catch (PrivilegedActionException pae) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/nullpolicy/IsSetNullPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/nullpolicy/IsSetNullPolicy.java
index edaf678..6d8b174 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/nullpolicy/IsSetNullPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/nullpolicy/IsSetNullPolicy.java
@@ -161,7 +161,7 @@
      */
     private boolean isSet(Object object) {
         try {
-            Boolean isSet = (Boolean) PrivilegedAccessHelper.invokeMethod(getIsSetMethod(object.getClass()), object, isSetParameters);
+            Boolean isSet = PrivilegedAccessHelper.invokeMethod(getIsSetMethod(object.getClass()), object, isSetParameters);
             return isSet;
         } catch (Exception e) {
             throw new RuntimeException(e);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JSONWriterRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JSONWriterRecord.java
index 03384f3..cd593b3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JSONWriterRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JSONWriterRecord.java
@@ -485,7 +485,7 @@
          } else if(value.getClass() == String.class){
              //if schemaType is set and it's a numeric or boolean type don't treat as a string
              if(schemaType != null && isNumericOrBooleanType(schemaType)){
-                 String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
+                 String convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
                  characters(convertedValue, false, isAttribute);
              }else if(isCDATA){
                  cdata((String)value);
@@ -494,8 +494,8 @@
              }
         }else{
             ConversionManager conversionManager = getConversionManager();
-            String convertedValue = (String) conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
-            Class theClass = conversionManager.javaType(schemaType);
+            String convertedValue = conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
+            Class<Object> theClass = conversionManager.javaType(schemaType);
 
             if(schemaType == null || theClass == null){
                 if(value.getClass() == CoreClassConstants.BOOLEAN || CoreClassConstants.NUMBER.isAssignableFrom(value.getClass())){
@@ -740,7 +740,7 @@
         }
         CoreConversionManager xmlConversionManager = getSession().getDatasourcePlatform().getConversionManager();
 
-        return (String) xmlConversionManager.convertObject(qName, String.class);
+        return xmlConversionManager.convertObject(qName, String.class);
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonBuilderRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonBuilderRecord.java
index c996b5e..e7ae969 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonBuilderRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonBuilderRecord.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -137,11 +137,11 @@
             jsonObjectBuilder.add(keyName, (String)value);
         }else{
             ConversionManager conversionManager = getConversionManager();
-            String convertedValue = (String) conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
-            Class theClass = conversionManager.javaType(schemaType);
+            String convertedValue = conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
+            Class<Object> theClass = conversionManager.javaType(schemaType);
             if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
                 //if it's still a number and falls through the cracks we dont want "" around the value
-                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
+                    BigDecimal convertedNumberValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType);
                     jsonObjectBuilder.add(keyName, convertedNumberValue);
             }else{
                 jsonObjectBuilder.add(keyName, convertedValue);
@@ -175,11 +175,11 @@
             jsonArrayBuilder.add((String)value);
         }else{
             ConversionManager conversionManager = getConversionManager();
-            String convertedValue = (String) conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
-            Class theClass = conversionManager.javaType(schemaType);
+            String convertedValue = conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
+            Class<Object> theClass = conversionManager.javaType(schemaType);
             if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
                 //if it's still a number and falls through the cracks we dont want "" around the value
-                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
+                    BigDecimal convertedNumberValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType);
                     jsonArrayBuilder.add(convertedNumberValue);
             }else{
                 jsonArrayBuilder.add(convertedValue);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonGeneratorRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonGeneratorRecord.java
index 4bc12a9..9297087 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonGeneratorRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonGeneratorRecord.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -120,11 +120,11 @@
             jsonGenerator.write(keyName, (String)value);
         }else{
             ConversionManager conversionManager = getConversionManager();
-            String convertedValue = (String) conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
-            Class theClass = conversionManager.javaType(schemaType);
+            String convertedValue = conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
+            Class<Object> theClass = conversionManager.javaType(schemaType);
             if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
                 //if it's still a number and falls through the cracks we dont want "" around the value
-                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
+                    BigDecimal convertedNumberValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType);
                     jsonGenerator.write(keyName, convertedNumberValue);
             }else{
                 jsonGenerator.write(keyName, convertedValue);
@@ -157,11 +157,11 @@
             jsonGenerator.write((String)value);
         }else{
             ConversionManager conversionManager = getConversionManager();
-            String convertedValue = (String) conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
-            Class theClass = conversionManager.javaType(schemaType);
+            String convertedValue = conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
+            Class<Object> theClass = conversionManager.javaType(schemaType);
             if((schemaType == null || theClass == null) && (CoreClassConstants.NUMBER.isAssignableFrom(value.getClass()))){
                 //if it's still a number and falls through the cracks we dont want "" around the value
-                    BigDecimal convertedNumberValue = ((BigDecimal) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType));
+                    BigDecimal convertedNumberValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.BIGDECIMAL, schemaType);
                     jsonGenerator.write(convertedNumberValue);
 
             }else{
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonRecord.java
index bc80787..dba805c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/JsonRecord.java
@@ -357,15 +357,15 @@
                 if (value.getClass() == CoreClassConstants.BOOLEAN || CoreClassConstants.NUMBER.isAssignableFrom(value.getClass())) {
                     writeValue(value, schemaType, isAttribute);
                 } else {
-                    String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
+                    String convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
                     writeValue(convertedValue, schemaType, isAttribute);
                 }
             } else if (schemaType != null && !isNumericOrBooleanType(schemaType)) {
                 //if schemaType exists and is not boolean or number do write quotes (convert to string)
-                String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
+                String convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
                 writeValue(convertedValue, schemaType, isAttribute);
             } else if (isCDATA) {
-                String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
+                String convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
                 cdata(convertedValue);
             } else {
                 writeValue(value, schemaType, isAttribute);
@@ -508,7 +508,7 @@
         }
         CoreConversionManager xmlConversionManager = getSession().getDatasourcePlatform().getConversionManager();
 
-        return (String) xmlConversionManager.convertObject(qName, String.class);
+        return xmlConversionManager.convertObject(qName, String.class);
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/MarshalRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/MarshalRecord.java
index edcd3a0..0d1a19d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/MarshalRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/MarshalRecord.java
@@ -365,7 +365,7 @@
              String convertedValue = getStringForQName((QName)value);
              attribute(xPathFragment, namespaceResolver, convertedValue);
          } else{
-             String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
+             String convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
              attribute(xPathFragment, namespaceResolver, convertedValue);
          }
     }
@@ -389,7 +389,7 @@
             String convertedValue = getStringForQName((QName)value);
             characters(convertedValue);
         }else{
-            String convertedValue = ((String) ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType));
+            String convertedValue = ((ConversionManager) session.getDatasourcePlatform().getConversionManager()).convertObject(value, CoreClassConstants.STRING, schemaType);
             if(isCDATA){
                 cdata(convertedValue);
             }else{
@@ -408,7 +408,7 @@
         }else if(value.getClass() == String.class){
             return (String) value;
         }
-        return (String) conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
+        return conversionManager.convertObject(value, CoreClassConstants.STRING, schemaType);
     }
 
     protected String getStringForQName(QName qName){
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java
index eaf7649..b6e2b5c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java
@@ -158,18 +158,18 @@
     @Override
     public void registerOutputParameter(CallableStatement statement, String name, int jdbcType) throws SQLException {
         try {
-            Class clazz = null;
+            Class<?> clazz = null;
             Method method = null;
             String methodName = "registerJccOutParameterAtName";
-            Class[] methodArgs = new Class[] {String.class, int.class};
+            Class<?>[] methodArgs = (Class<?>[]) new Class[] {String.class, int.class};
             Object[] parameters = new Object[] {name, jdbcType};
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
                     ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-                    clazz = AccessController.doPrivileged(new PrivilegedClassForName(DB2_CALLABLESTATEMENT_CLASS, true, cl));
+                    clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(DB2_CALLABLESTATEMENT_CLASS, true, cl));
                     method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, methodName, methodArgs, true));
                     Object o = statement.unwrap(clazz);
-                    AccessController.doPrivileged(new PrivilegedMethodInvoker(method, o, parameters));
+                    AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, o, parameters));
                 } catch (PrivilegedActionException ex) {
                     if (ex.getCause() instanceof ClassNotFoundException) {
                         throw (ClassNotFoundException) ex.getCause();
@@ -197,18 +197,18 @@
     @Override
     public void registerOutputParameter(CallableStatement statement, String name, int jdbcType, String typeName) throws SQLException {
         try {
-            Class clazz = null;
+            Class<?> clazz = null;
             Method method = null;
             String methodName = "registerJccOutParameterAtName";
-            Class[] methodArgs = new Class[] {String.class, int.class, String.class};
+            Class<?>[] methodArgs = (Class<?>[]) new Class[] {String.class, int.class, String.class};
             Object[] parameters = new Object[] {name, jdbcType, typeName};
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
                     ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-                    clazz = AccessController.doPrivileged(new PrivilegedClassForName(DB2_CALLABLESTATEMENT_CLASS, true, cl));
+                    clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(DB2_CALLABLESTATEMENT_CLASS, true, cl));
                     method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, methodName, methodArgs, true));
                     Object o = statement.unwrap(clazz);
-                    AccessController.doPrivileged(new PrivilegedMethodInvoker(method, o, parameters));
+                    AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, o, parameters));
                 } catch (PrivilegedActionException ex) {
                     if (ex.getCause() instanceof ClassNotFoundException) {
                         throw (ClassNotFoundException) ex.getCause();
@@ -235,7 +235,7 @@
             throws SQLException {
 
         String methodName = null;
-        Class[] methodArgs = null;
+        Class<?>[] methodArgs = null;
         Object[] parameters = null;
 
         // Process common types first.
@@ -244,101 +244,101 @@
             if (usesStringBinding() && (((String)parameter).length() > getStringBindingSize())) {
                 CharArrayReader reader = new CharArrayReader(((String)parameter).toCharArray());
                 methodName = "setJccCharacterStreamAtName";
-                methodArgs = new Class[] {String.class, java.io.Reader.class, int.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, java.io.Reader.class, int.class};
                 parameters = new Object[] {name, reader, ((String)parameter).length()};
             } else {
                 //TODO find shouldUseGetSetNString() support for DB2/Z
                 methodName = "setJccStringAtName";
-                methodArgs = new Class[] {String.class, String.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, String.class};
                 parameters = new Object[] {name, parameter};
             }
         } else if (parameter instanceof Number) {
             Number number = (Number) parameter;
             if (number instanceof Integer) {
                 methodName = "setJccIntAtName";
-                methodArgs = new Class[] {String.class, int.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, int.class};
                 parameters = new Object[] {name, number.intValue()};
             } else if (number instanceof Long) {
                 methodName = "setJccLongAtName";
-                methodArgs = new Class[] {String.class, long.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, long.class};
                 parameters = new Object[] {name, number.longValue()};
             }  else if (number instanceof BigDecimal) {
                 methodName = "setJccBigDecimalAtName";
-                methodArgs = new Class[] {String.class, BigDecimal.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, BigDecimal.class};
                 parameters = new Object[] {name, number};
             } else if (number instanceof Double) {
                 methodName = "setJccDoubleAtName";
-                methodArgs = new Class[] {String.class, double.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, double.class};
                 parameters = new Object[] {name, number.doubleValue()};
             } else if (number instanceof Float) {
                 methodName = "setJccFloatAtName";
-                methodArgs = new Class[] {String.class, float.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, float.class};
                 parameters = new Object[] {name, number.floatValue()};
             } else if (number instanceof Short) {
                 methodName = "setJccShortAtName";
-                methodArgs = new Class[] {String.class, short.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, short.class};
                 parameters = new Object[] {name, number.shortValue()};
             } else if (number instanceof Byte) {
                 methodName = "setJccByteAtName";
-                methodArgs = new Class[] {String.class, byte.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, byte.class};
                 parameters = new Object[] {name, number.byteValue()};
             } else if (number instanceof BigInteger) {
                 // Convert to BigDecimal.
                 methodName = "setJccBigDecimalAtName";
-                methodArgs = new Class[] {String.class, BigDecimal.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, BigDecimal.class};
                 parameters = new Object[] {name, new BigDecimal((BigInteger) number)};
             } else {
                 methodName = "setJccObjectAtName";
-                methodArgs = new Class[] {String.class, Object.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, Object.class};
                 parameters = new Object[] {name, parameter};
             }
         } else if (parameter instanceof java.sql.Date){
             methodName = "setJccDateAtName";
-            methodArgs = new Class[] {String.class, java.sql.Date.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Date.class};
             parameters = new Object[] {name, parameter};
         } else if (parameter instanceof java.time.LocalDate){
             // Convert to java.sql.Date
             methodName = "setJccDateAtName";
-            methodArgs = new Class[] {String.class, java.sql.Date.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Date.class};
             parameters = new Object[] {name, java.sql.Date.valueOf((java.time.LocalDate) parameter)};
         } else if (parameter instanceof java.sql.Timestamp){
             methodName = "setJccTimestampAtName";
-            methodArgs = new Class[] {String.class, java.sql.Timestamp.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Timestamp.class};
             parameters = new Object[] {name, parameter};
         } else if (parameter instanceof java.time.LocalDateTime){
             // Convert to java.sql.Timestamp
             methodName = "setJccTimestampAtName";
-            methodArgs = new Class[] {String.class, java.sql.Timestamp.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Timestamp.class};
             parameters = new Object[] {name, java.sql.Timestamp.valueOf((java.time.LocalDateTime) parameter)};
         } else if (parameter instanceof java.time.OffsetDateTime) {
             // Convert to java.sql.Timestamp
             methodName = "setJccTimestampAtName";
-            methodArgs = new Class[] {String.class, java.sql.Timestamp.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Timestamp.class};
             parameters = new Object[] {name, java.sql.Timestamp.from(((java.time.OffsetDateTime) parameter).toInstant())};
         } else if (parameter instanceof java.sql.Time){
             methodName = "setJccTimeAtName";
-            methodArgs = new Class[] {String.class, java.sql.Time.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Time.class};
             parameters = new Object[] {name, parameter};
         } else if (parameter instanceof java.time.LocalTime){
             java.time.LocalTime lt = (java.time.LocalTime) parameter;
             java.sql.Timestamp ts = java.sql.Timestamp.valueOf(java.time.LocalDateTime.of(java.time.LocalDate.ofEpochDay(0), lt));
             methodName = "setJccTimestampAtName";
-            methodArgs = new Class[] {String.class, java.sql.Timestamp.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Timestamp.class};
             parameters = new Object[] {name, ts};
         } else if (parameter instanceof java.time.OffsetTime) {
             java.time.OffsetTime ot = (java.time.OffsetTime) parameter;
             java.sql.Timestamp ts = java.sql.Timestamp.valueOf(java.time.LocalDateTime.of(java.time.LocalDate.ofEpochDay(0), ot.toLocalTime()));
             methodName = "setJccTimestampAtName";
-            methodArgs = new Class[] {String.class, java.sql.Timestamp.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Timestamp.class};
             parameters = new Object[] {name, ts};
         } else if (parameter instanceof Boolean) {
             methodName = "setJccBooleanAtName";
-            methodArgs = new Class[] {String.class, boolean.class};
-            parameters = new Object[] {name, (Boolean) parameter};
+            methodArgs = (Class<?>[]) new Class[] {String.class, boolean.class};
+            parameters = new Object[] {name, 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.
             methodName = "setJccNullAtName";
-            methodArgs = new Class[] {String.class, int.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, int.class};
             parameters = new Object[] {name, getJDBCType((Class)null)};
         } else if (parameter instanceof DatabaseField) {
             setNullFromDatabaseField((DatabaseField)parameter, statement, name);
@@ -346,42 +346,42 @@
             if (usesStreamsForBinding()) {
                 ByteArrayInputStream inputStream = new ByteArrayInputStream((byte[])parameter);
                 methodName = "setJccBinaryStreamAtName";
-                methodArgs = new Class[] {String.class, java.io.InputStream.class, int.class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, java.io.InputStream.class, int.class};
                 parameters = new Object[] {name, inputStream, ((byte[])parameter).length};
             } else {
                 methodName = "setJccBytesAtName";
-                methodArgs = new Class[] {String.class, byte[].class};
+                methodArgs = (Class<?>[]) new Class[] {String.class, byte[].class};
                 parameters = new Object[] {name, parameter};
             }
         }
         // Next process types that need conversion.
         else if (parameter instanceof Calendar) {
             methodName = "setJccTimestampAtName";
-            methodArgs = new Class[] {String.class, java.sql.Timestamp.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Timestamp.class};
             parameters = new Object[] {name, Helper.timestampFromDate(((Calendar)parameter).getTime())};
         } else if (parameter.getClass() == ClassConstants.UTILDATE) {
             methodName = "setJccTimestampAtName";
-            methodArgs = new Class[] {String.class, java.sql.Timestamp.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.Timestamp.class};
             parameters = new Object[] {name, Helper.timestampFromDate((java.util.Date) parameter)};
         } else if (parameter instanceof Character) {
             methodName = "setJccStringAtName";
-            methodArgs = new Class[] {String.class, String.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, String.class};
             parameters = new Object[] {name, ((Character)parameter).toString()};
         } else if (parameter instanceof char[]) {
             methodName = "setJccStringAtName";
-            methodArgs = new Class[] {String.class, String.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, String.class};
             parameters = new Object[] {name, new String((char[])parameter)};
         } else if (parameter instanceof Character[]) {
             methodName = "setJccStringAtName";
-            methodArgs = new Class[] {String.class, String.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, String.class};
             parameters = new Object[] {name, convertObject(parameter, ClassConstants.STRING)};
         } else if (parameter instanceof Byte[]) {
             methodName = "setJccBytesAtName";
-            methodArgs = new Class[] {String.class, byte[].class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, byte[].class};
             parameters = new Object[] {name, convertObject(parameter, ClassConstants.APBYTE)};
         } else if (parameter instanceof java.sql.SQLXML) {
             methodName = "setJccSQLXMLAtName";
-            methodArgs = new Class[] {String.class, java.sql.SQLXML.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, java.sql.SQLXML.class};
             parameters = new Object[] {name, parameter};
         } else if (parameter instanceof BindCallCustomParameter) {
             ((BindCallCustomParameter)(parameter)).set(this, statement, name, session);
@@ -389,25 +389,25 @@
             StructConverter converter = typeConverters.get(parameter.getClass());
             java.sql.Struct struct = converter.convertToStruct(parameter, getConnection(session, statement.getConnection()));
             methodName = "setJccObjectAtName";
-            methodArgs = new Class[] {String.class, Object.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, Object.class};
             parameters = new Object[] {name, struct};
         } else {
             methodName = "setJccObjectAtName";
-            methodArgs = new Class[] {String.class, Object.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, Object.class};
             parameters = new Object[] {name, parameter};
         }
 
         if(methodName != null) {
             try {
-                Class clazz = null;
+                Class<?> clazz = null;
                 Method method = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
                         ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-                        clazz = AccessController.doPrivileged(new PrivilegedClassForName(DB2_PREPAREDSTATEMENT_CLASS, true, cl));
+                        clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(DB2_PREPAREDSTATEMENT_CLASS, true, cl));
                         method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, methodName, methodArgs, true));
                         Object o = statement.unwrap(clazz);
-                        AccessController.doPrivileged(new PrivilegedMethodInvoker(method, o, parameters));
+                        AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, o, parameters));
                     } catch (PrivilegedActionException ex) {
                         if (ex.getCause() instanceof ClassNotFoundException) {
                             throw (ClassNotFoundException) ex.getCause();
@@ -432,30 +432,30 @@
     @Override
     protected void setNullFromDatabaseField(DatabaseField databaseField, CallableStatement statement, String name) throws SQLException {
         String methodName = null;
-        Class[] methodArgs = null;
+        Class<?>[] methodArgs = null;
         Object[] parameters = null;
         if (databaseField instanceof ObjectRelationalDatabaseField) {
             ObjectRelationalDatabaseField field = (ObjectRelationalDatabaseField)databaseField;
             methodName = "setJccNullAtName";
-            methodArgs = new Class[] {String.class, int.class, String.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, int.class, String.class};
             parameters = new Object[] {name, field.getSqlType(), field.getSqlTypeName()};
         } else {
             int jdbcType = getJDBCTypeForSetNull(databaseField);
             methodName = "setJccNullAtName";
-            methodArgs = new Class[] {String.class, int.class};
+            methodArgs = (Class<?>[]) new Class[] {String.class, int.class};
             parameters = new Object[] {name, jdbcType};
         }
 
         try {
-            Class clazz = null;
+            Class<?> clazz = null;
             Method method = null;
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
                     ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-                    clazz = AccessController.doPrivileged(new PrivilegedClassForName(DB2_PREPAREDSTATEMENT_CLASS, true, cl));
+                    clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(DB2_PREPAREDSTATEMENT_CLASS, true, cl));
                     method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, methodName, methodArgs, true));
                     Object o = statement.unwrap(clazz);
-                    AccessController.doPrivileged(new PrivilegedMethodInvoker(method, o, parameters));
+                    AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, o, parameters));
                 } catch (PrivilegedActionException ex) {
                     if (ex.getCause() instanceof ClassNotFoundException) {
                         throw (ClassNotFoundException) ex.getCause();
@@ -480,24 +480,24 @@
     public Object getParameterValueFromDatabaseCall(CallableStatement statement, String name, AbstractSession session)
                 throws SQLException {
         String methodName = null;
-        Class[] methodArgs = null;
+        Class<?>[] methodArgs = null;
         Object[] parameters = null;
 
         methodName = "getJccObjectAtName";
-        methodArgs = new Class[] {String.class};
+        methodArgs = (Class<?>[]) new Class[] {String.class};
         parameters = new Object[] {name};
 
         if(methodName != null) {
             try {
-                Class clazz = null;
+                Class<?> clazz = null;
                 Method method = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
                         ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-                        clazz = AccessController.doPrivileged(new PrivilegedClassForName(DB2_CALLABLESTATEMENT_CLASS, true, cl));
+                        clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(DB2_CALLABLESTATEMENT_CLASS, true, cl));
                         method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, methodName, methodArgs, true));
                         Object o = statement.unwrap(clazz);
-                        return AccessController.doPrivileged(new PrivilegedMethodInvoker(method, o, parameters));
+                        return AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, o, parameters));
                     } catch (PrivilegedActionException ex) {
                         if (ex.getCause() instanceof ClassNotFoundException) {
                             throw (ClassNotFoundException) ex.getCause();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/jdbc/JDBCTypes.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/jdbc/JDBCTypes.java
index 20cd96a..c31258a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/jdbc/JDBCTypes.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/jdbc/JDBCTypes.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
@@ -48,11 +48,9 @@
 import static java.sql.Types.TINYINT;
 import static java.sql.Types.VARBINARY;
 import static java.sql.Types.VARCHAR;
+import static org.eclipse.persistence.internal.core.helper.CoreClassConstants.OBJECT;
+import static org.eclipse.persistence.internal.core.helper.CoreClassConstants.SQLDATE;
 import static org.eclipse.persistence.internal.helper.ClassConstants.BIGDECIMAL;
-import static org.eclipse.persistence.internal.helper.ClassConstants.JavaSqlDate_Class;
-import static org.eclipse.persistence.internal.helper.ClassConstants.JavaSqlTime_Class;
-import static org.eclipse.persistence.internal.helper.ClassConstants.JavaSqlTimestamp_Class;
-import static org.eclipse.persistence.internal.helper.ClassConstants.Object_Class;
 import static org.eclipse.persistence.internal.helper.ClassConstants.SHORT;
 import static org.eclipse.persistence.internal.helper.ClassConstants.STRING;
 import static org.eclipse.persistence.internal.helper.ClassConstants.Void_Class;
@@ -64,6 +62,7 @@
 import java.util.List;
 import java.util.ListIterator;
 
+import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.helper.DatabaseType;
@@ -437,16 +436,16 @@
                 case JAVA_OBJECT :
                 case OTHER :
                 case REF :
-                    clz = Object_Class;
+                    clz = OBJECT;
                     break;
                 case NULL :
                     clz = Void_Class;
                     break;
                 case DATE :
-                    clz = JavaSqlDate_Class;
+                    clz = SQLDATE;
                     break;
                 case TIMESTAMP :
-                    clz = JavaSqlTimestamp_Class;
+                    clz = CoreClassConstants.TIMESTAMP;
                     break;
                 case DOUBLE :
                     clz = ClassConstants.DOUBLE;
@@ -467,7 +466,7 @@
                     clz = Struct.class;
                     break;
                 case TIME :
-                    clz = JavaSqlTime_Class;
+                    clz = CoreClassConstants.TIME;
                     break;
                 default:
                     clz = STRING;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLStoredProcedureCall.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLStoredProcedureCall.java
index 8c02172..04d568b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLStoredProcedureCall.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLStoredProcedureCall.java
@@ -1152,7 +1152,7 @@
             return outputRow;
         }
         // re-order elements in outputRow to conform to original indices
-        Vector outputRowFields = outputRow.getFields();
+        Vector<DatabaseField> outputRowFields = outputRow.getFields();
         Vector outputRowValues = outputRow.getValues();
         DatabaseRecord newOutputRow = new DatabaseRecord();
         List<PLSQLargument> outArguments = getArguments(arguments, OUT);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformUtils.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformUtils.java
index 38f1c86..29ba202 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformUtils.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformUtils.java
@@ -109,7 +109,7 @@
         if (platformClass == null) {
             throw ServerPlatformException.invalidServerPlatformClass(null, null);
         }
-        Class cls = null;
+        Class<? extends ServerPlatform> cls = null;
         try {
             //try the supplied classloader
             cls = findClass(platformClass, loader);
@@ -132,17 +132,17 @@
         ServerPlatform platform = null;
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
             try {
-                Constructor constructor = AccessController.doPrivileged(
-                        new PrivilegedGetConstructorFor(cls, paramTypes, false));
-                platform = (ServerPlatform) AccessController.doPrivileged(
-                        new PrivilegedInvokeConstructor(constructor, params));
+                Constructor<? extends ServerPlatform> constructor = AccessController.doPrivileged(
+                        new PrivilegedGetConstructorFor<>(cls, paramTypes, false));
+                platform = AccessController.doPrivileged(
+                        new PrivilegedInvokeConstructor<>(constructor, params));
             } catch (PrivilegedActionException ex) {
                 throw ServerPlatformException.invalidServerPlatformClass(platformClass, ex);
             }
         } else {
             try {
-                Constructor constructor = PrivilegedAccessHelper.getConstructorFor(cls, paramTypes, false);
-                platform = (ServerPlatform) PrivilegedAccessHelper.invokeConstructor(constructor, params);
+                Constructor<? extends ServerPlatform> constructor = PrivilegedAccessHelper.getConstructorFor(cls, paramTypes, false);
+                platform = PrivilegedAccessHelper.invokeConstructor(constructor, params);
             } catch (NoSuchMethodException | IllegalAccessException
                     | InvocationTargetException | InstantiationException ex) {
                 throw ServerPlatformException.invalidServerPlatformClass(platformClass, ex);
@@ -151,9 +151,9 @@
         return platform;
     }
 
-    private static Class findClass(String className, ClassLoader loader) throws ClassNotFoundException, PrivilegedActionException {
+    private static Class<? extends ServerPlatform> findClass(String className, ClassLoader loader) throws ClassNotFoundException, PrivilegedActionException {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return AccessController.doPrivileged(new PrivilegedClassForName(className, false, loader));
+            return AccessController.doPrivileged(new PrivilegedClassForName<>(className, false, loader));
         } else {
             return PrivilegedAccessHelper.getClassForName(className, false, loader);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/glassfish/GlassfishPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/glassfish/GlassfishPlatform.java
index afe083b..744096b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/glassfish/GlassfishPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/glassfish/GlassfishPlatform.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
@@ -132,7 +132,7 @@
         // If GlassFish behavior changes, both reflective call below should be cached.
         Connection unwrappedConnection = null;
         try {
-            Class connectionWrapperClass = connection.getClass().getClassLoader().loadClass("com.sun.gjc.spi.base.ConnectionHolder");
+            Class<?> connectionWrapperClass = connection.getClass().getClassLoader().loadClass("com.sun.gjc.spi.base.ConnectionHolder");
             if(connectionWrapperClass.isInstance(connection) ) {
                 Method unwrapMethod = connectionWrapperClass.getDeclaredMethod("getConnection");
                 unwrappedConnection = (Connection) unwrapMethod.invoke(connection);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatform.java
index 2e0813f..b7e88e7 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatform.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
@@ -95,7 +95,7 @@
     protected Class getWebsphereUtilClass() {
         if (this.websphereUtilClass == null) {
             try {
-                this.websphereUtilClass = (Class) getDatabaseSession().getPlatform().convertObject("com.ibm.ws.rsadapter.jdbc.WSJdbcUtil", Class.class);
+                this.websphereUtilClass = getDatabaseSession().getPlatform().convertObject("com.ibm.ws.rsadapter.jdbc.WSJdbcUtil", Class.class);
             } catch (Throwable exception) {
                 getDatabaseSession().getSessionLog().logThrowable(SessionLog.WARNING, SessionLog.SERVER, exception);
                 this.websphereUtilClass = void.class;
@@ -110,7 +110,7 @@
     protected Class getWebsphereConnectionClass() {
         if (this.websphereConnectionClass == null) {
             try {
-                this.websphereConnectionClass = (Class) getDatabaseSession().getPlatform().convertObject("com.ibm.ws.rsadapter.jdbc.WSJdbcConnection", Class.class);
+                this.websphereConnectionClass = getDatabaseSession().getPlatform().convertObject("com.ibm.ws.rsadapter.jdbc.WSJdbcConnection", Class.class);
             } catch (Throwable exception) {
                 getDatabaseSession().getSessionLog().logThrowable(SessionLog.WARNING, SessionLog.SERVER, exception);
                 this.websphereConnectionClass = void.class;
@@ -143,7 +143,7 @@
     public Connection unwrapConnection(Connection connection) {
         if (getWebsphereConnectionClass().isInstance(connection) && getVendorConnectionMethod() != null) {
             try {
-                return (Connection) PrivilegedAccessHelper.invokeMethod(getVendorConnectionMethod(), null, new Object[]{connection});
+                return PrivilegedAccessHelper.invokeMethod(getVendorConnectionMethod(), null, new Object[]{connection});
             } catch (IllegalAccessException exception) {
                 getDatabaseSession().getSessionLog().logThrowable(SessionLog.WARNING, SessionLog.SERVER, exception);
             } catch (InvocationTargetException exception) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSphere_7_Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSphere_7_Platform.java
index 46e423d..bc94a11 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSphere_7_Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSphere_7_Platform.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.
  * Copyright (c) 1998, 2018 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -90,13 +90,13 @@
                 log = AccessController.doPrivileged(new PrivilegedExceptionAction<SessionLog>() {
                     @Override
                     public SessionLog run() throws Exception {
-                        Class<?> cls = PrivilegedAccessHelper.getClassForName(SERVER_LOG_CLASS);
+                        Class<SessionLog> cls = PrivilegedAccessHelper.getClassForName(SERVER_LOG_CLASS);
                         Constructor<SessionLog> ctor = PrivilegedAccessHelper.getConstructorFor(cls, null, false);
                         return ctor.newInstance();
                     }
                 });
             } else {
-                Class<?> cls = PrivilegedAccessHelper.getClassForName(SERVER_LOG_CLASS);
+                Class<SessionLog> cls = PrivilegedAccessHelper.getClassForName(SERVER_LOG_CLASS);
                 Constructor<SessionLog> ctor = PrivilegedAccessHelper.getConstructorFor(cls, null, false);
                 log = ctor.newInstance();
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatform.java
index f58f6e0..8cbe733 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatform.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
@@ -85,9 +85,9 @@
     @Override
     public void initializeServerNameAndVersion() {
         try {
-            Class clazz = PrivilegedAccessHelper.getClassForName("weblogic.version");
+            Class<Object> clazz = PrivilegedAccessHelper.getClassForName("weblogic.version");
             Method method = PrivilegedAccessHelper.getMethod(clazz, "getReleaseBuildVersion", null, false);
-            this.serverNameAndVersion = (String) PrivilegedAccessHelper.invokeMethod(method, null, null);
+            this.serverNameAndVersion = PrivilegedAccessHelper.invokeMethod(method, null, null);
             this.shouldClearStatementCache = Helper.compareVersions(this.serverNameAndVersion, "10.3.4") < 0;
         } catch (Exception exception) {
             getDatabaseSession().getSessionLog().logThrowable(SessionLog.WARNING, SessionLog.SERVER, exception);
@@ -119,7 +119,7 @@
     protected Class getWebLogicConnectionClass() {
         if (this.weblogicConnectionClass == null) {
             try {
-                this.weblogicConnectionClass = (Class) getDatabaseSession().getPlatform().convertObject("weblogic.jdbc.extensions.WLConnection", Class.class);
+                this.weblogicConnectionClass = getDatabaseSession().getPlatform().convertObject("weblogic.jdbc.extensions.WLConnection", Class.class);
             } catch (Throwable exception) {
                 getDatabaseSession().getSessionLog().logThrowable(SessionLog.WARNING, SessionLog.SERVER, exception);
                 this.weblogicConnectionClass = void.class;
@@ -150,7 +150,7 @@
     public Connection unwrapConnection(Connection connection) {
         if (getWebLogicConnectionClass().isInstance(connection) && getVendorConnectionMethod() != null) {
             try {
-                return (Connection) PrivilegedAccessHelper.invokeMethod(getVendorConnectionMethod(), connection);
+                return PrivilegedAccessHelper.invokeMethod(getVendorConnectionMethod(), connection);
             } catch (IllegalAccessException exception) {
                 getDatabaseSession().getSessionLog().logThrowable(SessionLog.WARNING, SessionLog.SERVER, exception);
             } catch (InvocationTargetException exception) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatformDetector.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatformDetector.java
index 5f9bb3c..7146fa4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatformDetector.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatformDetector.java
@@ -75,7 +75,7 @@
      */
     private String getServerNameAndVersionInternal() {
         try {
-            Class versionCls = Class.forName("weblogic.version");
+            Class<?> versionCls = Class.forName("weblogic.version");
             Method method = versionCls.getMethod("getReleaseBuildVersion");
             return (String) method.invoke(null);
         } catch (Throwable t) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_12_Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_12_Platform.java
index 50dfe81..134d168 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_12_Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_12_Platform.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -111,7 +111,7 @@
                 cicManagerInstance = PrivilegedAccessHelper.invokeMethod(getInstance, managerClass);
                 // Get component invocation context
                 getCurrentCicMethod = PrivilegedAccessHelper.getMethod(managerClass, "getCurrentComponentInvocationContext", new Class[]{}, true);
-                final Class cicClass = PrivilegedAccessHelper.getClassForName(contextClassName);
+                final Class<Object> cicClass = PrivilegedAccessHelper.getClassForName(contextClassName);
                 getPartitionIdMethod = PrivilegedAccessHelper.getDeclaredMethod(cicClass, "getPartitionId", new Class[]{});
                 getPartitionNameMethod = PrivilegedAccessHelper.getDeclaredMethod(cicClass, "getPartitionName", new Class[]{});
                 isGlobalRuntimeMethod = PrivilegedAccessHelper.getDeclaredMethod(cicClass, "isGlobalRuntime", new Class[]{});
@@ -164,7 +164,7 @@
                         public String run() {
                             try {
                                 final Object cicInstance = PrivilegedAccessHelper.invokeMethod(getCurrentCicMethod, cicManagerInstance);
-                                return (String) PrivilegedAccessHelper.invokeMethod(methodToCall, cicInstance);
+                                return PrivilegedAccessHelper.invokeMethod(methodToCall, cicInstance);
                             } catch (ReflectiveOperationException ex) {
                                 AbstractSessionLog.getLog().logThrowable(SessionLog.WARNING, null, ex);
                                 return "UNKNOWN";
@@ -173,7 +173,7 @@
                     });
                 } else {
                     final Object cicInstance = PrivilegedAccessHelper.invokeMethod(getCurrentCicMethod, cicManagerInstance);
-                    return (String) PrivilegedAccessHelper.invokeMethod(methodToCall, cicInstance);
+                    return PrivilegedAccessHelper.invokeMethod(methodToCall, cicInstance);
                 }
             } catch (ReflectiveOperationException ex) {
                 AbstractSessionLog.getLog().logThrowable(SessionLog.WARNING, null, ex);
@@ -193,7 +193,7 @@
                         public Boolean run() {
                             try {
                                 final Object cicInstance = PrivilegedAccessHelper.invokeMethod(getCurrentCicMethod, cicManagerInstance);
-                                return (Boolean) PrivilegedAccessHelper.invokeMethod(isGlobalRuntimeMethod, cicInstance);
+                                return PrivilegedAccessHelper.invokeMethod(isGlobalRuntimeMethod, cicInstance);
                             } catch (ReflectiveOperationException ex) {
                                 AbstractSessionLog.getLog().logThrowable(SessionLog.WARNING, null, ex);
                                 return true;
@@ -202,7 +202,7 @@
                     });
                 } else {
                     final Object cicInstance = PrivilegedAccessHelper.invokeMethod(getCurrentCicMethod, cicManagerInstance);
-                    return (boolean) PrivilegedAccessHelper.invokeMethod(isGlobalRuntimeMethod, cicInstance);
+                    return PrivilegedAccessHelper.invokeMethod(isGlobalRuntimeMethod, cicInstance);
                 }
             } catch (ReflectiveOperationException ex) {
                 AbstractSessionLog.getLog().logThrowable(SessionLog.WARNING, null, ex);
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 c9f0740..ac0e3fb 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
@@ -29,7 +29,7 @@
     public static final String XDK_PLATFORM_CLASS_NAME = "org.eclipse.persistence.platform.xml.xdk.XDKPlatform";
     public static final String JAXP_PLATFORM_CLASS_NAME = "org.eclipse.persistence.platform.xml.jaxp.JAXPPlatform";
     private static XMLPlatformFactory instance;
-    private Class xmlPlatformClass;
+    private Class<? extends XMLPlatform> xmlPlatformClass;
 
     private XMLPlatformFactory() {
         super();
@@ -52,7 +52,7 @@
      * Return the implementation class for the XMLPlatform.
      * @return the implementation class for the XMLPlatform.
      */
-    public Class getXMLPlatformClass() throws XMLPlatformException {
+    public Class<? extends XMLPlatform> getXMLPlatformClass() throws XMLPlatformException {
         if (null != xmlPlatformClass) {
             return xmlPlatformClass;
         }
@@ -80,7 +80,8 @@
             if (classLoader == null) {
                 classLoader = ClassLoader.getSystemClassLoader();
             }
-            Class newXMLPlatformClass = classLoader.loadClass(newXMLPlatformClassName);
+            @SuppressWarnings({"unchecked"})
+            Class<? extends XMLPlatform> newXMLPlatformClass = (Class<? extends XMLPlatform>) classLoader.loadClass(newXMLPlatformClassName);
             setXMLPlatformClass(newXMLPlatformClass);
             return xmlPlatformClass;
         } catch (ClassNotFoundException e) {
@@ -92,7 +93,7 @@
      * PUBLIC:
      * Set the implementation of XMLPlatform.
      */
-    public void setXMLPlatformClass(Class xmlPlatformClass) {
+    public void setXMLPlatformClass(Class<? extends XMLPlatform> xmlPlatformClass) {
         this.xmlPlatformClass = xmlPlatformClass;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ConstructorReportItem.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ConstructorReportItem.java
index 7a4298f..8c3940b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ConstructorReportItem.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ConstructorReportItem.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
@@ -196,7 +196,7 @@
                 Constructor constructor = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(getResultType(), constructorArgTypes, true));
+                        constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<Class<?>>(getResultType(), constructorArgTypes, true));
                     } catch (PrivilegedActionException exception) {
                         throw QueryException.exceptionWhileUsingConstructorExpression(exception.getException(), query);
                     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ConstructorResult.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ConstructorResult.java
index 359013f..07691e1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ConstructorResult.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ConstructorResult.java
@@ -117,7 +117,7 @@
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        targetClass = AccessController.doPrivileged(new PrivilegedClassForName(targetClassName, true, classLoader));
+                        targetClass = AccessController.doPrivileged(new PrivilegedClassForName<>(targetClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(targetClassName, exception.getException());
                     }
@@ -200,7 +200,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
-                    constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(targetClass, constructorArgTypes, true));
+                    constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<Class<?>>(targetClass, constructorArgTypes, true));
                 } catch (PrivilegedActionException exception) {
                     throw QueryException.exceptionWhileInitializingConstructor(exception.getException(), query, targetClass);
                 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DatabaseQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DatabaseQuery.java
index 0584e11..fa81b34 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DatabaseQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DatabaseQuery.java
@@ -974,7 +974,7 @@
             // Bug 3256198 - lazily initialize the argument types from their
             // class names
             if (this.argumentTypeNames != null) {
-                Iterator args = this.argumentTypeNames.iterator();
+                Iterator<String> args = this.argumentTypeNames.iterator();
                 while (args.hasNext()) {
                     String argumentTypeName = (String) args.next();
                     this.argumentTypes.add(Helper.getObjectClass(ConversionManager.loadClass(argumentTypeName)));
@@ -2017,8 +2017,8 @@
      * types.
      */
     public List<DatabaseField> buildArgumentFields() {
-        List arguments = getArguments();
-        List argumentTypes = getArgumentTypes();
+        List<String> arguments = getArguments();
+        List<Class> argumentTypes = getArgumentTypes();
         List argumentFields = new ArrayList(arguments.size());
         int size = arguments.size();
         for (int index = 0; index < size; index++) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DeleteObjectQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DeleteObjectQuery.java
index 2a65e35..d075c70 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DeleteObjectQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DeleteObjectQuery.java
@@ -175,7 +175,7 @@
 
             // Check for deletion dependencies.
             if (isUnitOfWork) {
-                Set dependencies = ((UnitOfWorkImpl)session).getDeletionDependencies(object);
+                Set<Object> dependencies = ((UnitOfWorkImpl)session).getDeletionDependencies(object);
                 if (dependencies != null) {
                     for (Object dependency : dependencies) {
                         if (!commitManager.isCommitCompletedInPostOrIgnore(dependency)) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DoesExistQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DoesExistQuery.java
index d82646f..036eab0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DoesExistQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DoesExistQuery.java
@@ -163,7 +163,7 @@
             }
 
             CacheKey cacheKey;
-            Class objectClass = object.getClass();
+            Class<? extends Object> objectClass = object.getClass();
             AbstractSession tempSession = session;
             if (tempSession.isUnitOfWork()){
                 cacheKey = tempSession.getIdentityMapAccessorInstance().getCacheKeyForObjectForLock(primaryKey, objectClass, descriptor);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/EntityResult.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/EntityResult.java
index 0616dba..523d139 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/EntityResult.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/EntityResult.java
@@ -97,7 +97,7 @@
         try{
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    entityClass = AccessController.doPrivileged(new PrivilegedClassForName(entityClassName, true, classLoader));
+                    entityClass = AccessController.doPrivileged(new PrivilegedClassForName<>(entityClassName, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(entityClassName, exception.getException());
                 }
@@ -180,7 +180,7 @@
                 descriptor = query.getSession().getDescriptor(classValue);
             }
         }
-        for (Iterator mappings = descriptor.getMappings().iterator(); mappings.hasNext();) {
+        for (Iterator<DatabaseMapping> mappings = descriptor.getMappings().iterator(); mappings.hasNext();) {
             DatabaseMapping mapping = (DatabaseMapping)mappings.next();
             FieldResult fieldResult = (FieldResult)this.getFieldResults().get(mapping.getAttributeName());
             if (fieldResult != null){
@@ -190,7 +190,7 @@
                     getValueFromRecordForMapping(entityRecord,mapping,fieldResult,record);
                 }
             } else {
-                for (Iterator fields = mapping.getFields().iterator(); fields.hasNext();) {
+                for (Iterator<DatabaseField> fields = mapping.getFields().iterator(); fields.hasNext();) {
                     DatabaseField field = (DatabaseField)fields.next();
                     entityRecord.put(field, record.get(field));
                 }
@@ -224,7 +224,7 @@
             return;
         }
         /** This processes each FieldResult stored in the collection of FieldResults individually */
-        Iterator fieldResults = fieldResult.getFieldResults().iterator();
+        Iterator<FieldResult> fieldResults = fieldResult.getFieldResults().iterator();
         while (fieldResults.hasNext()){
             FieldResult tempFieldResult = ((FieldResult)fieldResults.next());
             DatabaseField dbfield = processValueFromRecordForMapping(currentDescriptor,tempFieldResult.getMultipleFieldIdentifiers(),1);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectBuildingQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectBuildingQuery.java
index bf98c07..eef358e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectBuildingQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectBuildingQuery.java
@@ -21,6 +21,7 @@
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.exceptions.ValidationException;
+import org.eclipse.persistence.expressions.Expression;
 import org.eclipse.persistence.internal.expressions.ForUpdateClause;
 import org.eclipse.persistence.internal.expressions.QueryKeyExpression;
 import org.eclipse.persistence.internal.identitymaps.CacheKey;
@@ -147,7 +148,7 @@
         try{
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    referenceClass = AccessController.doPrivileged(new PrivilegedClassForName(getReferenceClassName(), true, classLoader));
+                    referenceClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getReferenceClassName(), true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(getReferenceClassName(), exception.getException());
                 }
@@ -489,7 +490,7 @@
      * Fetch/trigger indirection on the clone passed in, based on join expressions in the joinManager.
      */
     private void triggerJoinExpressions(UnitOfWorkImpl unitOfWork, JoinedAttributeManager joinManager, Object clone, ClassDescriptor concreteDescriptor) {
-        List joinExpressions = joinManager.getJoinedAttributeExpressions();
+        List<Expression> joinExpressions = joinManager.getJoinedAttributeExpressions();
         int size = joinExpressions.size();
         if ((size == 0) || (clone == null)) {
             return;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectLevelReadQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectLevelReadQuery.java
index 9092285..9db41ac 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectLevelReadQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectLevelReadQuery.java
@@ -358,8 +358,8 @@
             if (!query.hasJoining()) {
                 return false;
             }
-            List joinedAttributes = getJoinedAttributeManager().getJoinedAttributeExpressions();
-            List otherJoinedAttributes = query.getJoinedAttributeManager().getJoinedAttributeExpressions();
+            List<Expression> joinedAttributes = getJoinedAttributeManager().getJoinedAttributeExpressions();
+            List<Expression> otherJoinedAttributes = query.getJoinedAttributeManager().getJoinedAttributeExpressions();
             int size = joinedAttributes.size();
             if (size != otherJoinedAttributes.size()) {
                 return false;
@@ -376,8 +376,8 @@
             if (!query.hasOrderByExpressions()) {
                 return false;
             }
-            List orderBys = getOrderByExpressions();
-            List otherOrderBys = query.getOrderByExpressions();
+            List<Expression> orderBys = getOrderByExpressions();
+            List<Expression> otherOrderBys = query.getOrderByExpressions();
             int size = orderBys.size();
             if (size != otherOrderBys.size()) {
                 return false;
@@ -1644,7 +1644,7 @@
         }
 
         //Add attribute fields
-        for(Iterator it = getPartialAttributeExpressions().iterator();it.hasNext();){
+        for(Iterator<Expression> it = getPartialAttributeExpressions().iterator(); it.hasNext();){
             Expression expression = (Expression)it.next();
             if (expression.isQueryKeyExpression()) {
                 expression.getBuilder().setSession(session.getRootSession(null));
@@ -1682,7 +1682,7 @@
         }
         //Build fields in same order as the fields of the descriptor to ensure field and join indexes match.
         Vector selectionFields = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
-        for (Iterator iterator = getDescriptor().getFields().iterator(); iterator.hasNext();) {
+        for (Iterator<DatabaseField> iterator = getDescriptor().getFields().iterator(); iterator.hasNext();) {
             DatabaseField field = (DatabaseField)iterator.next();
             if (localFields.contains(field)) {
                 selectionFields.add(field);
@@ -1724,7 +1724,7 @@
             }
         }
         // Add specified fields.
-        for (Iterator iterator = getExecutionFetchGroup().getAttributeNames().iterator(); iterator.hasNext();) {
+        for (Iterator<String> iterator = getExecutionFetchGroup().getAttributeNames().iterator(); iterator.hasNext();) {
             String attribute = (String)iterator.next();
             DatabaseMapping mapping = getDescriptor().getObjectBuilder().getMappingForAttributeName(attribute);
             if (mapping == null) {
@@ -1759,7 +1759,7 @@
 
         // Build field list in the same order as descriptor's fields so that the fields printed in the usual order in SELECT clause.
         List<DatabaseField> fields = new ArrayList(fetchedFields.size());
-        for (Iterator iterator = getDescriptor().getFields().iterator(); iterator.hasNext();) {
+        for (Iterator<DatabaseField> iterator = getDescriptor().getFields().iterator(); iterator.hasNext();) {
             DatabaseField field = (DatabaseField)iterator.next();
             if (fetchedFields.contains(field)) {
                 fields.add(field);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/QueryByExamplePolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/QueryByExamplePolicy.java
index 407abb9..b6e1fb0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/QueryByExamplePolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/QueryByExamplePolicy.java
@@ -229,7 +229,7 @@
                     throw (RuntimeException) ex.getCause();
                 }
             }else{
-                expression = (Expression)PrivilegedAccessHelper.invokeMethod(anOperator, expression, args);
+                expression = PrivilegedAccessHelper.invokeMethod(anOperator, expression, args);
             }
         } catch (NoSuchMethodException nsme) {
             Class superClass = attributeValueClass.getSuperclass();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReadAllQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReadAllQuery.java
index 019a16d..169c655 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReadAllQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReadAllQuery.java
@@ -406,7 +406,7 @@
         // Wrapping is done automatically.
         // Make sure a vector of exactly the right size is returned.
         Object conformedResult = cp.containerInstance(indexedInterimResult.size() + fromDatabase.size());
-        for (Iterator enumtr = indexedInterimResult.values().iterator(); enumtr.hasNext();) {
+        for (Iterator<Object> enumtr = indexedInterimResult.values().iterator(); enumtr.hasNext();) {
             Object eachClone = enumtr.next();
             cp.addInto(eachClone, conformedResult, unitOfWork);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQuery.java
index ec2432e..9db0615 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQuery.java
@@ -1163,8 +1163,8 @@
             return false;
         }
         ReportQuery query = (ReportQuery) object;
-        List items = getItems();
-        List otherItems = query.getItems();
+        List<ReportItem> items = getItems();
+        List<ReportItem> otherItems = query.getItems();
         int size = items.size();
         if (size != otherItems.size()) {
             return false;
@@ -1175,8 +1175,8 @@
             }
         }
         if (hasGroupByExpressions() && query.hasGroupByExpressions()) {
-            List groupBys = getGroupByExpressions();
-            List otherGroupBys = query.getGroupByExpressions();
+            List<Expression> groupBys = getGroupByExpressions();
+            List<Expression> otherGroupBys = query.getGroupByExpressions();
             size = groupBys.size();
             if (size != otherGroupBys.size()) {
                 return false;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQueryResult.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQueryResult.java
index 7c4f564..322e729 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQueryResult.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQueryResult.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.
  * Copyright (c) 2019, 2020 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -722,7 +722,7 @@
      * Converts the ReportQueryResult to a simple array of values.
      */
     public Object[] toArray(){
-       List list = getResults();
+       List<Object> list = getResults();
        return (list == null) ? null : list.toArray();
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/ClassSummaryDetailBase.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/ClassSummaryDetailBase.java
index 7550d3a..cb16f8f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/ClassSummaryDetailBase.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/ClassSummaryDetailBase.java
@@ -62,7 +62,7 @@
     private String parentClassName;
 
     // The corresponding CompositeType for this class
-    protected static CompositeType cType_= null;
+    protected static CompositeType cType_;
 
     protected static final String[] itemNames_=
         {"Class Name", "Cache Type", "Configured Size",
@@ -70,7 +70,7 @@
 
     static {
         try {
-            OpenType[] itemTypes = {
+            OpenType<?>[] itemTypes = {
                     SimpleType.STRING,
                     SimpleType.STRING,
                     SimpleType.STRING,
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/DevelopmentServices.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/DevelopmentServices.java
index ae996f3..b17f02f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/DevelopmentServices.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/DevelopmentServices.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
@@ -21,6 +21,7 @@
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.internal.helper.ClassConstants;
+import org.eclipse.persistence.internal.identitymaps.IdentityMap;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.internal.security.PrivilegedClassForName;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
@@ -64,7 +65,7 @@
      * @exception ClassNotFoundException thrown then the IdenityMap for that class name could not be found
      */
     public void initializeIdentityMap(String className) throws ClassNotFoundException {
-        Class classToChange = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
+        Class classToChange = getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
         getSession().getIdentityMapAccessorInstance().initializeIdentityMap(classToChange);
     }
 
@@ -86,11 +87,11 @@
      * @exception ClassNotFoundException thrown then the IdenityMap for that class name could not be found
      */
     public void setIdentityMapForClass(String className, String identityMapClassType, int maxSize) throws ClassNotFoundException {
-        Class classToChange = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
-        Class identityMapClass = null;
+        Class classToChange = getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
+        Class<IdentityMap> identityMapClass = null;
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
             try{
-                identityMapClass = AccessController.doPrivileged(new PrivilegedClassForName(identityMapClassType));
+                identityMapClass = AccessController.doPrivileged(new PrivilegedClassForName<>(identityMapClassType));
             }catch (PrivilegedActionException ex){
                 throw (RuntimeException)ex.getCause();
             }
@@ -120,7 +121,7 @@
      * @exception ClassNotFoundException thrown then the IdenityMap for that class name could not be found
      */
     public void updateCacheSize(String className, int newSize) throws ClassNotFoundException {
-        Class classToChange = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
+        Class classToChange = getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
         getSession().getIdentityMapAccessorInstance().getIdentityMap(classToChange).updateMaxSize(newSize);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/RuntimeServices.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/RuntimeServices.java
index e5d9850..5dd21e5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/RuntimeServices.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/services/RuntimeServices.java
@@ -239,9 +239,9 @@
     public List getAvailableConnectionPools() {
         Vector list = null;
         if (ClassConstants.ServerSession_Class.isAssignableFrom(getSession().getClass())) {
-            Map pools = ((ServerSession)getSession()).getConnectionPools();
+            Map<String, ConnectionPool> pools = ((ServerSession)getSession()).getConnectionPools();
             list = new Vector(pools.size());
-            Iterator poolNames = pools.keySet().iterator();
+            Iterator<String> poolNames = pools.keySet().iterator();
             while (poolNames.hasNext()) {
                 list.add(poolNames.next());
             }
@@ -300,7 +300,7 @@
      */
     public void resetAllConnections() {
         if (ClassConstants.ServerSession_Class.isAssignableFrom(getSession().getClass())) {
-            Iterator enumtr = ((ServerSession)getSession()).getConnectionPools().values().iterator();
+            Iterator<ConnectionPool> enumtr = ((ServerSession)getSession()).getConnectionPools().values().iterator();
             while (enumtr.hasNext()) {
                 ConnectionPool pool = (ConnectionPool)enumtr.next();
                 pool.shutDown();
@@ -328,11 +328,11 @@
      * @exception ClassNotFoundException thrown then the IdentityMap for that class name could not be found
      */
     public List getObjectsInIdentityMap(String className) throws ClassNotFoundException {
-        Class classToChange = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
+        Class classToChange = getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
         IdentityMap map = getSession().getIdentityMapAccessorInstance().getIdentityMap(classToChange);
 
         Vector results = new Vector(map.getSize());
-        Enumeration objects = map.keys();
+        Enumeration<CacheKey> objects = map.keys();
         while (objects.hasMoreElements()) {
             results.add(((CacheKey)objects.nextElement()).getObject());
         }
@@ -345,7 +345,7 @@
      * @exception ClassNotFoundException thrown then the IdentityMap for that class name could not be found
      */
     public Integer getNumberOfObjectsInIdentityMap(String className) throws ClassNotFoundException {
-        Class classToChange = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
+        Class classToChange = getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
         return getSession().getIdentityMapAccessorInstance().getIdentityMap(classToChange).getSize();
     }
 
@@ -358,7 +358,7 @@
      * @exception ClassNotFoundException thrown then the IdentityMap for that class name could not be found
      */
     public List getObjectsInIdentityMapSubCacheAsMap(String className) throws ClassNotFoundException {
-        Class classToChange = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
+        Class classToChange = getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
         IdentityMap map = getSession().getIdentityMapAccessorInstance().getIdentityMap(classToChange);
 
         //CR3855
@@ -378,7 +378,7 @@
     public Integer getNumberOfObjectsInIdentityMapSubCache(String className) throws ClassNotFoundException {
         //This needs to use the Session's active class loader (not implemented yet)
         Integer result = 0;
-        Class classToChange = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
+        Class classToChange = getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
         IdentityMap map = getSession().getIdentityMapAccessorInstance().getIdentityMap(classToChange);
         if (map.getClass().isAssignableFrom(ClassConstants.HardCacheWeakIdentityMap_Class)) {
             List subCache = ((HardCacheWeakIdentityMap)map).getReferenceCache();
@@ -450,7 +450,7 @@
          Class registeredClass;
 
          //get identity map, and initialize
-         registeredClass = (Class)getSession().getDatasourcePlatform().getConversionManager()
+         registeredClass = getSession().getDatasourcePlatform().getConversionManager()
              .convertObject(className, ClassConstants.CLASS);
          getSession().getIdentityMapAccessor().initializeIdentityMap(registeredClass);
          ((AbstractSession)session).log(SessionLog.INFO, SessionLog.SERVER, "jmx_mbean_runtime_services_identity_map_initialized", className);
@@ -467,7 +467,7 @@
       *        This method will log the instance level locks in the Identity Map for the given class in the session.
       */
       public void printIdentityMapLocks(String registeredClassName) {
-          Class registeredClass = (Class)getSession().getDatasourcePlatform().getConversionManager()
+          Class registeredClass = getSession().getDatasourcePlatform().getConversionManager()
               .convertObject(registeredClassName, ClassConstants.CLASS);
           getSession().getIdentityMapAccessorInstance().getIdentityMapManager().printLocks(registeredClass);
       }
@@ -757,15 +757,15 @@
       *
       * @return java.util.Vector
       */
-     private Vector getMappedClassNames() {
-         Map alreadyAdded = new HashMap();
-         Vector mappedClassNames = new Vector();
+     private Vector<String> getMappedClassNames() {
+         Map<String, Boolean> alreadyAdded = new HashMap<>();
+         Vector<String> mappedClassNames = new Vector<>();
          String mappedClassName = null;
 
-         Iterator descriptorsIterator = getSession().getProject().getDescriptors()
+         Iterator<ClassDescriptor> descriptorsIterator = getSession().getProject().getDescriptors()
                  .values().iterator();
          while (descriptorsIterator.hasNext()) {
-             ClassDescriptor nextDescriptor = (ClassDescriptor) descriptorsIterator.next();
+             ClassDescriptor nextDescriptor = descriptorsIterator.next();
 
              // differentiate between a generated class and not, by comparing the descriptor's Java class
              if (nextDescriptor.getCMPPolicy() != null) {
@@ -795,15 +795,15 @@
      *   @param filter A comma separated list of strings to match against.
      *   @return A Vector of class names that match the filter.
      */
-     public Vector getMappedClassNamesUsingFilter(String filter) {
+     public Vector<String> getMappedClassNamesUsingFilter(String filter) {
          //Output Vector
-         Vector outputVector = new Vector();
+         Vector<String> outputVector = new Vector<>();
 
          //Input mapped class names
-         Vector mappedClassNames = getMappedClassNames();
+         Vector<String> mappedClassNames = getMappedClassNames();
 
          //Input filter values
-         ArrayList filters = new ArrayList();
+         List<String> filters = new ArrayList<>();
          StringTokenizer lineTokens = new StringTokenizer(filter, ",");
          while (lineTokens.hasMoreTokens()) {
              filters.add(lineTokens.nextToken());
@@ -996,8 +996,8 @@
      */
      public void printAvailableConnectionPools() {
          if (ClassConstants.ServerSession_Class.isAssignableFrom(getSession().getClass())) {
-             Map pools = ((ServerSession)getSession()).getConnectionPools();
-             Iterator poolNames = pools.keySet().iterator();
+             Map<String, ConnectionPool> pools = ((ServerSession)getSession()).getConnectionPools();
+             Iterator<String> poolNames = pools.keySet().iterator();
              while (poolNames.hasNext()) {
                  String poolName = poolNames.next().toString();
                  ((AbstractSession)session).log(SessionLog.INFO, SessionLog.SERVER, "jmx_mbean_runtime_services_pool_name", poolName);
@@ -1063,7 +1063,7 @@
      * @exception ClassNotFoundException thrown then the IdentityMap for that class name could not be found
      */
      public void printObjectsInIdentityMap(String className) throws ClassNotFoundException {
-         Class classWithMap = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
+         Class classWithMap = getSession().getDatasourcePlatform().getConversionManager().convertObject(className, ClassConstants.CLASS);
          IdentityMap map = getSession().getIdentityMapAccessorInstance().getIdentityMap(classWithMap);
 
          //check if the identity map exists
@@ -1073,7 +1073,7 @@
          }
 
          //check if there are any objects in the identity map. Print if so.
-         Enumeration objects = map.keys();
+         Enumeration<CacheKey> objects = map.keys();
          if (!objects.hasMoreElements()) {
              ((AbstractSession)session).log(SessionLog.INFO, SessionLog.SERVER, "jmx_mbean_runtime_services_identity_map_empty", className);
          }
@@ -1105,7 +1105,7 @@
          //get each identity map, and log the type
          for (int index = 0; index < classesRegistered.size(); index++) {
              registeredClassName = (String)classesRegistered.elementAt(index);
-             registeredClass = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(registeredClassName, ClassConstants.CLASS);
+             registeredClass = getSession().getDatasourcePlatform().getConversionManager().convertObject(registeredClassName, ClassConstants.CLASS);
              IdentityMap map = getSession().getIdentityMapAccessorInstance().getIdentityMap(registeredClass);
              ((AbstractSession)session).log(SessionLog.INFO, SessionLog.SERVER, "jmx_mbean_runtime_services_identity_map_class",
                      registeredClassName, map.getClass());
@@ -1176,7 +1176,7 @@
          ClassDescriptor currentDescriptor;
 
          //use a table to eliminate duplicate classes. Ignore Aggregates
-         Iterator descriptors = getSession().getProject().getDescriptors().values().iterator();
+         Iterator<ClassDescriptor> descriptors = getSession().getProject().getDescriptors().values().iterator();
          while (descriptors.hasNext()) {
              currentDescriptor = (ClassDescriptor)descriptors.next();
              if (!currentDescriptor.isAggregateDescriptor()) {
@@ -1287,7 +1287,7 @@
          //get each identity map, and invalidate
          for (int index = 0; index < classesRegistered.size(); index++) {
              registeredClassName = (String)classesRegistered.elementAt(index);
-             registeredClass = (Class)getSession().getDatasourcePlatform().getConversionManager()
+             registeredClass = getSession().getDatasourcePlatform().getConversionManager()
                  .convertObject(registeredClassName, ClassConstants.CLASS);
              getSession().getIdentityMapAccessor().invalidateClass(registeredClass);
              ((AbstractSession)session).log(SessionLog.INFO, SessionLog.SERVER, "jmx_mbean_runtime_services_identity_map_invalidated", registeredClassName);
@@ -1327,7 +1327,7 @@
          Class registeredClass;
 
          //get identity map, and invalidate
-         registeredClass = (Class)getSession().getDatasourcePlatform().getConversionManager()
+         registeredClass = getSession().getDatasourcePlatform().getConversionManager()
              .convertObject(className, ClassConstants.CLASS);
          getSession().getIdentityMapAccessor().invalidateClass(registeredClass);
          ((AbstractSession)session).log(SessionLog.INFO, SessionLog.SERVER, "jmx_mbean_runtime_services_identity_map_invalidated", className);
@@ -1400,37 +1400,23 @@
       * @param filter A comma separated list of strings to match against.
       * @return A ArrayList of instance of ClassSummaryDetail containing class information for the class names that match the filter.
       */
-     /**
-      * Provide a list of instance of ClassSummaryDetail containing information about the
-      * classes in the session whose class names match the provided filter.
-      *
-      * ClassSummaryDetail is a model specific class that can be used internally by the Portable JMX Framework to
-      * convert class attribute to JMX required open type, it has:-
-      *    1. model specific type that needs to be converted : ["Class Name", "Parent Class Name",  "Cache Type", "Configured Size", "Current Size"]
-      *    2. convert methods.
-      *
-      * @param filter A comma separated list of strings to match against.
-      * @return A ArrayList of instance of ClassSummaryDetail containing class information for the class names that match the filter.
-      */
-     public List <ClassSummaryDetailBase>  getClassSummaryDetailsUsingFilterArray(String filter) {
-         // if the filter is null, return all the details
-         if (filter == null) {
-             return getClassSummaryDetailsArray();
-         }
-
+     public List<ClassSummaryDetailBase>  getClassSummaryDetailsUsingFilterArray(String filter) {
          try {
-             Vector mappedClassNames = getMappedClassNamesUsingFilter(filter);
+             // if the filter is null, return all the details
+             Vector<String> mappedClassNames = getMappedClassNamesUsingFilter(filter);
              String mappedClassName;
-             List classSummaryDetails = new ArrayList<ClassSummaryDetailBase>();
+             List<ClassSummaryDetailBase> classSummaryDetails = new ArrayList<>();
              // Check if there aren't any classes mapped
              if (mappedClassNames.size() == 0) {
                  return null;
              }
-
+             CompositeType type = buildCompositeTypeForClassSummaryDetails();
              // get details for each class, and add the details to the summary
              for (int index = 0; index < mappedClassNames.size(); index++) {
                  mappedClassName = (String)mappedClassNames.elementAt(index);
-                 classSummaryDetails.add(buildLowlevelDetailsFor(mappedClassName));
+                 Map<String, String> data = buildLowlevelDetailsFor(mappedClassName);
+                 final CompositeDataSupport support = new CompositeDataSupport(type, buildLowlevelDetailsFor(mappedClassName));
+                 classSummaryDetails.add(ClassSummaryDetailBase.from(support));
              }
              return classSummaryDetails;
          } catch (Exception openTypeException) {
@@ -1453,29 +1439,9 @@
       *
       * @return A List of instance of ClassSummaryDetail objects containing class information for the class names that match the filter.
       */
-     public List <ClassSummaryDetailBase> getClassSummaryDetailsArray() {
-         try {
-             Vector mappedClassNames = getMappedClassNames();
-             List classSummaryDetails = new ArrayList<ClassSummaryDetailBase>();
-             // Check if there aren't any classes mapped
-             if (mappedClassNames.size() == 0) {
-                 return null;
-             }
-
-             // get details for each class, and add the details to the summary
-             for (int index = 0; index < mappedClassNames.size(); index++) {
-                 String mappedClassName = (String)mappedClassNames.elementAt(index);
-                 classSummaryDetails.add(buildLowlevelDetailsFor(mappedClassName));
-             }
-
-             return classSummaryDetails;
-         } catch (Exception openTypeException) {
-             AbstractSessionLog.getLog().log(SessionLog.SEVERE, "jmx_enabled_platform_mbean_runtime_exception", PLATFORM_NAME, openTypeException);
-             openTypeException.printStackTrace();
-         }
-
+     public List<ClassSummaryDetailBase> getClassSummaryDetailsArray() {
          // wait to get requirements from EM
-         return null;
+         return getClassSummaryDetailsUsingFilterArray(".*");
      }
 
      /**
@@ -1515,8 +1481,8 @@
 
       * @return HashMap
       */
-     private HashMap buildLowlevelDetailsFor(String mappedClassName) {
-         Class mappedClass = (Class)getSession().getDatasourcePlatform().getConversionManager().convertObject(mappedClassName, ClassConstants.CLASS);
+     private Map<String, String> buildLowlevelDetailsFor(String mappedClassName) {
+         Class mappedClass = getSession().getDatasourcePlatform().getConversionManager().convertObject(mappedClassName, ClassConstants.CLASS);
          ClassDescriptor descriptor = getSession().getProject().getDescriptor(mappedClass);
 
          String cacheType = "";
@@ -1542,7 +1508,7 @@
 
          boolean isChildDescriptor = descriptor.isChildDescriptor();
 
-         HashMap details = new HashMap(5);
+         Map<String, String> details = new HashMap<>(5);
          details.put("Class Name", mappedClassName);
          details.put("Cache Type", (isChildDescriptor ? "" : cacheType));
          details.put("Configured Size", (isChildDescriptor ? "" : configuredSize));
@@ -1576,7 +1542,7 @@
          }
 
          try {
-             Vector mappedClassNames = getMappedClassNamesUsingFilter(filter);
+             Vector<String> mappedClassNames = getMappedClassNamesUsingFilter(filter);
              String mappedClassName;
              TabularDataSupport rowData = new TabularDataSupport(buildTabularTypeForClassSummaryDetails());
              // Check if there aren't any classes mapped
@@ -1614,7 +1580,7 @@
       */
      private TabularData buildClassSummaryDetails() {
          try {
-             Vector mappedClassNames = getMappedClassNames();
+             Vector<String> mappedClassNames = getMappedClassNames();
              String mappedClassName;
              TabularDataSupport rowData = new TabularDataSupport(buildTabularTypeForClassSummaryDetails());
              // Check if there aren't any classes mapped
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/DefaultConnector.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/DefaultConnector.java
index 3901a8e..ea12ca6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/DefaultConnector.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/DefaultConnector.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
@@ -250,7 +250,7 @@
             if(session != null) {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        driverClass = AccessController.doPrivileged(new PrivilegedClassForName(this.getDriverClassName(), true, session.getPlatform().getConversionManager().getLoader()));
+                        driverClass = AccessController.doPrivileged(new PrivilegedClassForName<>(this.getDriverClassName(), true, session.getPlatform().getConversionManager().getLoader()));
                     } catch (PrivilegedActionException exception) {
                         throw DatabaseException.configurationErrorClassNotFound(this.getDriverClassName());
                     }
@@ -260,7 +260,7 @@
             } else {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        driverClass = AccessController.doPrivileged(new PrivilegedClassForName(this.getDriverClassName(), true, ConversionManager.getDefaultManager().getLoader()));
+                        driverClass = AccessController.doPrivileged(new PrivilegedClassForName<>(this.getDriverClassName(), true, ConversionManager.getDefaultManager().getLoader()));
                     } catch (PrivilegedActionException exception) {
                         throw DatabaseException.configurationErrorClassNotFound(this.getDriverClassName());                }
                 } else {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/Project.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/Project.java
index 8cd122f..0252cdc 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/Project.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/Project.java
@@ -59,6 +59,7 @@
 import org.eclipse.persistence.internal.helper.Helper;
 import org.eclipse.persistence.internal.helper.NonSynchronizedVector;
 import org.eclipse.persistence.internal.identitymaps.AbstractIdentityMap;
+import org.eclipse.persistence.internal.identitymaps.IdentityMap;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
 import org.eclipse.persistence.queries.AttributeGroup;
@@ -84,17 +85,17 @@
 public class Project extends CoreProject<ClassDescriptor, Login, DatabaseSession> implements Serializable, Cloneable {
     protected String name;
     protected Login datasourceLogin;
-    protected Map<Class, ClassDescriptor> descriptors;
+    protected Map<Class<?>, ClassDescriptor> descriptors;
     protected List<ClassDescriptor> orderedDescriptors;
 
     // Currently only one is supported.
     protected MultitenantPolicy multitenantPolicy;
 
     /** Holds the default set of read-only classes that apply to each UnitOfWork. */
-    protected Vector defaultReadOnlyClasses;
+    protected Vector<Class<?>> defaultReadOnlyClasses;
 
     /** Cache the EJBQL descriptor aliases. */
-    protected Map aliasDescriptors;
+    protected Map<String, ClassDescriptor> aliasDescriptors;
 
     /** Cache if any descriptor is isolated. (set during initialization) */
     protected boolean hasIsolatedClasses;
@@ -120,7 +121,7 @@
     protected transient boolean hasMappingsPostCalculateChangesOnDeleted = false;
 
     /** Default value for ClassDescriptor.identityMapClass. */
-    protected Class defaultIdentityMapClass = AbstractIdentityMap.getDefaultIdentityMapClass();
+    protected Class<? extends IdentityMap> defaultIdentityMapClass = AbstractIdentityMap.getDefaultIdentityMapClass();
 
     /** Default value for ClassDescriptor.identityMapSize. */
     protected int defaultIdentityMapSize = 100;
@@ -208,7 +209,7 @@
      */
     public Project() {
         this.name = "";
-        this.descriptors = new HashMap();
+        this.descriptors = new HashMap<>();
         this.defaultReadOnlyClasses = NonSynchronizedVector.newInstance();
         this.orderedDescriptors = new ArrayList<>();
         this.hasIsolatedClasses = false;
@@ -301,7 +302,7 @@
     public List<DatabaseQuery> getJPAQueries() {
         // PERF: lazy init, not normally required.
         if (jpaQueries == null) {
-            jpaQueries = new ArrayList();
+            jpaQueries = new ArrayList<>();
         }
 
         return jpaQueries;
@@ -315,7 +316,7 @@
     public List<DatabaseQuery> getJPATablePerTenantQueries() {
         // PERF: lazy init, not normally required.
         if (jpaTablePerTenantQueries == null) {
-            jpaTablePerTenantQueries = new ArrayList();
+            jpaTablePerTenantQueries = new ArrayList<>();
         }
 
         return jpaTablePerTenantQueries;
@@ -405,7 +406,7 @@
      * PUBLIC:
      * Add the read-only class which apply to each UnitOfWork created by default.
      */
-    public void addDefaultReadOnlyClass(Class readOnlyClass) {
+    public void addDefaultReadOnlyClass(Class<?> readOnlyClass) {
         getDefaultReadOnlyClasses().addElement(readOnlyClass);
     }
 
@@ -439,14 +440,17 @@
                 // Descriptor aliases may be concurrently accessed by other threads.
                 // Make a clone, add new descriptor to the clone, override original with the clone.
                 if (alias != null) {
-                    final Map aliasDescriptorsClone = getAliasDescriptors() != null
-                            ? (Map)((HashMap)getAliasDescriptors()).clone() : new HashMap();
+                    @SuppressWarnings({"unchecked"})
+                    final Map<String, ClassDescriptor> aliasDescriptorsClone = getAliasDescriptors() != null
+                            ? (Map<String, ClassDescriptor>)((HashMap<String, ClassDescriptor>) getAliasDescriptors()).clone()
+                            : new HashMap<>();
                     aliasDescriptorsClone.put(alias, descriptor);
                     setAliasDescriptors(aliasDescriptorsClone);
                 }
                 // Descriptors may be concurrently accessed by other threads.
                 // Make a clone, add new descriptor to the clone, override original with the clone.
-                final Map<Class, ClassDescriptor> descriptorsClone = (Map)((HashMap)getDescriptors()).clone();
+                @SuppressWarnings({"unchecked"})
+                final Map<Class<?>, ClassDescriptor> descriptorsClone = (Map<Class<?>, ClassDescriptor>)((HashMap<Class<?>, ClassDescriptor>) getDescriptors()).clone();
                 descriptorsClone.put(descriptor.getJavaClass(), descriptor);
                 setDescriptors(descriptorsClone);
                 session.copyDescriptorsFromProject();
@@ -472,11 +476,14 @@
             if (session.isConnected()) {
                 // Descriptor aliases may be concurrently accessed by other threads.
                 // Make a clone, add new descriptors to the clone, override original with the clone.
-                final Map aliasDescriptorsClone = getAliasDescriptors() != null
-                        ? (Map)((HashMap)getAliasDescriptors()).clone() : new HashMap();
+                @SuppressWarnings({"unchecked"})
+                final Map<String, ClassDescriptor> aliasDescriptorsClone = getAliasDescriptors() != null
+                        ? (Map<String, ClassDescriptor>)((HashMap<String, ClassDescriptor>) getAliasDescriptors()).clone()
+                        : new HashMap<>();
                 // Descriptors may be concurrently accessed by other threads.
                 // Make a clone, add new descriptors to the clone, override original with the clone.
-                final Map<Class, ClassDescriptor> descriptorsClone = (Map)((HashMap)getDescriptors()).clone();
+                @SuppressWarnings({"unchecked"})
+                final Map<Class<?>, ClassDescriptor> descriptorsClone = (Map<Class<?>, ClassDescriptor>)((HashMap<Class<?>, ClassDescriptor>) getDescriptors()).clone();
                 for (ClassDescriptor descriptor : (Collection<ClassDescriptor>) descriptors) {
                     descriptorsClone.put(descriptor.getJavaClass(), descriptor);
                     final String alias = descriptor.getAlias();
@@ -491,7 +498,7 @@
                 session.copyDescriptorsFromProject();
                 session.initializeDescriptors(descriptors);
             } else {
-                final Map<Class, ClassDescriptor> projectDescriptors = getDescriptors();
+                final Map<Class<?>, ClassDescriptor> projectDescriptors = getDescriptors();
                 for (ClassDescriptor descriptor : (Collection<ClassDescriptor>) descriptors) {
                     final String alias = descriptor.getAlias();
                     projectDescriptors.put(descriptor.getJavaClass(), descriptor);
@@ -526,7 +533,7 @@
             return;
         }
         if (this.sqlResultSetMappings == null){
-            this.sqlResultSetMappings = new HashMap();
+            this.sqlResultSetMappings = new HashMap<>();
         }
         this.sqlResultSetMappings.put(sqlResultSetMapping.getName(), sqlResultSetMapping);
     }
@@ -536,9 +543,9 @@
      * Set all this project's descriptors to conform all read queries within the context of the unit of work.
      */
     public void conformAllDescriptors() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setShouldAlwaysConformResultsInUnitOfWork(true);
         }
     }
@@ -550,16 +557,16 @@
      */
     @Override
     public void convertClassNamesToClasses(ClassLoader classLoader){
-        Iterator ordered = orderedDescriptors.iterator();
+        Iterator<ClassDescriptor> ordered = orderedDescriptors.iterator();
         while (ordered.hasNext()){
-            ClassDescriptor descriptor = (ClassDescriptor)ordered.next();
+            ClassDescriptor descriptor = ordered.next();
             descriptor.convertClassNamesToClasses(classLoader);
         }
         for (AttributeGroup group : this.getAttributeGroups().values()){
             group.convertClassNamesToClasses(classLoader);
         }
         // Clear old descriptors to allow rehash on new classes.
-        this.descriptors = new HashMap();
+        this.descriptors = new HashMap<>();
         // convert class names to classes for each SQLResultSetMapping
         if (this.sqlResultSetMappings != null) {
             for (SQLResultSetMapping mapping : this.sqlResultSetMappings.values()) {
@@ -578,9 +585,9 @@
      * Switch all descriptors to assume existence for non-null primary keys.
      */
     public void assumeExistenceForDoesExist() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.getQueryManager().assumeExistenceForDoesExist();
         }
     }
@@ -590,9 +597,9 @@
      * Switch all descriptors to check the cache for existence.
      */
     public void checkCacheForDoesExist() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.getQueryManager().checkCacheForDoesExist();
         }
     }
@@ -602,9 +609,9 @@
      * Switch all descriptors to check the database for existence.
      */
     public void checkDatabaseForDoesExist() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.getQueryManager().checkDatabaseForDoesExist();
         }
     }
@@ -696,7 +703,7 @@
      * PUBLIC:
      * Return default value for descriptor cache type.
      */
-    public Class getDefaultIdentityMapClass() {
+    public Class<? extends IdentityMap> getDefaultIdentityMapClass() {
         return this.defaultIdentityMapClass;
     }
 
@@ -729,7 +736,7 @@
      * Return the descriptor specified for the class.
      * If the passed Class parameter is null, null will be returned.
      */
-    public ClassDescriptor getClassDescriptor(Class theClass) {
+    public ClassDescriptor getClassDescriptor(Class<?> theClass) {
         return getDescriptor(theClass);
     }
 
@@ -738,7 +745,7 @@
      * Return the descriptor specified for the class.
      */
     @Override
-    public ClassDescriptor getDescriptor(Class theClass) {
+    public ClassDescriptor getDescriptor(Class<?> theClass) {
         if (theClass == null) {
             return null;
         }
@@ -749,11 +756,11 @@
      * PUBLIC:
      * Return the descriptors in a ClassDescriptors Map keyed on the Java class.
      */
-    public Map<Class, ClassDescriptor> getDescriptors() {
+    public Map<Class<?>, ClassDescriptor> getDescriptors() {
         // Lazy initialize class references from orderedDescriptors when reading from XML.
         if (descriptors.isEmpty() && (!orderedDescriptors.isEmpty())) {
-            for (Iterator iterator = orderedDescriptors.iterator(); iterator.hasNext();) {
-                ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
+            for (Iterator<ClassDescriptor> iterator = orderedDescriptors.iterator(); iterator.hasNext();) {
+                ClassDescriptor descriptor = iterator.next();
                 descriptors.put(descriptor.getJavaClass(), descriptor);
             }
         }
@@ -906,7 +913,7 @@
      * PUBLIC:
      * Set default value for descriptor cache type.
      */
-    public void setDefaultIdentityMapClass(Class defaultIdentityMapClass) {
+    public void setDefaultIdentityMapClass(Class<? extends IdentityMap> defaultIdentityMapClass) {
         this.defaultIdentityMapClass = defaultIdentityMapClass;
     }
 
@@ -939,8 +946,8 @@
      */
     public void setDescriptors(Map descriptors) {
         this.descriptors = descriptors;
-        for (Iterator iterator = descriptors.values().iterator(); iterator.hasNext();) {
-            ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
+        for (Iterator<ClassDescriptor> iterator = descriptors.values().iterator(); iterator.hasNext();) {
+            ClassDescriptor descriptor = iterator.next();
             String alias = descriptor.getAlias();
             if (alias != null) {
                 addAlias(alias, descriptor);
@@ -962,8 +969,8 @@
      *        container call.
      */
     public void setDeferModificationsUntilCommit(int deferralLevel) {
-        for (Iterator iterator = descriptors.values().iterator(); iterator.hasNext();) {
-            ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
+        for (Iterator<ClassDescriptor> iterator = descriptors.values().iterator(); iterator.hasNext();) {
+            ClassDescriptor descriptor = iterator.next();
             if (descriptor.getCMPPolicy() != null) {
                 descriptor.getCMPPolicy().setDeferModificationsUntilCommit(deferralLevel);
             }
@@ -1127,9 +1134,9 @@
      * Switch all descriptors to use the cache identity map.
      */
     public void useCacheIdentityMap() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useCacheIdentityMap();
         }
     }
@@ -1139,9 +1146,9 @@
      * Switch all descriptors to use the cache identity map the size.
      */
     public void useCacheIdentityMap(int cacheSize) {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useCacheIdentityMap();
             descriptor.setIdentityMapSize(cacheSize);
         }
@@ -1152,9 +1159,9 @@
      * Switch all descriptors to use the full identity map.
      */
     public void useFullIdentityMap() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useFullIdentityMap();
         }
     }
@@ -1164,9 +1171,9 @@
      * Switch all descriptors to use the full identity map with initial cache size.
      */
     public void useFullIdentityMap(int initialCacheSize) {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useFullIdentityMap();
             descriptor.setIdentityMapSize(initialCacheSize);
         }
@@ -1177,9 +1184,9 @@
      * Switch all descriptors to use no identity map.
      */
     public void useNoIdentityMap() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useNoIdentityMap();
         }
     }
@@ -1189,9 +1196,9 @@
      * Switch all descriptors to use the soft cache weak identity map.
      */
     public void useSoftCacheWeakIdentityMap() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useSoftCacheWeakIdentityMap();
         }
     }
@@ -1201,9 +1208,9 @@
      * Switch all descriptors to use the soft cache weak identity map with soft cache size.
      */
     public void useSoftCacheWeakIdentityMap(int cacheSize) {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useSoftCacheWeakIdentityMap();
             descriptor.setIdentityMapSize(cacheSize);
         }
@@ -1214,9 +1221,9 @@
      * Asks each descriptor if is uses optimistic locking.
      */
     public boolean usesOptimisticLocking() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             if (descriptor.usesOptimisticLocking()) {
                 return true;
             }
@@ -1229,9 +1236,9 @@
      * Asks each descriptor if is uses sequencing.
      */
     public boolean usesSequencing() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             if (descriptor.usesSequenceNumbers()) {
                 return true;
             }
@@ -1244,9 +1251,9 @@
      * Switch all descriptors to use the weak identity map.
      */
     public void useWeakIdentityMap() {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useWeakIdentityMap();
         }
     }
@@ -1256,9 +1263,9 @@
      * Switch all descriptors to use the weak identity map.
      */
     public void useWeakIdentityMap(int initialCacheSize) {
-        Iterator descriptors = getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.useWeakIdentityMap();
             descriptor.setIdentityMapSize(initialCacheSize);
         }
@@ -1278,7 +1285,7 @@
      * INTERNAL:
      * Returns the alias descriptors hashtable.
      */
-    public Map getAliasDescriptors() {
+    public Map<String, ClassDescriptor> getAliasDescriptors() {
         return aliasDescriptors;
     }
 
@@ -1288,7 +1295,7 @@
      */
     public void addAlias(String alias, ClassDescriptor descriptor) {
         if (aliasDescriptors == null) {
-            aliasDescriptors = new HashMap(10);
+            aliasDescriptors = new HashMap<>(10);
         }
         aliasDescriptors.put(alias, descriptor);
     }
@@ -1356,7 +1363,7 @@
     public ClassDescriptor getDescriptorForAlias(String alias) {
         ClassDescriptor descriptor = null;
         if (aliasDescriptors != null) {
-            descriptor = (ClassDescriptor)aliasDescriptors.get(alias);
+            descriptor = aliasDescriptors.get(alias);
         }
         return descriptor;
     }
@@ -1365,7 +1372,7 @@
      * INTERNAL:
      * Set the alias descriptors hashtable.
      */
-    public void setAliasDescriptors(Map aHashtable) {
+    public void setAliasDescriptors(Map<String, ClassDescriptor> aHashtable) {
         aliasDescriptors = aHashtable;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/Session.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/Session.java
index cc9b745..d91330f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/Session.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/Session.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
@@ -433,7 +433,7 @@
      * by one of the classes stored in the map, that descriptor will be stored under the
      * new class.
      */
-    @Override ClassDescriptor getDescriptor(Class theClass);
+    @Override ClassDescriptor getDescriptor(Class<?> theClass);
 
     /**
      * ADVANCED:
@@ -452,7 +452,7 @@
      * ADVANCED:
      * Return all registered descriptors.
      */
-    @Override Map<Class, ClassDescriptor> getDescriptors();
+    @Override Map<Class<?>, ClassDescriptor> getDescriptors();
 
     /**
      * ADVANCED:
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/broker/SessionBroker.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/broker/SessionBroker.java
index 9764df9..ed6e87f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/broker/SessionBroker.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/broker/SessionBroker.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
@@ -109,7 +109,7 @@
         clientBroker.setServerPlatform(getServerPlatform());
         String sessionName;
         AbstractSession session;
-        Iterator names = this.getSessionsByName().keySet().iterator();
+        Iterator<String> names = this.getSessionsByName().keySet().iterator();
         while (names.hasNext()) {
             sessionName = (String)names.next();
             session = getSessionForName(sessionName);
@@ -154,7 +154,7 @@
         historicalBroker.parent = this;
         String sessionName;
         AbstractSession session;
-        Iterator names = this.getSessionsByName().keySet().iterator();
+        Iterator<String> names = this.getSessionsByName().keySet().iterator();
         while (names.hasNext()) {
             sessionName = (String)names.next();
             session = getSessionForName(sessionName);
@@ -172,8 +172,8 @@
     @Override
     public void releaseJTSConnection() {
         RuntimeException exception = null;
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             try {
                 session.releaseJTSConnection();
@@ -245,8 +245,8 @@
      */
     @Override
     protected void basicBeginTransaction() throws DatabaseException {
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.beginTransaction();
         }
@@ -261,15 +261,15 @@
     @Override
     protected void basicCommitTransaction() throws DatabaseException {
         // Do one last check it make sure that all sessions are still connected.
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             if (!session.isConnected()) {
                 throw DatabaseException.databaseAccessorNotConnected();
             }
         }
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.commitTransaction();
         }
@@ -282,8 +282,8 @@
     @Override
     protected void basicRollbackTransaction() throws DatabaseException {
         DatabaseException globalException = null;
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             try {
                 session.rollbackTransaction();
@@ -307,7 +307,7 @@
             String sessionName = null;
             AbstractSession ssession = null;
 
-            Iterator names = this.getSessionsByName().keySet().iterator();
+            Iterator<String> names = this.getSessionsByName().keySet().iterator();
             while (names.hasNext()) {
                 sessionName = (String)names.next();
                 ssession = getSessionForName(sessionName);
@@ -379,7 +379,7 @@
      */
     @Override
     public AsOfClause getAsOfClause() {
-        for (Iterator enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
+        for (Iterator<AbstractSession> enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
             return ((AbstractSession)enumtr.next()).getAsOfClause();
         }
         return null;
@@ -556,7 +556,7 @@
         // in initializeDescriptors method.
         // Because initializeDescriptors() is not called for a session-member of a SessionBroker,
         // initializeSequencing() for the sessions should be called here.
-        for (Iterator enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
+        for (Iterator<AbstractSession> enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
             DatabaseSessionImpl databaseSession = (DatabaseSessionImpl)enumtr.next();
             String sessionName = databaseSession.getName();
 
@@ -593,7 +593,7 @@
         super.initializeDescriptors();
         // Must reset project options to session broker project, as initialization occurs
         // with local projects.
-        for (Iterator enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
+        for (Iterator<AbstractSession> enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
             DatabaseSessionImpl databaseSession = (DatabaseSessionImpl)enumtr.next();
             if (databaseSession.getProject().hasGenericHistorySupport()) {
                 getProject().setHasGenericHistorySupport(true);
@@ -660,8 +660,8 @@
      * Return if this session is a client session broker.
      */
     public boolean isClientSessionBroker() {
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             if (session.isClientSession()) {
                 return true;
@@ -681,8 +681,8 @@
             return false;
         }
 
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             if (!session.isConnected()) {
                 return false;
@@ -697,8 +697,8 @@
      * Return if this session is a server session broker.
      */
     public boolean isServerSessionBroker() {
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             if (session.isServerSession()) {
                 return true;
@@ -726,8 +726,8 @@
     public void login() throws DatabaseException {
         preConnectDatasource();
         // Connection all sessions and initialize
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             DatabaseSessionImpl session = (DatabaseSessionImpl)sessionEnum.next();
             if (!session.isConnected()) {
                 session.login();
@@ -750,8 +750,8 @@
     public void loginAndDetectDatasource() throws DatabaseException {
         preConnectDatasource();
         // Connection all sessions and initialize
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             DatabaseSessionImpl session = (DatabaseSessionImpl)sessionEnum.next();
             if (!session.isConnected()) {
                 if(session.getDatasourcePlatform().getClass().getName().equals("org.eclipse.persistence.platform.database.DatabasePlatform")) {
@@ -773,8 +773,8 @@
     public void login(String userName, String password) throws DatabaseException {
         preConnectDatasource();
         // Connection all sessions and initialize
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             DatabaseSessionImpl session = (DatabaseSessionImpl)sessionEnum.next();
             session.getDatasourceLogin().setUserName(userName);
             session.getDatasourceLogin().setPassword(password);
@@ -802,8 +802,8 @@
             this.eventManager.preLogout(this);
         }
         if (!isClientSessionBroker()) {
-            for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                     sessionEnum.hasNext();) {
+            for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+                 sessionEnum.hasNext();) {
                 DatabaseSessionImpl session = (DatabaseSessionImpl)sessionEnum.next();
                 session.logout();
             }
@@ -821,8 +821,8 @@
      */
     @Override
     public void postLogin() {
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-            sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
            DatabaseSessionImpl session = (DatabaseSessionImpl)sessionEnum.next();
            session.postLogin();
         }
@@ -850,8 +850,8 @@
             }
 
             // The keys/classes must also be used as some descriptors may be under multiple classes.
-            Iterator descriptors = session.getDescriptors().values().iterator();
-            Iterator classes = session.getDescriptors().keySet().iterator();
+            Iterator<ClassDescriptor> descriptors = session.getDescriptors().values().iterator();
+            Iterator<Class<?>> classes = session.getDescriptors().keySet().iterator();
             while (descriptors.hasNext()) {
                 ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
                 Class descriptorClass = (Class)classes.next();
@@ -895,7 +895,7 @@
         }
         RuntimeException exception = null;
         AbstractSession session;
-        for (Iterator enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
+        for (Iterator<AbstractSession> enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
             session = (AbstractSession)enumtr.next();
             try {
                 session.release();
@@ -920,7 +920,7 @@
     public Object retryQuery(DatabaseQuery query, AbstractRecord row, DatabaseException databaseException, int retryCount, AbstractSession executionSession) {
         // If not in a transaction and has a write connection, must release it if invalid.
         if (isClientSessionBroker()) {
-            for (Iterator it = getSessionsByName().values().iterator(); it.hasNext();) {
+            for (Iterator<AbstractSession> it = getSessionsByName().values().iterator(); it.hasNext();) {
                 ClientSession clientSession = (ClientSession)it.next();
                 clientSession.getParent().releaseInvalidClientSession(clientSession);
             }
@@ -949,8 +949,8 @@
     public void setIntegrityChecker(IntegrityChecker integrityChecker) {
         super.setIntegrityChecker(integrityChecker);
 
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.setIntegrityChecker(integrityChecker);
         }
@@ -966,8 +966,8 @@
     public void setSessionLog(SessionLog log) {
         super.setSessionLog(log);
 
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.setSessionLog(log);
         }
@@ -983,8 +983,8 @@
     public void setLog(Writer log) {
         super.setLog(log);
 
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.setLog(log);
         }
@@ -999,8 +999,8 @@
     public void setProfiler(SessionProfiler profiler) {
         super.setProfiler(profiler);
 
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.setProfiler(profiler);
         }
@@ -1032,7 +1032,7 @@
     public void setSynchronized(boolean synched) {
         if(!isServerSessionBroker()) {
             super.setSynchronized(synched);
-            Iterator itSessions = getSessionsByName().values().iterator();
+            Iterator<AbstractSession> itSessions = getSessionsByName().values().iterator();
             while(itSessions.hasNext()) {
                 ((AbstractSession)itSessions.next()).setSynchronized(synched);
             }
@@ -1047,15 +1047,15 @@
      */
     @Override
     public void writesCompleted() {
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             if (!session.isConnected()) {
                 throw DatabaseException.databaseAccessorNotConnected();
             }
         }
-        for (Iterator sessionEnum = getSessionsByName().values().iterator();
-                 sessionEnum.hasNext();) {
+        for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
+             sessionEnum.hasNext();) {
             AbstractSession session = (AbstractSession)sessionEnum.next();
             session.writesCompleted();
         }
@@ -1100,7 +1100,7 @@
             return getParent().howManySequencingCallbacks();
         } else {
             int nCallbacks = 0;
-            Iterator itSessions = getSessionsByName().values().iterator();
+            Iterator<AbstractSession> itSessions = getSessionsByName().values().iterator();
             while(itSessions.hasNext()) {
                 if(((DatabaseSessionImpl)itSessions.next()).isSequencingCallbackRequired()) {
                     nCallbacks++;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/coordination/TransportManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/coordination/TransportManager.java
index 68142a6..ef15d6c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/coordination/TransportManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/coordination/TransportManager.java
@@ -342,7 +342,7 @@
      */
     public void removeAllConnectionsToExternalServices() {
         synchronized (this) {
-            Enumeration connections = connectionsToExternalServices.elements();
+            Enumeration<RemoteConnection> connections = connectionsToExternalServices.elements();
             connectionsToExternalServices = new Hashtable(3);
 
             while (connections.hasMoreElements()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/ProjectClassGenerator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/ProjectClassGenerator.java
index 639b36e..83cafbd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/ProjectClassGenerator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/ProjectClassGenerator.java
@@ -172,8 +172,8 @@
     }
 
     protected void addAggregateCollectionMappingLines(NonreflectiveMethodDefinition method, String mappingName, AggregateCollectionMapping mapping) {
-        Enumeration targetKeysEnum = mapping.getTargetForeignKeyFields().elements();
-        Enumeration sourceKeysEnum = mapping.getSourceKeyFields().elements();
+        Enumeration<DatabaseField> targetKeysEnum = mapping.getTargetForeignKeyFields().elements();
+        Enumeration<DatabaseField> sourceKeysEnum = mapping.getSourceKeyFields().elements();
         while (sourceKeysEnum.hasMoreElements()) {
             DatabaseField sourceField = (DatabaseField)sourceKeysEnum.nextElement();
             DatabaseField targetField = (DatabaseField)targetKeysEnum.nextElement();
@@ -397,8 +397,8 @@
 
         method.addLine(mappingName + ".setDirectFieldName(\"" + mapping.getDirectFieldName() + "\");");
 
-        Enumeration sourceKeysEnum = mapping.getSourceKeyFields().elements();
-        Enumeration referenceKeysEnum = mapping.getReferenceKeyFields().elements();
+        Enumeration<DatabaseField> sourceKeysEnum = mapping.getSourceKeyFields().elements();
+        Enumeration<DatabaseField> referenceKeysEnum = mapping.getReferenceKeyFields().elements();
         while (referenceKeysEnum.hasMoreElements()) {
             DatabaseField sourceField = (DatabaseField)sourceKeysEnum.nextElement();
             DatabaseField referenceField = (DatabaseField)referenceKeysEnum.nextElement();
@@ -434,7 +434,7 @@
         method.addLine("//Fetch groups");
         method.addLine("descriptor.setFetchGroupManager(new FetchGroupManager());");
 
-        Map namedFetchGroups = descriptor.getFetchGroupManager().getFetchGroups();
+        Map<String, FetchGroup> namedFetchGroups = descriptor.getFetchGroupManager().getFetchGroups();
 
         if (descriptor.getFetchGroupManager().getDefaultFetchGroup() != null) {
             String defaultFetchGroupIdentifier = descriptor.getFetchGroupManager().getDefaultFetchGroup().getName() + "FetchGroup";
@@ -446,8 +446,8 @@
         if (namedFetchGroups.isEmpty()) {
             return;
         }
-        for (Iterator namedFetchGroupIter = namedFetchGroups.values().iterator();
-                 namedFetchGroupIter.hasNext();) {
+        for (Iterator<FetchGroup> namedFetchGroupIter = namedFetchGroups.values().iterator();
+             namedFetchGroupIter.hasNext();) {
             FetchGroup namedFetchGroup = (FetchGroup)namedFetchGroupIter.next();
             String fetchGroupIdentifier = namedFetchGroup.getName() + "FetchGroup";
             method.addLine("");
@@ -587,7 +587,7 @@
             }
 
             // Ordering.
-            Iterator queryKeyExpressions = collectionMapping.getOrderByQueryKeyExpressions().iterator();
+            Iterator<Expression> queryKeyExpressions = collectionMapping.getOrderByQueryKeyExpressions().iterator();
             while (queryKeyExpressions.hasNext()) {
                 FunctionExpression expression = (FunctionExpression) queryKeyExpressions.next();
                 String queryKeyName = expression.getBaseExpression().getName();
@@ -712,16 +712,16 @@
             method.addLine(mappingName + ".setRelationTableName(\"" + mapping.getRelationTable().getQualifiedName() + "\");");
         }
 
-        Enumeration sourceRelationKeysEnum = mapping.getSourceRelationKeyFields().elements();
-        Enumeration sourceKeysEnum = mapping.getSourceKeyFields().elements();
+        Enumeration<DatabaseField> sourceRelationKeysEnum = mapping.getSourceRelationKeyFields().elements();
+        Enumeration<DatabaseField> sourceKeysEnum = mapping.getSourceKeyFields().elements();
         while (sourceRelationKeysEnum.hasMoreElements()) {
             DatabaseField sourceField = (DatabaseField)sourceKeysEnum.nextElement();
             DatabaseField relationField = (DatabaseField)sourceRelationKeysEnum.nextElement();
             method.addLine(mappingName + ".addSourceRelationKeyFieldName(\"" + relationField.getQualifiedName() + "\", \"" + sourceField.getQualifiedName() + "\");");
         }
 
-        Enumeration targetRelationKeysEnum = mapping.getTargetRelationKeyFields().elements();
-        Enumeration targetKeysEnum = mapping.getTargetKeyFields().elements();
+        Enumeration<DatabaseField> targetRelationKeysEnum = mapping.getTargetRelationKeyFields().elements();
+        Enumeration<DatabaseField> targetKeysEnum = mapping.getTargetKeyFields().elements();
         while (targetRelationKeysEnum.hasMoreElements()) {
             DatabaseField targetField = (DatabaseField)targetKeysEnum.nextElement();
             DatabaseField relationField = (DatabaseField)targetRelationKeysEnum.nextElement();
@@ -821,8 +821,8 @@
     }
 
     protected void addOneToManyMappingLines(NonreflectiveMethodDefinition method, String mappingName, OneToManyMapping mapping) {
-        Enumeration targetKeysEnum = mapping.getTargetForeignKeyFields().elements();
-        Enumeration sourceKeysEnum = mapping.getSourceKeyFields().elements();
+        Enumeration<DatabaseField> targetKeysEnum = mapping.getTargetForeignKeyFields().elements();
+        Enumeration<DatabaseField> sourceKeysEnum = mapping.getSourceKeyFields().elements();
         while (sourceKeysEnum.hasMoreElements()) {
             DatabaseField sourceField = (DatabaseField)sourceKeysEnum.nextElement();
             DatabaseField targetField = (DatabaseField)targetKeysEnum.nextElement();
@@ -831,8 +831,8 @@
     }
 
     protected void addOneToOneMappingLines(NonreflectiveMethodDefinition method, String mappingName, OneToOneMapping mapping) {
-        for (Iterator foreignKeysEnum = mapping.getSourceToTargetKeyFields().keySet().iterator();
-                 foreignKeysEnum.hasNext();) {
+        for (Iterator<DatabaseField> foreignKeysEnum = mapping.getSourceToTargetKeyFields().keySet().iterator();
+             foreignKeysEnum.hasNext();) {
             DatabaseField sourceField = (DatabaseField)foreignKeysEnum.next();
             DatabaseField targetField = mapping.getSourceToTargetKeyFields().get(sourceField);
             if (mapping.getForeignKeyFields().contains(sourceField)) {
@@ -1191,7 +1191,7 @@
             }
 
             //joinedAttribute
-            for (Iterator joinedEnum = readQuery.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinedEnum.hasNext();) {
+            for (Iterator<Expression> joinedEnum = readQuery.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinedEnum.hasNext();) {
                 Expression joinedExp = (Expression)joinedEnum.next();
                 builderString = buildBuilderString(builderString, method, iteration, queryIdentifier);
                 buildExpressionString(builderString, method, queryIdentifier, joinedExp, ".addJoinedAttribute(");
@@ -1300,7 +1300,7 @@
 
         // Query arguments.
         Iterator<String> argumentTypes = query.getArgumentTypeNames().iterator();
-        for (Iterator arguments = query.getArguments().iterator(); arguments.hasNext();) {
+        for (Iterator<String> arguments = query.getArguments().iterator(); arguments.hasNext();) {
             String argument = (String)arguments.next();
             String argumentTypeName = argumentTypes.next();
             method.addLine(queryIdentifier + ".addArgument(\"" + argument + "\", " + argumentTypeName + ".class);");
@@ -1383,7 +1383,7 @@
             }
         }
 
-        Iterator fieldTransformations = mapping.getFieldTransformations().iterator();
+        Iterator<FieldTransformation> fieldTransformations = mapping.getFieldTransformations().iterator();
         while (fieldTransformations.hasNext()) {
             FieldTransformation trans = (FieldTransformation)fieldTransformations.next();
             String fieldName = trans.getFieldName();
@@ -1526,21 +1526,21 @@
 
         if ((!descriptor.isAggregateDescriptor()) && (!descriptor.isDescriptorForInterface())) {
             // Tables
-            for (Enumeration tablesEnum = descriptor.getTables().elements();
-                     tablesEnum.hasMoreElements();) {
+            for (Enumeration<DatabaseTable> tablesEnum = descriptor.getTables().elements();
+                 tablesEnum.hasMoreElements();) {
                 String tableName = ((DatabaseTable)tablesEnum.nextElement()).getQualifiedName();
                 method.addLine("descriptor.addTableName(\"" + tableName + "\");");
             }
 
             // Primary key
             if (!descriptor.isChildDescriptor()) {
-                for (Enumeration keysEnum = descriptor.getPrimaryKeyFieldNames().elements();
-                         keysEnum.hasMoreElements();) {
+                for (Enumeration<String> keysEnum = descriptor.getPrimaryKeyFieldNames().elements();
+                     keysEnum.hasMoreElements();) {
                     method.addLine("descriptor.addPrimaryKeyFieldName(\"" + keysEnum.nextElement() + "\");");
                 }
             }
-            for (Iterator multipleTablePrimaryKeysEnum = descriptor.getAdditionalTablePrimaryKeyFields().values().iterator();
-                     multipleTablePrimaryKeysEnum.hasNext();) {
+            for (Iterator<Map<DatabaseField, DatabaseField>> multipleTablePrimaryKeysEnum = descriptor.getAdditionalTablePrimaryKeyFields().values().iterator();
+                 multipleTablePrimaryKeysEnum.hasNext();) {
                 Map keyMapping = (Map)multipleTablePrimaryKeysEnum.next();
                 Iterator keyMappingSourceFieldsEnum = keyMapping.keySet().iterator();
                 Iterator keyMappingTargetFieldsEnum = keyMapping.values().iterator();
@@ -1593,7 +1593,7 @@
         if (!descriptor.getQueryKeys().isEmpty()) {
             method.addLine("");
             method.addLine("// Query keys.");
-            for (Iterator queryKeysEnum = descriptor.getQueryKeys().values().iterator(); queryKeysEnum.hasNext();) {
+            for (Iterator<QueryKey> queryKeysEnum = descriptor.getQueryKeys().values().iterator(); queryKeysEnum.hasNext();) {
                 addQueryKeyLines(method, (QueryKey)queryKeysEnum.next());
             }
         }
@@ -1766,7 +1766,7 @@
      */
     protected void computeDescriptorMethodNames() {
         Hashtable shortNames = new Hashtable();
-        Iterator descriptors = project.getOrderedDescriptors().iterator();
+        Iterator<ClassDescriptor> descriptors = project.getOrderedDescriptors().iterator();
         while (descriptors.hasNext()) {
             ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ClientSession.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ClientSession.java
index aec4918..f219798 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ClientSession.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ClientSession.java
@@ -416,7 +416,7 @@
      * Return all registered descriptors.
      */
     @Override
-    public Map<Class, ClassDescriptor> getDescriptors() {
+    public Map<Class<?>, ClassDescriptor> getDescriptors() {
         // descriptors from the project may have been modified (for table per
         // tenants so make sure to return the updated ones)
         if (hasTablePerTenantDescriptors()) {
@@ -666,7 +666,7 @@
     @Override
     public void release() throws DatabaseException {
         // Clear referencing classes. If this is not done the object is not garbage collected.
-        for (Map.Entry<Class, ClassDescriptor> entry : getDescriptors().entrySet()) {
+        for (Map.Entry<Class<?>, ClassDescriptor> entry : getDescriptors().entrySet()) {
             entry.getValue().clearReferencingClasses();
         }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ConnectionPool.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ConnectionPool.java
index c38d94f..989a3c9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ConnectionPool.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ConnectionPool.java
@@ -474,7 +474,7 @@
     public synchronized void shutDown() {
         setIsConnected(false);
 
-        for (Iterator iterator = getConnectionsAvailable().iterator(); iterator.hasNext();) {
+        for (Iterator<Accessor> iterator = getConnectionsAvailable().iterator(); iterator.hasNext();) {
             try {
                 ((Accessor)iterator.next()).disconnect(getOwner());
             } catch (DatabaseException exception) {
@@ -482,7 +482,7 @@
             }
         }
 
-        for (Iterator iterator = getConnectionsUsed().iterator(); iterator.hasNext();) {
+        for (Iterator<Accessor> iterator = getConnectionsUsed().iterator(); iterator.hasNext();) {
             try {
                 ((Accessor)iterator.next()).disconnect(getOwner());
             } catch (DatabaseException exception) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ServerSession.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ServerSession.java
index f496e86..c4b83d5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ServerSession.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ServerSession.java
@@ -824,7 +824,7 @@
         } finally {
             this.readConnectionPool.shutDown();
 
-            for (Iterator poolsEnum = getConnectionPools().values().iterator(); poolsEnum.hasNext();) {
+            for (Iterator<ConnectionPool> poolsEnum = getConnectionPools().values().iterator(); poolsEnum.hasNext();) {
                 ((ConnectionPool)poolsEnum.next()).shutDown();
             }
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/PackageRenamer.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/PackageRenamer.java
index 998c277..6f8b881 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/PackageRenamer.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/PackageRenamer.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) 1998, 2018 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -565,8 +565,8 @@
         }
 
         // Sorting key package name.
-        Vector aVector = new Vector();
-        for (Enumeration e = properties.keys(); e.hasMoreElements();) {
+        Vector<Object> aVector = new Vector<>();
+        for (Enumeration<Object> e = properties.keys(); e.hasMoreElements();) {
             aVector.addElement(e.nextElement());
         }
         String[] aStringArrayOfSortedKeyPackageName = new String[aVector.size()];
@@ -576,7 +576,7 @@
         // Starting to rename.
         boolean alreadyPrint = false;
         int index = aStringArrayOfSortedKeyPackageName.length;
-        for (Enumeration enumtr = properties.keys(); enumtr.hasMoreElements();) {
+        for (Enumeration<Object> enumtr = properties.keys(); enumtr.hasMoreElements();) {
             enumtr.nextElement();
             String key = aStringArrayOfSortedKeyPackageName[index - 1];
             String value = (String)properties.get(key);
@@ -650,7 +650,7 @@
      * @return The new filename, regardless of whether is has been changed
      */
     public String returnNewFileNameIfRequired(String aSourceFileNameWithoutRoot) {
-        for (Enumeration enumtr = properties.keys(); enumtr.hasMoreElements();) {
+        for (Enumeration<Object> enumtr = properties.keys(); enumtr.hasMoreElements();) {
             String key = (String)enumtr.nextElement();
 
             if (aSourceFileNameWithoutRoot.indexOf(key) != -1) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/DefaultTableGenerator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/DefaultTableGenerator.java
index 025fafd..6450df5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/DefaultTableGenerator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/DefaultTableGenerator.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) 1998, 2015 Sei Syvalta. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -245,7 +245,7 @@
 
             List existedTables = new ArrayList();
             List existedTableNames = new ArrayList();
-            Iterator tblDefIter = tblCreator.getTableDefinitions().iterator();
+            Iterator<TableDefinition> tblDefIter = tblCreator.getTableDefinitions().iterator();
 
             while (tblDefIter.hasNext()) {
                 TableDefinition tblDef = (TableDefinition) tblDefIter.next();
@@ -295,7 +295,7 @@
                 isPKField = descriptor.getPrimaryKeyFields().contains(dbField);
 
                 //then check if the field is a pk field in the secondary table(s), this is only applied to the multiple tables case.
-                Map secondaryKeyMap = descriptor.getAdditionalTablePrimaryKeyFields().get(dbField.getTable());
+                Map<DatabaseField, DatabaseField> secondaryKeyMap = descriptor.getAdditionalTablePrimaryKeyFields().get(dbField.getTable());
 
                 if (secondaryKeyMap != null) {
                     isPKField = isPKField || secondaryKeyMap.containsValue(dbField);
@@ -556,14 +556,14 @@
      * Reset the transformation mapping field types
      */
     protected void resetTransformedFieldType(TransformationMapping mapping) {
-        Iterator transIter = mapping.getFieldTransformations().iterator();
+        Iterator<FieldTransformation> transIter = mapping.getFieldTransformations().iterator();
         while (transIter.hasNext()) {
             FieldTransformation transformation = (FieldTransformation) transIter.next();
 
             if (transformation instanceof MethodBasedFieldTransformation) {
                 MethodBasedFieldTransformation methodTransformation = (MethodBasedFieldTransformation) transformation;
                 try {
-                    Class returnType = Helper.getDeclaredMethod(mapping.getDescriptor().getJavaClass(), methodTransformation.getMethodName(), null).getReturnType();
+                    Class<?> returnType = Helper.getDeclaredMethod(mapping.getDescriptor().getJavaClass(), methodTransformation.getMethodName(), null).getReturnType();
                     getFieldDefFromDBField(methodTransformation.getField()).setType(returnType);
                 } catch (NoSuchMethodException ex) {
                     // For some reason, the method type could not be retrieved,
@@ -576,7 +576,7 @@
                 Class[] params = new Class[] {Object.class, String.class, Session.class};
 
                 try {
-                    Class returnType = Helper.getDeclaredMethod(classTransformation.getTransformerClass(), methodName, params).getReturnType();
+                    Class<?> returnType = Helper.getDeclaredMethod(classTransformation.getTransformerClass(), methodName, params).getReturnType();
 
                     if (returnType.equals(Object.class)) {
                         // User needs to be more specific with their class
@@ -603,7 +603,7 @@
         TableDefinition targetTable = getTableDefFromDBTable(mapping.getReferenceDescriptor().getDefaultTable());
         addFieldsForMappedKeyMapContainerPolicy(mapping.getContainerPolicy(), targetTable);
 
-        Iterator aggregateFieldIterator = mapping.getReferenceDescriptor().getFields().iterator();
+        Iterator<DatabaseField> aggregateFieldIterator = mapping.getReferenceDescriptor().getFields().iterator();
         while (aggregateFieldIterator.hasNext()) {
             DatabaseField dbField = (DatabaseField) aggregateFieldIterator.next();
             //add the target definition to the table definition
@@ -874,7 +874,7 @@
         }
 
         DatabaseTable databaseTable = null;
-        Iterator dbTblIter = descriptor.getTables().iterator();
+        Iterator<DatabaseTable> dbTblIter = descriptor.getTables().iterator();
         while (dbTblIter.hasNext()) {
             databaseTable = (DatabaseTable) dbTblIter.next();
             Map<DatabaseField, DatabaseField> srcFields = descriptor.getAdditionalTablePrimaryKeyFields().get(databaseTable);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/ForeignKeyConstraint.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/ForeignKeyConstraint.java
index 73d023d..5a44d1a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/ForeignKeyConstraint.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/ForeignKeyConstraint.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
@@ -70,7 +70,7 @@
                 writer.write(getForeignKeyDefinition());
             } else {
                 writer.write("FOREIGN KEY (");
-                for (Iterator iterator = getSourceFields().iterator(); iterator.hasNext();) {
+                for (Iterator<String> iterator = getSourceFields().iterator(); iterator.hasNext();) {
                     writer.write((String)iterator.next());
                     if (iterator.hasNext()) {
                         writer.write(", ");
@@ -79,7 +79,7 @@
                 writer.write(") REFERENCES ");
                 writer.write(getTargetTable());
                 writer.write(" (");
-                for (Iterator iterator = getTargetFields().iterator(); iterator.hasNext();) {
+                for (Iterator<String> iterator = getTargetFields().iterator(); iterator.hasNext();) {
                     writer.write((String)iterator.next());
                     if (iterator.hasNext()) {
                         writer.write(", ");
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredProcedureGenerator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredProcedureGenerator.java
index fdb785c..81969ae 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredProcedureGenerator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredProcedureGenerator.java
@@ -28,6 +28,7 @@
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.exceptions.ValidationException;
+import org.eclipse.persistence.internal.databaseaccess.DatasourceCall;
 import org.eclipse.persistence.internal.expressions.ParameterExpression;
 import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.helper.Helper;
@@ -63,22 +64,22 @@
 public class StoredProcedureGenerator {
     public SchemaManager schemaManager;
     /** This hashtable is used to store the storedProcedure referenced by the class name. */
-    private Hashtable storedProcedures;
+    private Hashtable<ClassDescriptor, Vector<StoredProcedureDefinition>> storedProcedures;
     /** This hashtable is used to store the storedProcedure referenced by the mapping name. */
-    private Hashtable mappingStoredProcedures;
-    private Hashtable intToTypeConverterHash;
+    private Hashtable<ClassDescriptor, Hashtable<String, Hashtable<String, StoredProcedureDefinition>>> mappingStoredProcedures;
+    private Hashtable<Integer, Class<?>> intToTypeConverterHash;
     private Writer writer;
     private String prefix;
     private static final String DEFAULT_PREFIX = "";
-    private Hashtable sequenceProcedures;
+    private Hashtable<String, StoredProcedureDefinition> sequenceProcedures;
     private static final int MAX_NAME_SIZE = 30;
 
     public StoredProcedureGenerator(SchemaManager schemaMngr) {
         super();
         this.schemaManager = schemaMngr;
-        this.sequenceProcedures = new Hashtable();
-        this.storedProcedures = new Hashtable();
-        this.mappingStoredProcedures = new Hashtable();
+        this.sequenceProcedures = new Hashtable<>();
+        this.storedProcedures = new Hashtable<>();
+        this.mappingStoredProcedures = new Hashtable<>();
         this.buildIntToTypeConverterHash();
         this.prefix = DEFAULT_PREFIX;
         this.verify();
@@ -88,7 +89,7 @@
      * INTERNAL: Build all conversions based on JDBC return values.
      */
     protected void buildIntToTypeConverterHash() {
-        this.intToTypeConverterHash = new Hashtable();
+        this.intToTypeConverterHash = new Hashtable<>();
         this.intToTypeConverterHash.put(8, Double.class);
         this.intToTypeConverterHash.put(-7, Boolean.class);
         this.intToTypeConverterHash.put(-3, Byte[].class);
@@ -167,7 +168,7 @@
             outputWriter.write("This is a EclipseLink generated class to add stored procedure admendments to a project.  \n * Any changes to this code will be lost when the class is regenerated \n */\npublic class ");
             outputWriter.write(className);
             outputWriter.write("{\n");
-            Enumeration descriptorEnum = this.storedProcedures.keys();
+            Enumeration<ClassDescriptor> descriptorEnum = this.storedProcedures.keys();
             while (descriptorEnum.hasMoreElements()) {
                 descriptor = (ClassDescriptor)descriptorEnum.nextElement();
                 if (descriptor.isDescriptorForInterface() || descriptor.isAggregateDescriptor()) {
@@ -391,12 +392,12 @@
      * INTERNAL: Generates the mapping stored procedures for this descriptor.
      * currently only 1:1 and 1:M are supported
      */
-    protected Hashtable generateMappingStoredProcedures(ClassDescriptor descriptor) {
-        Vector mappings = descriptor.getMappings();
-        Hashtable mappingSP = new Hashtable();
-        Hashtable mappingTable;
-        for (Enumeration enumtr = mappings.elements(); enumtr.hasMoreElements();) {
-            mappingTable = new Hashtable();
+    protected Hashtable<String, Hashtable<String, StoredProcedureDefinition>> generateMappingStoredProcedures(ClassDescriptor descriptor) {
+        Vector<DatabaseMapping> mappings = descriptor.getMappings();
+        Hashtable<String, Hashtable<String, StoredProcedureDefinition>> mappingSP = new Hashtable<>();
+        Hashtable<String, StoredProcedureDefinition> mappingTable;
+        for (Enumeration<DatabaseMapping> enumtr = mappings.elements(); enumtr.hasMoreElements();) {
+            mappingTable = new Hashtable<>();
             DatabaseMapping mapping = (DatabaseMapping)enumtr.nextElement();
             if (mapping.isOneToManyMapping()) {
                 if (!getSession().getPlatform().isOracle()) {
@@ -526,8 +527,8 @@
      */
     protected StoredProcedureDefinition generateStoredProcedure(DatabaseQuery query, List<DatabaseField> fields, AbstractRecord rowForPrepare, String name) {
         StoredProcedureDefinition definition = new StoredProcedureDefinition();
-        Vector callVector;
-        Vector statementVector = new Vector();
+        Vector<DatasourceCall> callVector;
+        Vector<String> statementVector = new Vector<>();
 
         query.checkPrepare(getSession(), rowForPrepare, true);
         callVector = ((CallQueryMechanism)query.getQueryMechanism()).getCalls();
@@ -538,7 +539,7 @@
                 callVector.addElement(((CallQueryMechanism)query.getQueryMechanism()).getCall());
             }
         }
-        Enumeration enumtr = callVector.elements();
+        Enumeration<DatasourceCall> enumtr = callVector.elements();
         while (enumtr.hasMoreElements()) {
             SQLCall call = (SQLCall)enumtr.nextElement();
             statementVector.addElement(this.buildProcedureString(call));
@@ -588,11 +589,11 @@
         // Must turn binding off to ensure literals are printed correctly.
         boolean wasBinding = getSession().getLogin().shouldBindAllParameters();
         getSession().getLogin().setShouldBindAllParameters(false);
-        Map descriptors = getSession().getProject().getDescriptors();
-        Iterator iterator = descriptors.keySet().iterator();
+        Map<Class<?>, ClassDescriptor> descriptors = getSession().getProject().getDescriptors();
+        Iterator<Class<?>> iterator = descriptors.keySet().iterator();
         ClassDescriptor desc;
         StoredProcedureDefinition definition;
-        Vector definitionVector;
+        Vector<StoredProcedureDefinition> definitionVector;
         this.generateSequenceStoredProcedures(getSession().getProject());
         while (iterator.hasNext()) {
             desc = (ClassDescriptor)descriptors.get(iterator.next());
@@ -600,7 +601,7 @@
                 continue;
             }
             definition = this.generateInsertStoredProcedure(desc);
-            definitionVector = new Vector();
+            definitionVector = new Vector<>();
             definitionVector.addElement(definition);
             this.writeDefinition(definition);
             definition = this.generateUpdateStoredProcedure(desc);
@@ -617,9 +618,9 @@
                 definitionVector.addElement(definition);
                 this.writeDefinition(definition);
             }
-            Hashtable mappingDefinitions = this.generateMappingStoredProcedures(desc);
-            for (Enumeration enum2 = mappingDefinitions.elements(); enum2.hasMoreElements();) {
-                Hashtable table = (Hashtable)enum2.nextElement();
+            Hashtable<String, Hashtable<String, StoredProcedureDefinition>> mappingDefinitions = this.generateMappingStoredProcedures(desc);
+            for (Enumeration<Hashtable<String, StoredProcedureDefinition>> enum2 = mappingDefinitions.elements(); enum2.hasMoreElements();) {
+                Hashtable<String, StoredProcedureDefinition> table = enum2.nextElement();
                 definition = (StoredProcedureDefinition)table.get("1MREAD");
                 if (definition != null) {
                     this.writeDefinition(definition);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/UniqueKeyConstraint.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/UniqueKeyConstraint.java
index c179df5..5c85522 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/UniqueKeyConstraint.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/UniqueKeyConstraint.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
@@ -60,8 +60,8 @@
     public void appendDBString(Writer writer, AbstractSession session) {
         try {
             writer.write("UNIQUE (");
-            for (Enumeration sourceEnum = getSourceFields().elements();
-                     sourceEnum.hasMoreElements();) {
+            for (Enumeration<String> sourceEnum = getSourceFields().elements();
+                 sourceEnum.hasMoreElements();) {
                 writer.write((String)sourceEnum.nextElement());
                 if (sourceEnum.hasMoreElements()) {
                     writer.write(", ");
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/jotm/JotmTransactionController.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/jotm/JotmTransactionController.java
index e17a942..5d025d4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/jotm/JotmTransactionController.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/jotm/JotmTransactionController.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
@@ -54,11 +54,11 @@
     protected TransactionManager acquireTransactionManager() throws Exception {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
             try{
-                Class clazz = AccessController.doPrivileged(new PrivilegedClassForName(TX_CURRENT_FACTORY_CLASS));
+                Class<? extends TransactionManager> clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(TX_CURRENT_FACTORY_CLASS));
                 Method method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, TX_CURRENT_FACTORY_METHOD, null, false));
                 Method txMethod = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, TX_MANAGER_FACTORY_METHOD, null, false));
-                Object current = AccessController.doPrivileged(new PrivilegedMethodInvoker(method, null, null));
-                return (TransactionManager) AccessController.doPrivileged(new PrivilegedMethodInvoker(txMethod, current, null));
+                TransactionManager current = AccessController.doPrivileged(new PrivilegedMethodInvoker<TransactionManager>(method, null, null));
+                return AccessController.doPrivileged(new PrivilegedMethodInvoker<>(txMethod, current, null));
             }catch (PrivilegedActionException ex){
                 if (ex.getCause() instanceof ClassNotFoundException){
                     throw (ClassNotFoundException)ex.getCause();
@@ -75,11 +75,11 @@
                 throw (RuntimeException) ex.getCause();
             }
         }else{
-            Class clazz = PrivilegedAccessHelper.getClassForName(TX_CURRENT_FACTORY_CLASS);
+            Class<? extends TransactionManager> clazz = PrivilegedAccessHelper.getClassForName(TX_CURRENT_FACTORY_CLASS);
             Method method = PrivilegedAccessHelper.getMethod(clazz, TX_CURRENT_FACTORY_METHOD, null, false);
             Method txMethod = PrivilegedAccessHelper.getMethod(clazz, TX_MANAGER_FACTORY_METHOD, null, false);
-            Object current = PrivilegedAccessHelper.invokeMethod(method, null, null);
-            return (TransactionManager)PrivilegedAccessHelper.invokeMethod(txMethod, current, null);
+            TransactionManager current = PrivilegedAccessHelper.invokeMethod(method, null, null);
+            return PrivilegedAccessHelper.invokeMethod(txMethod, current, null);
         }
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/was/WebSphereTransactionController.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/was/WebSphereTransactionController.java
index bfc3137..9d915b8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/was/WebSphereTransactionController.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/was/WebSphereTransactionController.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.
  * Copyright (c) 1998, 2018 IBM Corporation and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -66,9 +66,9 @@
     protected TransactionManager acquireTransactionManager() throws Exception {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
             try{
-                Class clazz = AccessController.doPrivileged(new PrivilegedClassForName(getTxManagerFactoryClass()));
+                Class<? extends TransactionManager> clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(getTxManagerFactoryClass()));
                 Method method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, getTxManagerFactoryMethod(), null, false));
-                return (TransactionManager) AccessController.doPrivileged(new PrivilegedMethodInvoker(method, null, null));
+                return AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, null, null));
             }catch (PrivilegedActionException ex){
                 if (ex.getCause() instanceof ClassNotFoundException){
                     throw (ClassNotFoundException)ex.getCause();
@@ -85,9 +85,9 @@
                 throw (RuntimeException) ex.getCause();
             }
         }else{
-            Class clazz = PrivilegedAccessHelper.getClassForName(getTxManagerFactoryClass());
+            Class<? extends TransactionManager> clazz = PrivilegedAccessHelper.getClassForName(getTxManagerFactoryClass());
             Method method = PrivilegedAccessHelper.getMethod(clazz, getTxManagerFactoryMethod(), null, false);
-            return (TransactionManager)PrivilegedAccessHelper.invokeMethod(method, null, null);
+            return PrivilegedAccessHelper.invokeMethod(method, null, null);
         }
     }
 }
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/models/employee/eis/xmlfile/NormalHoursNSTransformer.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/models/employee/eis/xmlfile/NormalHoursNSTransformer.java
index d05c784..95f9f8c 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/models/employee/eis/xmlfile/NormalHoursNSTransformer.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/models/employee/eis/xmlfile/NormalHoursNSTransformer.java
@@ -64,8 +64,8 @@
          * This conversion allows for the database type not to match, i.e. may be a Timestamp or
          * String.
          */
-        hours[0] = (Time)session.getProject().getDatasourceLogin().getDatasourcePlatform().convertObject(row.get(startTimeField), Time.class);
-        hours[1] = (Time)session.getProject().getDatasourceLogin().getDatasourcePlatform().convertObject(row.get(endTimeField), Time.class);
+        hours[0] = session.getProject().getDatasourceLogin().getDatasourcePlatform().convertObject(row.get(startTimeField), Time.class);
+        hours[1] = session.getProject().getDatasourceLogin().getDatasourcePlatform().convertObject(row.get(endTimeField), Time.class);
 
         return hours;
     }
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/models/employee/eis/xmlfile/NormalHoursTransformer.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/models/employee/eis/xmlfile/NormalHoursTransformer.java
index ab264f1..a22ef41 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/models/employee/eis/xmlfile/NormalHoursTransformer.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/models/employee/eis/xmlfile/NormalHoursTransformer.java
@@ -49,8 +49,8 @@
          * This conversion allows for the database type not to match, i.e. may be a Timestamp or
          * String.
          */
-        hours[0] = (Time)session.getProject().getDatasourceLogin().getDatasourcePlatform().convertObject(row.get("START_TIME/text()"), Time.class);
-        hours[1] = (Time)session.getProject().getDatasourceLogin().getDatasourcePlatform().convertObject(row.get("END_TIME/text()"), Time.class);
+        hours[0] = session.getProject().getDatasourceLogin().getDatasourcePlatform().convertObject(row.get("START_TIME/text()"), Time.class);
+        hours[1] = session.getProject().getDatasourceLogin().getDatasourcePlatform().convertObject(row.get("END_TIME/text()"), Time.class);
 
         return hours;
     }
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/OXTestCase.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/OXTestCase.java
index f19efa1..5208694 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/OXTestCase.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/OXTestCase.java
@@ -26,6 +26,8 @@
 import java.io.StringWriter;
 import java.io.Writer;
 import java.lang.reflect.Constructor;
+import java.util.Collection;
+import java.util.Iterator;
 import javax.xml.stream.XMLEventReader;
 import javax.xml.stream.XMLEventWriter;
 import javax.xml.stream.XMLInputFactory;
@@ -125,8 +127,8 @@
 
     public XMLContext getXMLContext(Project project) {
         if (platform == Platform.DOC_PRES) {
-            java.util.Collection descriptors = project.getDescriptors().values();
-            java.util.Iterator iter = descriptors.iterator();
+            Collection<ClassDescriptor> descriptors = project.getDescriptors().values();
+            Iterator<ClassDescriptor> iter = descriptors.iterator();
             while (iter.hasNext()) {
                 ClassDescriptor nextDesc = (ClassDescriptor)iter.next();
                 if (nextDesc instanceof org.eclipse.persistence.oxm.XMLDescriptor) {
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/XMLTestCase.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/XMLTestCase.java
index 11a637b..e902b7e 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/XMLTestCase.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/XMLTestCase.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
@@ -59,7 +59,7 @@
             Object testItem = Array.get(testValue, x);
             if(null == controlItem) {
                 assertEquals(null, testItem);
-                Class controlItemClass = controlItem.getClass();
+                Class<? extends Object> controlItemClass = controlItem.getClass();
                 if(controlItemClass.isArray()) {
                     compareArrays(controlItem, testItem);
                 } else {
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/mappings/EISMappingTestCases.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/mappings/EISMappingTestCases.java
index 9189f42..641d301 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/mappings/EISMappingTestCases.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/oxm/mappings/EISMappingTestCases.java
@@ -27,6 +27,7 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.eis.EISDescriptor;
 import org.eclipse.persistence.eis.mappings.*;
 import org.eclipse.persistence.internal.eis.adapters.xmlfile.XMLFileConnectionFactory;
@@ -96,8 +97,8 @@
             log("DEPLOYMENT XML: " + stringWriter.toString());
 
             Project newProject = XMLProjectReader.read(new StringReader(stringWriter.toString()));
-            Map descriptors = project.getDescriptors();
-            Iterator keysIterator = descriptors.keySet().iterator();
+            Map<Class<?>, ClassDescriptor> descriptors = project.getDescriptors();
+            Iterator<Class<?>> keysIterator = descriptors.keySet().iterator();
             while (keysIterator.hasNext()) {
                 Class nextClass = (Class)keysIterator.next();
                 EISDescriptor next = (EISDescriptor)descriptors.get(nextClass);
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/BasicReadWriteTest.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/BasicReadWriteTest.java
index f81060a..77494c4 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/BasicReadWriteTest.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/BasicReadWriteTest.java
@@ -32,7 +32,7 @@
     protected void test() {
         RecordMetaData recordMetaData = CobolTestModel.getConversionRecord();
         row = CobolTestModel.getConversionRow();
-        Enumeration fieldEnum = row.getFields().elements();
+        Enumeration<DatabaseField> fieldEnum = row.getFields().elements();
         resultRow = new CobolRow();
         //write to array
         while (fieldEnum.hasMoreElements()) {
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/CobolTestModel.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/CobolTestModel.java
index 9a183ed..478ce67 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/CobolTestModel.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/CobolTestModel.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
@@ -516,7 +516,7 @@
             return false;
         }
 
-        Enumeration fieldsEnum = row1.getFields().elements();
+        Enumeration<DatabaseField> fieldsEnum = row1.getFields().elements();
         while (fieldsEnum.hasMoreElements()) {
             DatabaseField field = (DatabaseField)fieldsEnum.nextElement();
             DatabaseField fieldMatch = row2.getField(field);
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/RedefineConverterTest.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/RedefineConverterTest.java
index 7fad27a..de57960 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/RedefineConverterTest.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/cobol/RedefineConverterTest.java
@@ -34,7 +34,7 @@
         row = CobolTestModel.getConversionRow();
         row.remove("emp-tasks");
         row.add(new DatabaseField("emp-depart"), "accounting");
-        Enumeration fieldEnum = row.getFields().elements();
+        Enumeration<DatabaseField> fieldEnum = row.getFields().elements();
         resultRow = new CobolRow();
         //write to array
         while (fieldEnum.hasMoreElements()) {
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/xmlfile/EmployeeBasicTestModel.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/xmlfile/EmployeeBasicTestModel.java
index 7007118..3593c40 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/xmlfile/EmployeeBasicTestModel.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/eis/xmlfile/EmployeeBasicTestModel.java
@@ -46,9 +46,9 @@
         suite.setName("EmployeeDeleteObjectTestSuite");
         suite.setDescription("This suite tests the deletion of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new DeleteObjectTest(manager.getObject(employeeClass, "0001")));
@@ -109,9 +109,9 @@
         suite.setName("EmployeeReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new ReadObjectTest(manager.getObject(employeeClass, "0001")));
@@ -136,9 +136,9 @@
         suite.setName("EmployeeUpdateObjectTestSuite");
         suite.setDescription("This suite tests the updating of each object in the employee demo.");
 
-        Class employeeClass = Employee.class;
-        Class largeProjectClass = LargeProject.class;
-        Class smallProjectClass = SmallProject.class;
+        Class<Employee> employeeClass = Employee.class;
+        Class<LargeProject> largeProjectClass = LargeProject.class;
+        Class<SmallProject> smallProjectClass = SmallProject.class;
         PopulationManager manager = PopulationManager.getDefaultManager();
 
         suite.addTest(new WriteObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/jpa/mongo/MongoDatabaseTestSuite.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/jpa/mongo/MongoDatabaseTestSuite.java
index 7f7b5dc..a27b42a 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/jpa/mongo/MongoDatabaseTestSuite.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/jpa/mongo/MongoDatabaseTestSuite.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -987,7 +987,7 @@
      * Test dynamic entities.
      */
     public void testDynamicEntities() {
-        final Map properties = new HashMap<String, String>(this.properties);
+        final Map<String, Object> properties = new HashMap<>(this.properties);
         properties.put("eclipselink.classloader", new DynamicClassLoader(getClass().getClassLoader()));
         properties.put("eclipselink.logging.level", "finest");
         final EntityManagerFactory factory = Persistence.createEntityManagerFactory("mongo-dynamic", properties);
diff --git a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/jpa/mongo/MongoTestSuite.java b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/jpa/mongo/MongoTestSuite.java
index 79ca0c6..c29889c 100644
--- a/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/jpa/mongo/MongoTestSuite.java
+++ b/foundation/org.eclipse.persistence.nosql/src/it/java/org/eclipse/persistence/testing/tests/jpa/mongo/MongoTestSuite.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -962,7 +962,7 @@
      * Test dynamic entities.
      */
     public void testDynamicEntities() {
-        final Map properties = new HashMap<String, String>(this.properties);
+        final Map<String, Object> properties = new HashMap<>(this.properties);
         properties.put("eclipselink.classloader", new DynamicClassLoader(getClass().getClassLoader()));
         properties.put("eclipselink.logging.level", "finest");
         final EntityManagerFactory factory = Persistence.createEntityManagerFactory("mongo-dynamic", properties);
diff --git a/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/nosql/adapters/mongo/MongoDatabaseInteraction.java b/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/nosql/adapters/mongo/MongoDatabaseInteraction.java
index 6ea8c74..162e745 100644
--- a/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/nosql/adapters/mongo/MongoDatabaseInteraction.java
+++ b/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/nosql/adapters/mongo/MongoDatabaseInteraction.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -23,7 +23,6 @@
 import jakarta.resource.cci.Connection;
 import jakarta.resource.cci.Interaction;
 import jakarta.resource.cci.InteractionSpec;
-import jakarta.resource.cci.Record;
 import jakarta.resource.cci.ResourceWarning;
 
 import org.bson.Document;
@@ -68,7 +67,7 @@
      * Output records are not supported/required.
      */
     @Override
-    public boolean execute(InteractionSpec spec, Record input, Record output) throws ResourceException {
+    public boolean execute(InteractionSpec spec, jakarta.resource.cci.Record input, jakarta.resource.cci.Record output) throws ResourceException {
         if (!(spec instanceof MongoInteractionSpec)) {
             throw EISException.invalidInteractionSpecType();
         }
@@ -115,7 +114,7 @@
      * The spec is either GET, PUT or DELETE interaction.
      */
     @Override
-    public Record execute(InteractionSpec spec, Record record) throws ResourceException {
+    public jakarta.resource.cci.Record execute(InteractionSpec spec, jakarta.resource.cci.Record record) throws ResourceException {
         if (!(spec instanceof MongoInteractionSpec)) {
             throw EISException.invalidInteractionSpecType();
         }
@@ -244,11 +243,11 @@
      */
     public MongoRecord buildRecordFromDBObject(Document object) {
         MongoRecord record = new MongoRecord();
-        for (Iterator iterator = object.entrySet().iterator(); iterator.hasNext(); ) {
+        for (Iterator<Map.Entry<String, Object>> iterator = object.entrySet().iterator(); iterator.hasNext(); ) {
             Map.Entry entry = (Map.Entry)iterator.next();
             if (entry.getValue() instanceof BasicDBList) {
                 List values = new ArrayList();
-                for (Iterator valuesIterator = ((BasicDBList)entry.getValue()).iterator(); valuesIterator.hasNext(); ) {
+                for (Iterator<Object> valuesIterator = ((BasicDBList)entry.getValue()).iterator(); valuesIterator.hasNext(); ) {
                     Object value = valuesIterator.next();
                     if (value instanceof Document) {
                         values.add(buildRecordFromDBObject((Document)value));
diff --git a/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/nosql/adapters/mongo/MongoInteraction.java b/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/nosql/adapters/mongo/MongoInteraction.java
index 328a960..8fa7e41 100644
--- a/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/nosql/adapters/mongo/MongoInteraction.java
+++ b/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/nosql/adapters/mongo/MongoInteraction.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -217,7 +217,7 @@
             Map.Entry entry = (Map.Entry)iterator.next();
             if (entry.getValue() instanceof BasicDBList) {
                 List values = new ArrayList();
-                for (Iterator valuesIterator = ((BasicDBList)entry.getValue()).iterator(); valuesIterator.hasNext(); ) {
+                for (Iterator<Object> valuesIterator = ((BasicDBList)entry.getValue()).iterator(); valuesIterator.hasNext(); ) {
                     Object value = valuesIterator.next();
                     if (value instanceof DBObject) {
                         values.add(buildRecordFromDBObject((DBObject)value));
diff --git a/foundation/org.eclipse.persistence.oracle.nosql/src/main/java/org/eclipse/persistence/nosql/adapters/nosql/OracleNoSQLPlatform.java b/foundation/org.eclipse.persistence.oracle.nosql/src/main/java/org/eclipse/persistence/nosql/adapters/nosql/OracleNoSQLPlatform.java
index 49c24dc..dc0e428 100644
--- a/foundation/org.eclipse.persistence.oracle.nosql/src/main/java/org/eclipse/persistence/nosql/adapters/nosql/OracleNoSQLPlatform.java
+++ b/foundation/org.eclipse.persistence.oracle.nosql/src/main/java/org/eclipse/persistence/nosql/adapters/nosql/OracleNoSQLPlatform.java
@@ -329,11 +329,11 @@
             if (id instanceof CacheId) {
                 Object[] idValues = ((CacheId)id).getPrimaryKey();
                 for (Object idValue : idValues) {
-                    String idString = (String)accessor.getDatasourcePlatform().getConversionManager().convertObject(idValue, String.class);
+                    String idString = accessor.getDatasourcePlatform().getConversionManager().convertObject(idValue, String.class);
                     key.add(idString);
                 }
             } else {
-                String idString = (String)accessor.getDatasourcePlatform().getConversionManager().convertObject(id, String.class);
+                String idString = accessor.getDatasourcePlatform().getConversionManager().convertObject(id, String.class);
                 key.add(idString);
             }
         }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/CMAndPlatformWrapper.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/CMAndPlatformWrapper.java
index aa26f8c..a1ef1a7 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/CMAndPlatformWrapper.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/CMAndPlatformWrapper.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
@@ -14,6 +14,7 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.testing.tests.conversion;
 
+import java.util.List;
 import java.util.Vector;
 
 import org.eclipse.persistence.internal.helper.ConversionManager;
@@ -27,7 +28,7 @@
         wrappedObj = object;
     }
 
-    public Vector getDataTypesConvertedFrom(Class aClass) {
+    public List getDataTypesConvertedFrom(Class aClass) {
         if (wrappedObj instanceof ConversionManager) {
             return ((ConversionManager)wrappedObj).getDataTypesConvertedFrom(aClass);
         } else if (wrappedObj instanceof Oracle9Platform) {
@@ -36,7 +37,7 @@
         return new Vector();
     }
 
-    public Vector getDataTypesConvertedTo(Class aClass) {
+    public List getDataTypesConvertedTo(Class aClass) {
         if (wrappedObj instanceof ConversionManager) {
             return ((ConversionManager)wrappedObj).getDataTypesConvertedTo(aClass);
         } else if (wrappedObj instanceof Oracle9Platform) {
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/ConversionManagerOracleTestModel.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/ConversionManagerOracleTestModel.java
index e521a01..72d0298 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/ConversionManagerOracleTestModel.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/ConversionManagerOracleTestModel.java
@@ -40,7 +40,7 @@
 
 
         try{
-            Class testCaseClass = Class.forName("org.eclipse.persistence.testing.tests.conversion.DataTypesConvertedFromAClassTest");
+            Class<?> testCaseClass = Class.forName("org.eclipse.persistence.testing.tests.conversion.DataTypesConvertedFromAClassTest");
             junit.framework.Test testCase = (junit.framework.Test)testCaseClass.getConstructor().newInstance();
             suite.addTest(testCase);
 
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/DataTypesConvertedFromAClassTest.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/DataTypesConvertedFromAClassTest.java
index 02982c1..3d5d3b2 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/DataTypesConvertedFromAClassTest.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/DataTypesConvertedFromAClassTest.java
@@ -14,6 +14,7 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.testing.tests.conversion;
 
+import java.util.List;
 import java.util.Vector;
 import java.util.Calendar;
 import java.sql.Timestamp;
@@ -46,7 +47,7 @@
 
     @Override
     public void test() {
-        Vector vec;
+        List vec;
         int x;
         int y;
         Object obj;
@@ -67,15 +68,15 @@
                 vec = wrapper.getDataTypesConvertedFrom(type);
                 for (y = 0; y < vec.size(); y++) {
                     //Different string formats are required for number, date and other types
-                    if ((fields[x].getName().equals("stringToInt") && !isNumber((Class)vec.elementAt(y))) || (fields[x].getName().equals("stringToTimestamp") && !isTimestamp((Class)vec.elementAt(y))) || (fields[x].getName().equals("aString") && !isChar((Class)vec.elementAt(y)))) {
+                    if ((fields[x].getName().equals("stringToInt") && !isNumber((Class)vec.get(y))) || (fields[x].getName().equals("stringToTimestamp") && !isTimestamp((Class)vec.get(y))) || (fields[x].getName().equals("aString") && !isChar((Class)vec.get(y)))) {
                         continue;
                     }
                     try {
-                        wrapper.convertObject(obj, (Class)vec.elementAt(y));
+                        wrapper.convertObject(obj, (Class)vec.get(y));
                     } catch (Exception e) {
                         exception2 = e;
                         sourceClass = fields[x].getType();
-                        targetClass = (Class)vec.elementAt(y);
+                        targetClass = (Class)vec.get(y);
                     }
                 }
             }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/DataTypesConvertedToAClassTest.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/DataTypesConvertedToAClassTest.java
index 5204352..b73a718 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/DataTypesConvertedToAClassTest.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/conversion/DataTypesConvertedToAClassTest.java
@@ -14,6 +14,7 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.testing.tests.conversion;
 
+import java.util.List;
 import java.util.Vector;
 import java.util.Calendar;
 import java.sql.*;
@@ -48,7 +49,7 @@
 
     @Override
     public void test() {
-        Vector vec;
+        List vec;
         int x;
         int y;
         int z;
@@ -63,7 +64,7 @@
             for (y = 0; y < vec.size(); y++) {
                 for (z = 0; z < fields.length; z++) {
                     type = fields[z].getType();
-                    if (vec.elementAt(y) == type) {
+                    if (vec.get(y) == type) {
                         try {
                             obj = fields[z].get(example);
                         } catch (IllegalAccessException e) {
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/dbchangenotification/CacheInvalidator.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/dbchangenotification/CacheInvalidator.java
index 56326eb..7d326d1 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/dbchangenotification/CacheInvalidator.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/dbchangenotification/CacheInvalidator.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
@@ -59,7 +59,7 @@
         HashSet tableNames = new HashSet();
 
         // fill out tableNames collection with all tables' names mapped by all descriptors
-        Iterator descriptors = session.getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = session.getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
             ClassDescriptor desc = (ClassDescriptor)descriptors.next();
 
@@ -92,7 +92,7 @@
         // pkFieldVectors cached here to avoid calculating it more than once per class
         Hashtable classToPkFieldNames = new Hashtable();
         // loop through the descriptors to fill out tableNameToClass and tableNameToPkFieldNames
-        Iterator descriptors = session.getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> descriptors = session.getDescriptors().values().iterator();
         while (descriptors.hasNext() && !tableNames.isEmpty()) {
             ClassDescriptor desc = (ClassDescriptor)descriptors.next();
 
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/dbchangenotification/DbChangeNotificationAdapter.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/dbchangenotification/DbChangeNotificationAdapter.java
index d2d7808..e12d4f5 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/dbchangenotification/DbChangeNotificationAdapter.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/dbchangenotification/DbChangeNotificationAdapter.java
@@ -51,10 +51,10 @@
 
     @Override
     public void updateProject(Project project, Session session) {
-        Iterator it = project.getDescriptors().values().iterator();
+        Iterator<ClassDescriptor> it = project.getDescriptors().values().iterator();
         while (it.hasNext()) {
             ClassDescriptor desc = (ClassDescriptor)it.next();
-            Enumeration enumDescTableNames = desc.getTables().elements();
+            Enumeration<DatabaseTable> enumDescTableNames = desc.getTables().elements();
             while (enumDescTableNames.hasMoreElements()) {
                 String tableName = ((DatabaseTable)enumDescTableNames.nextElement()).getName();
                 if (!tableNamesToPkFields.containsKey(tableName)) {
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/proxyauthentication/ProxyAuthenticationServerTestSuite.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/proxyauthentication/ProxyAuthenticationServerTestSuite.java
index 8aa09f8..540795e 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/proxyauthentication/ProxyAuthenticationServerTestSuite.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/proxyauthentication/ProxyAuthenticationServerTestSuite.java
@@ -535,7 +535,7 @@
     }
 
     private Map createConnProperties() {
-        Map newProps = JUnitTestCaseHelper.getDatabaseProperties(PROXY_PU);
+        Map<String, String> newProps = JUnitTestCaseHelper.getDatabaseProperties(PROXY_PU);
         newProps.put(PersistenceUnitProperties.JDBC_USER, ProxyAuthenticationUsersAndProperties.connectionUser);
         newProps.put(PersistenceUnitProperties.JDBC_PASSWORD, ProxyAuthenticationUsersAndProperties.connectionPassword);
         return newProps;
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/internal/platform/database/oracle/TIMESTAMPTypes.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/internal/platform/database/oracle/TIMESTAMPTypes.java
index 54dabdd..91fb78b 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/internal/platform/database/oracle/TIMESTAMPTypes.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/internal/platform/database/oracle/TIMESTAMPTypes.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
@@ -21,7 +21,7 @@
  * on jdbc jar.
  */
 public class TIMESTAMPTypes {
-    public static final Class TIMESTAMP_CLASS = TIMESTAMP.class;
-    public static final Class TIMESTAMPLTZ_CLASS = TIMESTAMPLTZ.class;
-    public static final Class TIMESTAMPTZ_CLASS = TIMESTAMPTZ.class;
+    public static final Class<TIMESTAMP> TIMESTAMP_CLASS = TIMESTAMP.class;
+    public static final Class<TIMESTAMPLTZ> TIMESTAMPLTZ_CLASS = TIMESTAMPLTZ.class;
+    public static final Class<TIMESTAMPTZ> TIMESTAMPTZ_CLASS = TIMESTAMPTZ.class;
 }
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/Oracle9Platform.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/Oracle9Platform.java
index b4b1ea9..c74e6fa 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/Oracle9Platform.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/Oracle9Platform.java
@@ -33,6 +33,7 @@
 import java.util.Calendar;
 import java.util.Date;
 import java.util.Hashtable;
+import java.util.List;
 import java.util.Map;
 import java.util.TimeZone;
 import java.util.Vector;
@@ -83,10 +84,10 @@
  */
 public class Oracle9Platform extends Oracle8Platform {
 
-    public static final Class NCHAR = NCharacter.class;
-    public static final Class NSTRING = NString.class;
-    public static final Class NCLOB = NClob.class;
-    public static final Class XMLTYPE = XMLTypePlaceholder.class;
+    public static final Class<NCharacter> NCHAR = NCharacter.class;
+    public static final Class<NString> NSTRING = NString.class;
+    public static final Class<NClob> NCLOB = NClob.class;
+    public static final Class<XMLTypePlaceholder> XMLTYPE = XMLTypePlaceholder.class;
 
     /* Driver version set to connection.getMetaData.getDriverVersion() */
     protected transient String driverVersion;
@@ -131,9 +132,9 @@
      * If driver is not available, this class will not be initialized and will fail fast instead of failing later on
      * when classes from driver are utilized
      */
-    private static final Class ORACLE_SQL_TIMESTAMP    = oracle.sql.TIMESTAMP.class;
-    private static final Class ORACLE_SQL_TIMESTAMPTZ  = oracle.sql.TIMESTAMPTZ.class;
-    private static final Class ORACLE_SQL_TIMESTAMPLTZ = oracle.sql.TIMESTAMPLTZ.class;
+    private static final Class<TIMESTAMP> ORACLE_SQL_TIMESTAMP    = oracle.sql.TIMESTAMP.class;
+    private static final Class<TIMESTAMPTZ> ORACLE_SQL_TIMESTAMPTZ  = oracle.sql.TIMESTAMPTZ.class;
+    private static final Class<TIMESTAMPLTZ> ORACLE_SQL_TIMESTAMPLTZ = oracle.sql.TIMESTAMPLTZ.class;
 
 
     public Oracle9Platform(){
@@ -370,9 +371,10 @@
      * Allow for conversion from the Oracle type to the Java type.
      */
     @Override
-    public Object convertObject(Object sourceObject, Class javaClass) throws ConversionException, DatabaseException {
+    @SuppressWarnings({"unchecked"})
+    public <T> T convertObject(Object sourceObject, Class<T> javaClass) throws ConversionException, DatabaseException {
         if ((javaClass == null) || ((sourceObject != null) && (sourceObject.getClass() == javaClass))) {
-            return sourceObject;
+            return (T) sourceObject;
         }
         if (sourceObject == null) {
             return super.convertObject(sourceObject, javaClass);
@@ -382,16 +384,16 @@
 
         //Used in Type Conversion Mapping on write
         if ((javaClass == TIMESTAMPTypes.TIMESTAMP_CLASS) || (javaClass == TIMESTAMPTypes.TIMESTAMPLTZ_CLASS)) {
-            return sourceObject;
+            return (T) sourceObject;
         }
 
         if (javaClass == TIMESTAMPTypes.TIMESTAMPTZ_CLASS) {
             if (sourceObject instanceof java.util.Date) {
                 Calendar cal = Calendar.getInstance();
                 cal.setTimeInMillis(((java.util.Date)sourceObject).getTime());
-                return cal;
+                return (T) cal;
             } else {
-                return sourceObject;
+                return (T) sourceObject;
             }
         }
 
@@ -399,7 +401,7 @@
             //Don't convert to XMLTypes. This will be done by the
             //XMLTypeBindCallCustomParameter to ensure the correct
             //Connection is used
-            return sourceObject;
+            return (T) sourceObject;
         }
 
         //Added to overcome an issue with the oracle 9.0.1.1.0 JDBC driver.
@@ -414,7 +416,7 @@
             //in TIMESTAMPTZWrapper.  Separate Calendar from any other types.
             if (((javaClass == ClassConstants.CALENDAR) || (javaClass == ClassConstants.GREGORIAN_CALENDAR))) {
                 try {
-                    return TIMESTAMPHelper.buildCalendar((TIMESTAMPTZWrapper)sourceObject);
+                    return (T) TIMESTAMPHelper.buildCalendar((TIMESTAMPTZWrapper)sourceObject);
                 } catch (SQLException exception) {
                     throw DatabaseException.sqlException(exception);
                 }
@@ -428,7 +430,7 @@
             //in TIMESTAMPLTZWrapper.  Separate Calendar from any other types.
             if (((javaClass == ClassConstants.CALENDAR) || (javaClass == ClassConstants.GREGORIAN_CALENDAR))) {
                 try {
-                    return TIMESTAMPHelper.buildCalendar((TIMESTAMPLTZWrapper)sourceObject);
+                    return (T) TIMESTAMPHelper.buildCalendar((TIMESTAMPLTZWrapper)sourceObject);
                 } catch (SQLException exception) {
                     throw DatabaseException.sqlException(exception);
                 }
@@ -719,12 +721,12 @@
         return super.getCustomModifyValueForCall(call, value, field, shouldBind);
     }
 
-    protected Vector buildFromStringCharVec(Class javaClass) {
-        Vector vec = getConversionManager().getDataTypesConvertedFrom(javaClass);
-        vec.addElement(NCHAR);
-        vec.addElement(NSTRING);
+    protected List buildFromStringCharVec(Class javaClass) {
+        List<Class<?>> vec = getConversionManager().getDataTypesConvertedFrom(javaClass);
+        vec.add(NCHAR);
+        vec.add(NSTRING);
         if (javaClass == String.class) {
-            vec.addElement(NCLOB);
+            vec.add(NCLOB);
         }
         return vec;
     }
@@ -737,24 +739,24 @@
      * @return - a vector of classes
      */
     @Override
-    public Vector getDataTypesConvertedFrom(Class javaClass) {
+    public List getDataTypesConvertedFrom(Class javaClass) {
         if (dataTypesConvertedFromAClass == null) {
             dataTypesConvertedFromAClass = new Hashtable(5);
         }
-        Vector dataTypes = (Vector) dataTypesConvertedFromAClass.get(javaClass);
+        List dataTypes = (List) dataTypesConvertedFromAClass.get(javaClass);
         if (dataTypes != null) {
             return dataTypes;
         }
         dataTypes = super.getDataTypesConvertedFrom(javaClass);
         if ((javaClass == String.class) || (javaClass == Character.class)) {
-            dataTypes.addElement(NCHAR);
-            dataTypes.addElement(NSTRING);
+            dataTypes.add(NCHAR);
+            dataTypes.add(NSTRING);
             if (javaClass == String.class) {
-                dataTypes.addElement(NCLOB);
+                dataTypes.add(NCLOB);
             }
         }
         if ((javaClass == char[].class) || (javaClass == Character[].class)) {
-            dataTypes.addElement(NCLOB);
+            dataTypes.add(NCLOB);
         }
         dataTypesConvertedFromAClass.put(javaClass, dataTypes);
         return dataTypes;
@@ -768,11 +770,11 @@
      * @return - a vector of classes
      */
     @Override
-    public Vector getDataTypesConvertedTo(Class javaClass) {
+    public List getDataTypesConvertedTo(Class javaClass) {
         if (dataTypesConvertedToAClass == null) {
             dataTypesConvertedToAClass = new Hashtable(5);
         }
-        Vector dataTypes = (Vector) dataTypesConvertedToAClass.get(javaClass);
+        List dataTypes = (Vector) dataTypesConvertedToAClass.get(javaClass);
         if (dataTypes != null) {
             return dataTypes;
         }
@@ -883,12 +885,12 @@
             String className = "org.eclipse.persistence.internal.platform.database.oracle.xdb.XMLTypeFactoryImpl";
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    Class xmlTypeFactoryClass = AccessController.doPrivileged(new PrivilegedClassForName(className, true, this.getClass().getClassLoader()));
-                    Constructor xmlTypeFactoryConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(xmlTypeFactoryClass, new Class[0], true));
-                    xmlTypeFactory = (XMLTypeFactory)AccessController.doPrivileged(new PrivilegedInvokeConstructor(xmlTypeFactoryConstructor, new Object[0]));
+                    Class<XMLTypeFactory> xmlTypeFactoryClass = AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, this.getClass().getClassLoader()));
+                    Constructor<XMLTypeFactory> xmlTypeFactoryConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(xmlTypeFactoryClass, new Class[0], true));
+                    xmlTypeFactory = AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(xmlTypeFactoryConstructor, new Object[0]));
                 }else{
-                    Class xmlTypeFactoryClass = PrivilegedAccessHelper.getClassForName(className, true, this.getClass().getClassLoader());
-                    Constructor xmlTypeFactoryConstructor = PrivilegedAccessHelper.getConstructorFor(xmlTypeFactoryClass, new Class[0], true);
+                    Class<XMLTypeFactory> xmlTypeFactoryClass = PrivilegedAccessHelper.getClassForName(className, true, this.getClass().getClassLoader());
+                    Constructor<XMLTypeFactory> xmlTypeFactoryConstructor = PrivilegedAccessHelper.getConstructorFor(xmlTypeFactoryClass, new Class[0], true);
                     xmlTypeFactory = (XMLTypeFactory)PrivilegedAccessHelper.invokeConstructor(xmlTypeFactoryConstructor, new Object[0]);
                 }
             } catch (Exception e) {
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/OracleJDBC_10_1_0_2ProxyConnectionCustomizer.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/OracleJDBC_10_1_0_2ProxyConnectionCustomizer.java
index bd217f5..f7b81ce 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/OracleJDBC_10_1_0_2ProxyConnectionCustomizer.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/OracleJDBC_10_1_0_2ProxyConnectionCustomizer.java
@@ -207,7 +207,7 @@
     protected void buildProxyProperties() {
         Object proxyTypeValue = session.getProperty(PersistenceUnitProperties.ORACLE_PROXY_TYPE);
         try {
-            proxyType = (Integer) session.getPlatform().getConversionManager().convertObject(proxyTypeValue, Integer.class);
+            proxyType = session.getPlatform().getConversionManager().convertObject(proxyTypeValue, Integer.class);
         } catch (ConversionException conversionException) {
             throw ValidationException.oracleJDBC10_1_0_2ProxyConnectorRequiresIntProxytype();
         }
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/GridLinkDataPartitioningCallback.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/GridLinkDataPartitioningCallback.java
index 6801d92..b75999e 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/GridLinkDataPartitioningCallback.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/GridLinkDataPartitioningCallback.java
@@ -63,7 +63,7 @@
             return;
         }
         try {
-            Class dataSourceManager = PrivilegedAccessHelper.getClassForName("weblogic.jdbc.common.internal.DataSourceManager");
+            Class<Object> dataSourceManager = PrivilegedAccessHelper.getClassForName("weblogic.jdbc.common.internal.DataSourceManager");
             Method getInstance = PrivilegedAccessHelper.getMethod(dataSourceManager, "getInstance", null, false);
             Object instance = PrivilegedAccessHelper.invokeMethod(getInstance, null, null);
             Method getDataSourceService = PrivilegedAccessHelper.getMethod(instance.getClass(), "getDataSourceService", null, false);
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/tools/profiler/oracle/DMSPerformanceProfiler.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/tools/profiler/oracle/DMSPerformanceProfiler.java
index a47c467..d83de5f 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/tools/profiler/oracle/DMSPerformanceProfiler.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/tools/profiler/oracle/DMSPerformanceProfiler.java
@@ -504,7 +504,7 @@
         getHeavyWeightNouns().put(ConnectionNounType, connectionsNoun);
         //ConnectionsInUse
         if (getSession().isServerSession()) {
-            Iterator enumtr = ((ServerSession)getSession()).getConnectionPools().keySet().iterator();
+            Iterator<String> enumtr = ((ServerSession)getSession()).getConnectionPools().keySet().iterator();
             while (enumtr.hasNext()) {
                 String poolName = (String)enumtr.next();
                 State connectionInUse = State.create(connectionsNoun, ConnectionInUse + "(" + poolName + ")", "", DMSLocalization.buildMessage("connection_in_used"), "not available");
@@ -663,7 +663,7 @@
      */
     protected void destroyNounsByWeight(int weight) {
         if (weight == DMSConsole.NORMAL) {
-            Iterator iterator = getNormalWeightNouns().values().iterator();
+            Iterator<Noun> iterator = getNormalWeightNouns().values().iterator();
             while (iterator.hasNext()) {
                 ((Noun)iterator.next()).destroy();
             }
@@ -671,7 +671,7 @@
             getNormalWeightSensors().clear();
         }
         if (weight == DMSConsole.HEAVY) {
-            Iterator iterator = getHeavyWeightNouns().values().iterator();
+            Iterator<Noun> iterator = getHeavyWeightNouns().values().iterator();
             while (iterator.hasNext()) {
                 ((Noun)iterator.next()).destroy();
             }
@@ -681,7 +681,7 @@
             getHeavyWeightSensors().clear();
         }
         if (weight == DMSConsole.ALL) {
-            Iterator iterator = getAllWeightNouns().values().iterator();
+            Iterator<Noun> iterator = getAllWeightNouns().values().iterator();
             while (iterator.hasNext()) {
                 ((Noun)iterator.next()).destroy();
             }
diff --git a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/conversion/TestJavaTimeTypeConverter.java b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/conversion/TestJavaTimeTypeConverter.java
index b99565a..97be47b 100644
--- a/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/conversion/TestJavaTimeTypeConverter.java
+++ b/jpa/eclipselink.jpa.test.jse/src/it/java/org/eclipse/persistence/jpa/test/conversion/TestJavaTimeTypeConverter.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2020, 2021 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2020 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -46,7 +46,7 @@
     @Test
     public void timeConvertLocalDateToLocalDate() {
         LocalDate src = LocalDate.of(2020, 1, 1);
-        LocalDate ld = (LocalDate) cm.convertObject(src, ClassConstants.TIME_LDATE);
+        LocalDate ld = cm.convertObject(src, ClassConstants.TIME_LDATE);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(src, ld);
@@ -60,7 +60,7 @@
         Calendar cal = Calendar.getInstance();
         cal.set(2020, 0, 1, 0, 0, 0);
         
-        LocalDate ld = (LocalDate) cm.convertObject(cal, ClassConstants.TIME_LDATE);
+        LocalDate ld = cm.convertObject(cal, ClassConstants.TIME_LDATE);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(Month.JANUARY, ld.getMonth());
@@ -76,7 +76,7 @@
         Assert.assertEquals(0, date.getMonth());
         Assert.assertEquals(2, date.getDate());
 
-        LocalDate ld = (LocalDate) cm.convertObject(date, ClassConstants.TIME_LDATE);
+        LocalDate ld = cm.convertObject(date, ClassConstants.TIME_LDATE);
         ZonedDateTime check = ZonedDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault());
 
         Assert.assertNotNull(ld);
@@ -92,7 +92,7 @@
     public void timeConvertSqlDateToLocalDate() {
         java.sql.Date date = java.sql.Date.valueOf("2020-01-01"); 
         
-        LocalDate ld = (LocalDate) cm.convertObject(date, ClassConstants.TIME_LDATE);
+        LocalDate ld = cm.convertObject(date, ClassConstants.TIME_LDATE);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(Month.JANUARY, ld.getMonth());
@@ -104,7 +104,7 @@
     public void timeConvertSqlTimestampToLocalDate() {
         java.sql.Timestamp ts = java.sql.Timestamp.valueOf("2020-01-01 01:00:00");
         
-        LocalDate ld = (LocalDate) cm.convertObject(ts, ClassConstants.TIME_LDATE);
+        LocalDate ld = cm.convertObject(ts, ClassConstants.TIME_LDATE);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(Month.JANUARY, ld.getMonth());
@@ -115,7 +115,7 @@
     @Test
     public void timeConvertStringToLocalDate() {
         String date = "2020-01-01T1:15:30";
-        LocalDate ld = (LocalDate) cm.convertObject(date, ClassConstants.TIME_LDATE);
+        LocalDate ld = cm.convertObject(date, ClassConstants.TIME_LDATE);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(Month.JANUARY, ld.getMonth());
@@ -126,7 +126,7 @@
     @Test
     public void timeConvertLongToLocalDate() {
         long l = 18262; // 2020-01-01
-        LocalDate ld = (LocalDate) cm.convertObject(l, ClassConstants.TIME_LDATE);
+        LocalDate ld = cm.convertObject(l, ClassConstants.TIME_LDATE);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(Month.JANUARY, ld.getMonth());
@@ -151,7 +151,7 @@
     @Test
     public void timeConvertLocalDateTimeToLocalDateTime() {
         LocalDateTime src = LocalDateTime.of(2020, 1, 1, 1, 0, 0);
-        LocalDateTime ld = (LocalDateTime) cm.convertObject(src, ClassConstants.TIME_LDATETIME);
+        LocalDateTime ld = cm.convertObject(src, ClassConstants.TIME_LDATETIME);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(src, ld);
@@ -166,7 +166,7 @@
     @Test
     public void timeConvertStringToLocalDateTime() {
         String date = "2020-01-01T1:15:30";
-        LocalDateTime ld = (LocalDateTime) cm.convertObject(date, ClassConstants.TIME_LDATETIME);
+        LocalDateTime ld = cm.convertObject(date, ClassConstants.TIME_LDATETIME);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(Month.JANUARY, ld.getMonth());
@@ -186,7 +186,7 @@
         cal.set(2020, 0, 1, 2, 15, 30);
         date = cal.getTime();
                
-        ldt = (LocalDateTime) cm.convertObject(date, ClassConstants.TIME_LDATETIME);
+        ldt = cm.convertObject(date, ClassConstants.TIME_LDATETIME);
         
         Assert.assertNotNull(ldt);
         Assert.assertEquals(Month.JANUARY, ldt.getMonth());
@@ -202,7 +202,7 @@
         Calendar cal = Calendar.getInstance();
         cal.set(2020, 0, 1, 2, 15, 30);
         
-        LocalDateTime ldt = (LocalDateTime) cm.convertObject(cal, ClassConstants.TIME_LDATETIME);
+        LocalDateTime ldt = cm.convertObject(cal, ClassConstants.TIME_LDATETIME);
         
         Assert.assertNotNull(ldt);
         Assert.assertEquals(Month.JANUARY, ldt.getMonth());
@@ -216,7 +216,7 @@
     @Test
     public void timeConvertLongToLocalDateTime() {
         long l = 18262 * (60 * 60 * 24); // 2020-01-01      
-        LocalDateTime ldt = (LocalDateTime) cm.convertObject(l, ClassConstants.TIME_LDATETIME);
+        LocalDateTime ldt = cm.convertObject(l, ClassConstants.TIME_LDATETIME);
         
         Assert.assertNotNull(ldt);
         Assert.assertEquals(Month.JANUARY, ldt.getMonth());
@@ -240,7 +240,7 @@
     @Test
     public void timeConvertLocalTimeToLocalTime() {
         LocalTime src = LocalTime.of(1, 15, 30);
-        LocalTime ld = (LocalTime) cm.convertObject(src, ClassConstants.TIME_LTIME);
+        LocalTime ld = cm.convertObject(src, ClassConstants.TIME_LTIME);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(src, ld);
@@ -252,7 +252,7 @@
     @Test
     public void timeConvertStringToLocalTime() {
         String date = "T1:15:30";
-        LocalTime ld = (LocalTime) cm.convertObject(date, ClassConstants.TIME_LTIME);
+        LocalTime ld = cm.convertObject(date, ClassConstants.TIME_LTIME);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(1, ld.getHour());
@@ -264,7 +264,7 @@
     public void timeConvertTimestampToLocalTime() {
         java.sql.Timestamp ts = java.sql.Timestamp.valueOf("2020-01-01 01:15:30");
         
-        LocalTime ld = (LocalTime) cm.convertObject(ts, ClassConstants.TIME_LTIME);
+        LocalTime ld = cm.convertObject(ts, ClassConstants.TIME_LTIME);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(1, ld.getHour());
@@ -276,7 +276,7 @@
     public void timeConvertTimeToLocalTime() {
         java.sql.Time ts = java.sql.Time.valueOf("01:15:30");
         
-        LocalTime ld = (LocalTime) cm.convertObject(ts, ClassConstants.TIME_LTIME);
+        LocalTime ld = cm.convertObject(ts, ClassConstants.TIME_LTIME);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(1, ld.getHour());
@@ -293,7 +293,7 @@
         cal.set(2020, 0, 1, 2, 15, 30);
         date = cal.getTime();
                
-        ld = (LocalTime) cm.convertObject(date, ClassConstants.TIME_LTIME);
+        ld = cm.convertObject(date, ClassConstants.TIME_LTIME);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(2, ld.getHour());
@@ -304,7 +304,7 @@
     @Test
     public void convertLongToLocalTime() {
         long sod = 60*60 + 60*15 + 30;
-        LocalTime ld = (LocalTime) cm.convertObject(sod, ClassConstants.TIME_LTIME);
+        LocalTime ld = cm.convertObject(sod, ClassConstants.TIME_LTIME);
         
         Assert.assertNotNull(ld);
         Assert.assertEquals(1, ld.getHour());
@@ -331,7 +331,7 @@
         Calendar cal = Calendar.getInstance();
         cal.set(2020, 0, 1, 0, 0, 0);
         
-        OffsetDateTime odt = (OffsetDateTime) cm.convertObject(cal, ClassConstants.TIME_ODATETIME);
+        OffsetDateTime odt = cm.convertObject(cal, ClassConstants.TIME_ODATETIME);
         
         Assert.assertNotNull(odt);
         Assert.assertEquals(Month.JANUARY, odt.getMonth());
@@ -348,7 +348,7 @@
         cal.set(2020, 0, 1, 0, 0, 0);
         date = cal.getTime();
                
-        odt = (OffsetDateTime) cm.convertObject(date, ClassConstants.TIME_ODATETIME);
+        odt = cm.convertObject(date, ClassConstants.TIME_ODATETIME);
         
         Assert.assertNotNull(odt);
         Assert.assertEquals(Month.JANUARY, odt.getMonth());
@@ -361,7 +361,7 @@
         String date = "2020-01-01T1:15:30";
         OffsetDateTime odt = null;
                
-        odt = (OffsetDateTime) cm.convertObject(date, ClassConstants.TIME_ODATETIME);
+        odt = cm.convertObject(date, ClassConstants.TIME_ODATETIME);
         
         Assert.assertNotNull(odt);
         Assert.assertEquals(Month.JANUARY, odt.getMonth());
@@ -377,7 +377,7 @@
         OffsetDateTime original = OffsetDateTime.of(2020, 1, 1, 1, 15, 30, 0, ZoneOffset.UTC);
         OffsetDateTime odt = null;
                
-        odt = (OffsetDateTime) cm.convertObject(original, ClassConstants.TIME_ODATETIME);
+        odt = cm.convertObject(original, ClassConstants.TIME_ODATETIME);
         
         Assert.assertNotNull(odt);
         Assert.assertSame(original,  odt);
@@ -408,7 +408,7 @@
         OffsetTime original = OffsetTime.of(1, 15, 30, 0, ZoneOffset.UTC);
         OffsetTime odt = null;
                
-        odt = (OffsetTime) cm.convertObject(original, ClassConstants.TIME_OTIME);
+        odt = cm.convertObject(original, ClassConstants.TIME_OTIME);
         
         Assert.assertNotNull(odt);
         Assert.assertSame(original,  odt);
@@ -422,7 +422,7 @@
         String date = "T1:15:30";
         OffsetTime odt = null;
                
-        odt = (OffsetTime) cm.convertObject(date, ClassConstants.TIME_OTIME);
+        odt = cm.convertObject(date, ClassConstants.TIME_OTIME);
         
         Assert.assertNotNull(odt);
         Assert.assertEquals(1, odt.getHour());
@@ -439,7 +439,7 @@
         cal.set(2020, 0, 1, 1, 15, 30);
         date = cal.getTime();
                
-        odt = (OffsetTime) cm.convertObject(date, ClassConstants.TIME_OTIME);
+        odt = cm.convertObject(date, ClassConstants.TIME_OTIME);
         
         Assert.assertNotNull(odt);
         Assert.assertEquals(1, odt.getHour());
@@ -452,7 +452,7 @@
         Calendar cal = Calendar.getInstance();
         cal.set(2020, 0, 1, 1, 15, 30);
         
-        OffsetTime odt = (OffsetTime) cm.convertObject(cal, ClassConstants.TIME_OTIME);
+        OffsetTime odt = cm.convertObject(cal, ClassConstants.TIME_OTIME);
         
         Assert.assertNotNull(odt);
         Assert.assertEquals(1, odt.getHour());
@@ -463,7 +463,7 @@
     @Test
     public void testConvertLongToOffsetTime() {
         long l = 18262 * (60 * 60 * 24) + (60*60 + 60*15 + 30); // 2020-01-01  T01:15:30     
-        OffsetTime ldt = (OffsetTime) cm.convertObject(l, ClassConstants.TIME_OTIME);
+        OffsetTime ldt = cm.convertObject(l, ClassConstants.TIME_OTIME);
         
         Assert.assertNotNull(ldt);
         Assert.assertEquals(1, ldt.getHour());
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/AdvancedReadTransformer.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/AdvancedReadTransformer.java
index dc7c433..afbf642 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/AdvancedReadTransformer.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/AdvancedReadTransformer.java
@@ -48,8 +48,8 @@
         if(attributeName.equals("overtimeHours")) {
             Time[] hours = new Time[2];
             /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-            hours[0] = (Time) session.getDatasourcePlatform().convertObject(record.get("START_OVERTIME"), java.sql.Time.class);
-            hours[1] = (Time) session.getDatasourcePlatform().convertObject(record.get("END_OVERTIME"), java.sql.Time.class);
+            hours[0] = session.getDatasourcePlatform().convertObject(record.get("START_OVERTIME"), Time.class);
+            hours[1] = session.getDatasourcePlatform().convertObject(record.get("END_OVERTIME"), Time.class);
             return hours;
         } else {
             throw new RuntimeException("Unknown attribute");
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Door.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Door.java
index f113d3a..ef209cc 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Door.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Door.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -115,7 +115,7 @@
     }
 
     public Date calcWarrantyDate(Record row, Session session) {
-        Date date = (Date) ( session.getDatasourcePlatform().convertObject(row.get("SALE_DATE"), java.sql.Date.class ));
+        Date date = session.getDatasourcePlatform().convertObject(row.get("SALE_DATE"), Date.class );
         Calendar cal = Calendar.getInstance();
         cal.setTime(date);
         int day = cal.get(Calendar.DAY_OF_MONTH);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Employee.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Employee.java
index d34ec58..7c16bec 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Employee.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Employee.java
@@ -395,8 +395,8 @@
         Time[] hours = new Time[2];
 
         /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-        hours[0] = (Time) session.getDatasourcePlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
-        hours[1] = (Time) session.getDatasourcePlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
+        hours[0] = session.getDatasourcePlatform().convertObject(row.get("START_TIME"), Time.class);
+        hours[1] = session.getDatasourcePlatform().convertObject(row.get("END_TIME"), Time.class);
         return hours;
     }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/composite/advanced/member_2/AdvancedReadTransformer.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/composite/advanced/member_2/AdvancedReadTransformer.java
index 86847ba..b618d0e 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/composite/advanced/member_2/AdvancedReadTransformer.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/composite/advanced/member_2/AdvancedReadTransformer.java
@@ -48,8 +48,8 @@
         if(attributeName.equals("overtimeHours")) {
             Time[] hours = new Time[2];
             /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-            hours[0] = (Time) session.getDatasourcePlatform().convertObject(record.get("START_OVERTIME"), java.sql.Time.class);
-            hours[1] = (Time) session.getDatasourcePlatform().convertObject(record.get("END_OVERTIME"), java.sql.Time.class);
+            hours[0] = session.getDatasourcePlatform().convertObject(record.get("START_OVERTIME"), Time.class);
+            hours[1] = session.getDatasourcePlatform().convertObject(record.get("END_OVERTIME"), Time.class);
             return hours;
         } else {
             throw new RuntimeException("Unknown attribute");
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/composite/advanced/member_2/Employee.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/composite/advanced/member_2/Employee.java
index 2d80428..d58ec17 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/composite/advanced/member_2/Employee.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/composite/advanced/member_2/Employee.java
@@ -317,8 +317,8 @@
         Time[] hours = new Time[2];
 
         /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-        hours[0] = (Time) session.getDatasourcePlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
-        hours[1] = (Time) session.getDatasourcePlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
+        hours[0] = session.getDatasourcePlatform().convertObject(row.get("START_TIME"), Time.class);
+        hours[1] = session.getDatasourcePlatform().convertObject(row.get("END_TIME"), Time.class);
         return hours;
     }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/datetime/DateTimePopulator.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/datetime/DateTimePopulator.java
index 4425892..e1126ba 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/datetime/DateTimePopulator.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/datetime/DateTimePopulator.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
@@ -50,10 +50,10 @@
             try {
                 Class clazz = PrivilegedAccessHelper.getClassForName("org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
                 Method getDriverVersionMethod = PrivilegedAccessHelper.getMethod(clazz, "getDriverVersion", null, false);
-                String driverVersion = (String) PrivilegedAccessHelper.invokeMethod(getDriverVersionMethod, session.getPlatform(), null);
+                String driverVersion = PrivilegedAccessHelper.invokeMethod(getDriverVersionMethod, session.getPlatform(), null);
                 if (Helper.compareVersions(driverVersion, "12.1") >= 0) {
                     Method shouldTruncateDateMethod = PrivilegedAccessHelper.getMethod(clazz, "shouldTruncateDate", null, false);
-                    boolean shouldTruncateDate = (Boolean) PrivilegedAccessHelper.invokeMethod(shouldTruncateDateMethod, session.getPlatform(), null);
+                    boolean shouldTruncateDate = PrivilegedAccessHelper.invokeMethod(shouldTruncateDateMethod, session.getPlatform(), null);
                     if (!shouldTruncateDate) {
                         Method setShouldTruncateDateMethod = PrivilegedAccessHelper.getMethod(clazz, "setShouldTruncateDate", new Class[]{boolean.class}, false);
                         PrivilegedAccessHelper.invokeMethod(setShouldTruncateDateMethod, session.getPlatform(), new Object[]{true});
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/advanced/AdvancedReadTransformer.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/advanced/AdvancedReadTransformer.java
index c0c20fb..6561699 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/advanced/AdvancedReadTransformer.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/advanced/AdvancedReadTransformer.java
@@ -48,8 +48,8 @@
         if(attributeName.equals("overtimeHours")) {
             Time[] hours = new Time[2];
             /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-            hours[0] = (Time) session.getDatasourcePlatform().convertObject(record.get("START_OVERTIME"), java.sql.Time.class);
-            hours[1] = (Time) session.getDatasourcePlatform().convertObject(record.get("END_OVERTIME"), java.sql.Time.class);
+            hours[0] = session.getDatasourcePlatform().convertObject(record.get("START_OVERTIME"), Time.class);
+            hours[1] = session.getDatasourcePlatform().convertObject(record.get("END_OVERTIME"), Time.class);
             return hours;
         } else {
             throw new RuntimeException("Unknown attribute");
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/advanced/Employee.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/advanced/Employee.java
index 718535b..851c32c 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/advanced/Employee.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/advanced/Employee.java
@@ -187,8 +187,8 @@
         Time[] hours = new Time[2];
 
         /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-        hours[0] = (Time) session.getDatasourcePlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
-        hours[1] = (Time) session.getDatasourcePlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
+        hours[0] = session.getDatasourcePlatform().convertObject(row.get("START_TIME"), Time.class);
+        hours[1] = session.getDatasourcePlatform().convertObject(row.get("END_TIME"), Time.class);
         return hours;
     }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/composite/advanced/member_2/AdvancedReadTransformer.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/composite/advanced/member_2/AdvancedReadTransformer.java
index 6ffef40..0b92ccc 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/composite/advanced/member_2/AdvancedReadTransformer.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/composite/advanced/member_2/AdvancedReadTransformer.java
@@ -48,8 +48,8 @@
         if(attributeName.equals("overtimeHours")) {
             Time[] hours = new Time[2];
             /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-            hours[0] = (Time) session.getDatasourcePlatform().convertObject(record.get("START_OVERTIME"), java.sql.Time.class);
-            hours[1] = (Time) session.getDatasourcePlatform().convertObject(record.get("END_OVERTIME"), java.sql.Time.class);
+            hours[0] = session.getDatasourcePlatform().convertObject(record.get("START_OVERTIME"), Time.class);
+            hours[1] = session.getDatasourcePlatform().convertObject(record.get("END_OVERTIME"), Time.class);
             return hours;
         } else {
             throw new RuntimeException("Unknown attribute");
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/composite/advanced/member_2/Employee.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/composite/advanced/member_2/Employee.java
index 964b572..2c7cbf3 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/composite/advanced/member_2/Employee.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/composite/advanced/member_2/Employee.java
@@ -189,8 +189,8 @@
         Time[] hours = new Time[2];
 
         /** This conversion allows for the database type not to match, i.e. may be a Timestamp or String. */
-        hours[0] = (Time) session.getDatasourcePlatform().convertObject(row.get("START_TIME"), java.sql.Time.class);
-        hours[1] = (Time) session.getDatasourcePlatform().convertObject(row.get("END_TIME"), java.sql.Time.class);
+        hours[0] = session.getDatasourcePlatform().convertObject(row.get("START_TIME"), Time.class);
+        hours[1] = session.getDatasourcePlatform().convertObject(row.get("END_TIME"), Time.class);
         return hours;
     }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/AdvancedJPAJunitTest.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/AdvancedJPAJunitTest.java
index 7bb0893..cd532ff 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/AdvancedJPAJunitTest.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/AdvancedJPAJunitTest.java
@@ -3864,7 +3864,7 @@
         Vector pk = new Vector(1);
         pk.add(dealer.getId());
 
-        return (Integer) getServerSession().getDescriptor(Dealer.class).getOptimisticLockingPolicy().getWriteLockValue(dealer, pk, getServerSession());
+        return getServerSession().getDescriptor(Dealer.class).getOptimisticLockingPolicy().getWriteLockValue(dealer, pk, getServerSession());
     }
 
     protected List<Employee> createEmployeesWithUnidirectionalMappings(String lastName) {
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/CallbackEventJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/CallbackEventJUnitTestSuite.java
index ed049c4..4bbbb51 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/CallbackEventJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/CallbackEventJUnitTestSuite.java
@@ -257,7 +257,7 @@
     protected int getVersion(Employee emp) {
         Vector pk = new Vector();
         pk.add(emp.getId());
-        return (Integer) getServerSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(emp, pk, getServerSession());
+        return getServerSession().getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(emp, pk, getServerSession());
     }
 
     // gf 2894:  merge does not trigger prePersist callbacks
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/CallbackEventJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/CallbackEventJUnitTestSuite.java
index 58046b5..db1886b 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/CallbackEventJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/CallbackEventJUnitTestSuite.java
@@ -256,7 +256,7 @@
     protected int getVersion(Employee emp) {
         Vector pk = new Vector();
         pk.add(emp.getId());
-        return (Integer) getServerSession("fieldaccess").getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(emp, pk, getServerSession("fieldaccess"));
+        return getServerSession("fieldaccess").getDescriptor(Employee.class).getOptimisticLockingPolicy().getWriteLockValue(emp, pk, getServerSession("fieldaccess"));
     }
 
 }
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLComplexTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLComplexTestSuite.java
index f2dad78..ceb449a 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLComplexTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLComplexTestSuite.java
@@ -785,8 +785,8 @@
         Employee emp1 = (Employee) expectedResult.elementAt(0);
         Employee emp2 = (Employee) expectedResult.elementAt(1);
 
-        double salarySquareRoot1 = Math.sqrt(((double) emp1.getSalary()));
-        double salarySquareRoot2 = Math.sqrt(((double) emp2.getSalary()));
+        double salarySquareRoot1 = Math.sqrt(emp1.getSalary());
+        double salarySquareRoot2 = Math.sqrt(emp2.getSalary());
 
         String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
         ejbqlString = ejbqlString + salarySquareRoot1;
@@ -824,8 +824,8 @@
         Employee emp1 = (Employee) expectedResult.elementAt(0);
         Employee emp2 = (Employee) expectedResult.elementAt(1);
 
-        double salarySquareRoot1 = Math.sqrt(((double) emp1.getSalary()));
-        double salarySquareRoot2 = Math.sqrt(((double) emp2.getSalary()));
+        double salarySquareRoot1 = Math.sqrt(emp1.getSalary());
+        double salarySquareRoot2 = Math.sqrt(emp2.getSalary());
 
         String ejbqlString = "SELECT OBJECT(emp) FROM Employee emp WHERE ";
         ejbqlString = ejbqlString + "(SQRT(emp.salary) = ";
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLSimpleTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLSimpleTestSuite.java
index 7f11462..ce247a4 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLSimpleTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLSimpleTestSuite.java
@@ -1370,7 +1370,7 @@
 
         Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
 
-        double salarySquareRoot = Math.sqrt(((double) ((Employee) expectedResult.firstElement()).getSalary()));
+        double salarySquareRoot = Math.sqrt(((Employee) expectedResult.firstElement()).getSalary());
 
         clearCache();
 
@@ -1423,7 +1423,7 @@
 
         Vector expectedResult = (Vector)getServerSession().executeQuery(raq);
 
-        double salarySquareRoot = Math.sqrt(((double) ((Employee) expectedResult.firstElement()).getSalary()));
+        double salarySquareRoot = Math.sqrt(((Employee) expectedResult.firstElement()).getSalary());
 
         clearCache();
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsAdvancedJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsAdvancedJUnitTestCase.java
index 365a547..c64e259 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsAdvancedJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsAdvancedJUnitTestCase.java
@@ -1717,9 +1717,9 @@
         pk.add(dealer.getId());
 
         if (isOnServer()) {
-            return (Integer) getServerSession().getDescriptor(Dealer.class).getOptimisticLockingPolicy().getWriteLockValue(dealer, pk, getServerSession());
+            return getServerSession().getDescriptor(Dealer.class).getOptimisticLockingPolicy().getWriteLockValue(dealer, pk, getServerSession());
         } else {
-            return (Integer) ((EntityManagerImpl) em).getServerSession().getDescriptor(Dealer.class).getOptimisticLockingPolicy().getWriteLockValue(dealer, pk, ((EntityManagerImpl) em).getServerSession());
+            return ((EntityManagerImpl) em).getServerSession().getDescriptor(Dealer.class).getOptimisticLockingPolicy().getWriteLockValue(dealer, pk, ((EntityManagerImpl) em).getServerSession());
         }
     }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/composite/advanced/EntityMappingsAdvancedJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/composite/advanced/EntityMappingsAdvancedJUnitTestCase.java
index 8f0088b..288d4ea 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/composite/advanced/EntityMappingsAdvancedJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/composite/advanced/EntityMappingsAdvancedJUnitTestCase.java
@@ -1732,7 +1732,7 @@
         pk.add(dealer.getId());
 
         DatabaseSessionImpl session = getDatabaseSession();
-        return (Integer) session.getDescriptor(Dealer.class).getOptimisticLockingPolicy().getWriteLockValue(dealer, pk, session);
+        return session.getDescriptor(Dealer.class).getOptimisticLockingPolicy().getWriteLockValue(dealer, pk, session);
     }
 
     protected List<Employee> createEmployeesWithUnidirectionalMappings(String lastName) {
diff --git a/jpa/org.eclipse.persistence.jpa.jpql/src/test/java/org/eclipse/persistence/jpa/tests/jpql/tools/ContentAssistTest.java b/jpa/org.eclipse.persistence.jpa.jpql/src/test/java/org/eclipse/persistence/jpa/tests/jpql/tools/ContentAssistTest.java
index 4287b15..279ebfd 100644
--- a/jpa/org.eclipse.persistence.jpa.jpql/src/test/java/org/eclipse/persistence/jpa/tests/jpql/tools/ContentAssistTest.java
+++ b/jpa/org.eclipse.persistence.jpa.jpql/src/test/java/org/eclipse/persistence/jpa/tests/jpql/tools/ContentAssistTest.java
@@ -173,7 +173,7 @@
         List<String> proposalsNotRemoved = new ArrayList<>();
         CollectionTools.addAll(proposalsNotRemoved, expectedProposals);
 
-        return new List[] { proposalsNotRemoved, unexpectedProposals };
+        return (List<String>[]) new List[] { proposalsNotRemoved, unexpectedProposals };
     }
 
     protected List<String> classNames() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/CMP3Policy.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/CMP3Policy.java
index 2c71f83..a7034d2 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/CMP3Policy.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/CMP3Policy.java
@@ -144,7 +144,7 @@
                 Class aPKClass = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        aPKClass = AccessController.doPrivileged(new PrivilegedClassForName(getPKClassName(), true, classLoader));
+                        aPKClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getPKClassName(), true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw new IllegalArgumentException(ExceptionLocalization.buildMessage("pk_class_not_found", new Object[] {this.pkClassName}), exception.getException());
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EJBQueryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EJBQueryImpl.java
index 10f1edc..b85637d 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EJBQueryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EJBQueryImpl.java
@@ -323,7 +323,7 @@
                     throw QueryException.invalidContainerClass(containerClass, ClassConstants.Collection_Class);
                 }
             } else if (query.isReadObjectQuery()) {
-                List resultList = new ArrayList();
+                List resultList = new ArrayList<>();
                 Object result = executeReadQuery();
                 if (result != null) {
                     resultList.add(executeReadQuery());
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityGraphImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityGraphImpl.java
index d039f6d..fc58f4e 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityGraphImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityGraphImpl.java
@@ -27,6 +27,7 @@
 import jakarta.persistence.metamodel.PluralAttribute;
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.internal.localization.ExceptionLocalization;
 import org.eclipse.persistence.internal.queries.AttributeItem;
@@ -63,7 +64,7 @@
         this.attributeGroup = group;
         this.classType = group.getType();
         if (this.classType == null){
-            this.classType = ClassConstants.Object_Class;
+            this.classType = (Class<X>) CoreClassConstants.OBJECT;
         }
     }
 
@@ -115,7 +116,7 @@
 
     @Override
     public <T> Subgraph<T> addSubgraph(Attribute<X, T> attribute) {
-        Class type = attribute.getJavaType();
+        Class<T> type = attribute.getJavaType();
         if (attribute.isCollection()) {
             type = ((PluralAttribute) attribute).getBindableJavaType();
         }
@@ -172,7 +173,7 @@
         if (!this.isMutable) {
             throw new IllegalStateException("immutable_entitygraph");
         }
-        Class type = attribute.getJavaType();
+        Class<T> type = attribute.getJavaType();
         if (attribute.isCollection()) {
             type = ((PluralAttribute) attribute).getBindableJavaType();
         }
@@ -285,10 +286,10 @@
                 for (AttributeGroup subGroup : item.getGroups().values()) {
                     Class type = subGroup.getType();
                     if (type == null) {
-                        type = ClassConstants.Object_Class;
+                        type = CoreClassConstants.OBJECT;
                     }
                     if (localDescriptor != null) {
-                        if (!type.equals(ClassConstants.Object_Class) && localDescriptor.hasInheritance()) {
+                        if (!type.equals(CoreClassConstants.OBJECT) && localDescriptor.hasInheritance()) {
                             localDescriptor = localDescriptor.getInheritancePolicy().getDescriptor(type);
                         }
                         node.addSubgraph(new EntityGraphImpl(subGroup, localDescriptor));
@@ -302,10 +303,10 @@
                 for (AttributeGroup subGroup : item.getKeyGroups().values()) {
                     Class type = subGroup.getType();
                     if (type == null) {
-                        type = ClassConstants.Object_Class;
+                        type = CoreClassConstants.OBJECT;
                     }
                     if (localDescriptor != null) {
-                        if (!type.equals(ClassConstants.Object_Class) && localDescriptor.hasInheritance()) {
+                        if (!type.equals(CoreClassConstants.OBJECT) && localDescriptor.hasInheritance()) {
                             localDescriptor = localDescriptor.getInheritancePolicy().getDescriptor(type);
                         }
                         node.addKeySubgraph(new EntityGraphImpl(subGroup, localDescriptor));
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryImpl.java
index 8805627..65b39c2 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryImpl.java
@@ -224,8 +224,8 @@
             throw PersistenceUnitLoadingException.cannotRefreshEntityManagerFactoryCreatedFromSession(delegate.getServerSession().getName());
         }
         String sessionName = setupImpl.getSessionName();
-        Map existingProperties = delegate.getProperties();
-        Map deployProperties = new HashMap();
+        Map<String, Object> existingProperties = delegate.getProperties();
+        Map<String, Object> deployProperties = new HashMap<>();
         deployProperties.putAll(existingProperties);
         if (properties != null){
             deployProperties.putAll(properties);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryProvider.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryProvider.java
index f0f3b35..49aee1f 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryProvider.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryProvider.java
@@ -278,8 +278,8 @@
      * @param source
      * @return the target object
      */
-    public static Map mergeMaps(Map target, Map source){
-        Map map = new HashMap();
+    public static <K, V> Map<K, V> mergeMaps(Map<K, V> target, Map<K, V> source){
+        Map<K, V> map = new HashMap<>();
         if (source != null){
             map.putAll(source);
         }
@@ -296,11 +296,11 @@
      * @param keysToBeRemoved
      * @return the target object
      */
-    public static Map removeSpecifiedProperties(Map source, Collection keysToBeRemoved){
-        Map target = new HashMap();
+    public static <K, V> Map<K, V> removeSpecifiedProperties(Map<K, V> source, Collection<K> keysToBeRemoved){
+        Map<K, V> target = new HashMap<>();
         if (source != null){
             target.putAll(source);
-            Iterator it = keysToBeRemoved.iterator();
+            Iterator<K> it = keysToBeRemoved.iterator();
             while(it.hasNext()) {
                 target.remove(it.next());
             }
@@ -314,13 +314,13 @@
      * @param keysToBeKept
      * @return the target object
      */
-    public static Map keepSpecifiedProperties(Map source, Collection keysToBeKept){
-        Map target = new HashMap();
+    public static <K, V> Map<K, V> keepSpecifiedProperties(Map<K, V> source, Collection<K> keysToBeKept){
+        Map target = new HashMap<>();
         if (source != null){
             target.putAll(source);
-            Iterator<Map.Entry> it = source.entrySet().iterator();
+            Iterator<Map.Entry<K, V>> it = source.entrySet().iterator();
             while(it.hasNext()) {
-                Map.Entry entry = it.next();
+                Map.Entry<K, V> entry = it.next();
                 if(keysToBeKept.contains(entry.getKey())) {
                     target.put(entry.getKey(), entry.getValue());
                 }
@@ -337,14 +337,14 @@
      * @param keysToBeKept
      * @return the target object
      */
-    public static Map[] splitSpecifiedProperties(Map source, Collection keysToBeKept){
-        HashMap in = new HashMap();
-        HashMap out = new HashMap();
+    public static <K, V> Map<K, V>[] splitSpecifiedProperties(Map<K, V> source, Collection<K> keysToBeKept){
+        HashMap<K, V> in = new HashMap<>();
+        HashMap<K, V> out = new HashMap<>();
         Map[] target = new Map[]{in, out};
         if (source != null){
-            Iterator<Map.Entry> it = source.entrySet().iterator();
+            Iterator<Map.Entry<K, V>> it = source.entrySet().iterator();
             while(it.hasNext()) {
-                Map.Entry entry = it.next();
+                Map.Entry<K, V> entry = it.next();
                 if(keysToBeKept.contains(entry.getKey())) {
                     in.put(entry.getKey(), entry.getValue());
                 } else {
@@ -366,15 +366,16 @@
      * @param keys is array of Maps of size n
      * @return the target object is array of Maps of size n+1
      */
-    public static Map[] splitProperties(Map source, Collection[] keys){
-        Map[] target = new Map[keys.length + 1];
+    public static <K, V> Map<K, V>[] splitProperties(Map<K, V> source, Collection<K>[] keys){
+        @SuppressWarnings({"unchecked"})
+        Map<K, V>[] target = (Map<K, V>[]) new Map[keys.length + 1];
         for (int i=0; i <= keys.length; i++) {
-            target[i] = new HashMap();
+            target[i] = new HashMap<>();
         }
         if (source != null){
-            Iterator<Map.Entry> it = source.entrySet().iterator();
+            Iterator<Map.Entry<K, V>> it = source.entrySet().iterator();
             while(it.hasNext()) {
-                Map.Entry entry = it.next();
+                Map.Entry<K, V> entry = it.next();
                 boolean isFound = false;
                 for (int i=0; i < keys.length && !isFound; i++) {
                     if (keys[i].contains(entry.getKey())) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerImpl.java
index 3edbb51..b572ab7 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerImpl.java
@@ -186,7 +186,7 @@
     protected boolean beginEarlyTransaction;
 
     /** Local properties passed from createEntityManager. */
-    protected Map properties;
+    protected Map<String, Object> properties;
 
     /** Flush mode property, allows flush before query to be avoided. */
     protected FlushModeType flushMode;
@@ -518,7 +518,7 @@
         // bug 236249: In JPA session.setProperty() throws
         // UnsupportedOperationException.
         if (properties != null) {
-            this.properties = new HashMap(properties);
+            this.properties = new HashMap<>(properties);
             if(!properties.isEmpty()) {
                 processProperties();
             }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java
index 8511b47..48c2c0b 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerSetupImpl.java
@@ -224,6 +224,7 @@
 import org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor;
 import org.eclipse.persistence.internal.jpa.metadata.MetadataProject;
 import org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataAsmFactory;
+import org.eclipse.persistence.internal.jpa.metadata.accessors.objects.MetadataClass;
 import org.eclipse.persistence.internal.jpa.metadata.xml.XMLEntityMappingsReader;
 import org.eclipse.persistence.internal.jpa.metamodel.ManagedTypeImpl;
 import org.eclipse.persistence.internal.jpa.metamodel.MetamodelImpl;
@@ -256,7 +257,6 @@
 import org.eclipse.persistence.jpa.metadata.ProjectCache;
 import org.eclipse.persistence.jpa.metadata.XMLMetadataSource;
 import org.eclipse.persistence.logging.AbstractSessionLog;
-import org.eclipse.persistence.logging.DefaultSessionLog;
 import org.eclipse.persistence.logging.SessionLog;
 import org.eclipse.persistence.platform.database.converters.StructConverter;
 import org.eclipse.persistence.platform.database.events.DatabaseEventListener;
@@ -933,9 +933,9 @@
             }
         } else {
             if ((projectPlatform.getSequences() != null) && !projectPlatform.getSequences().isEmpty()) {
-                Iterator itProjectSequences = projectPlatform.getSequences().values().iterator();
+                Iterator<Sequence> itProjectSequences = projectPlatform.getSequences().values().iterator();
                 while (itProjectSequences.hasNext()) {
-                    Sequence sequence = (Sequence)itProjectSequences.next();
+                    Sequence sequence = itProjectSequences.next();
                     if (!sessionPlatform.getSequences().containsKey(sequence.getName())) {
                         sessionPlatform.addSequence(sequence);
                     }
@@ -990,9 +990,9 @@
     protected void assignCMP3Policy() {
         // all descriptors assigned CMP3Policy
         Project project = session.getProject();
-        for (Iterator iterator = project.getDescriptors().values().iterator(); iterator.hasNext();){
+        for (Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator(); iterator.hasNext();){
             //bug:4406101  changed class cast to base class, which is used in projects generated from 904 xml
-            ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
+            ClassDescriptor descriptor = iterator.next();
 
             if(descriptor.getCMPPolicy() == null) {
                 descriptor.setCMPPolicy(new CMP3Policy());
@@ -1369,7 +1369,7 @@
 
     protected static Class findClass(String className, ClassLoader loader) throws ClassNotFoundException, PrivilegedActionException {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return AccessController.doPrivileged(new PrivilegedClassForName(className, true, loader));
+            return AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, loader));
         } else {
             return org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(className, true, loader);
         }
@@ -1538,9 +1538,9 @@
                         ? CacheIsolationType.SHARED : CacheIsolationType.ISOLATED);
             }
 
-            Iterator it = session.getDescriptors().values().iterator();
+            Iterator<ClassDescriptor> it = session.getDescriptors().values().iterator();
             while (it.hasNext() && (!typeMap.isEmpty() || !sizeMap.isEmpty() || !sharedMap.isEmpty())) {
-                ClassDescriptor descriptor = (ClassDescriptor)it.next();
+                ClassDescriptor descriptor = it.next();
 
                 if (descriptor.isDescriptorTypeAggregate()) {
                     continue;
@@ -2078,9 +2078,9 @@
                     // be returned if we we are mean to process these mappings
                     if (enableWeaving) {
                         // build a list of entities the persistence unit represented by this EntityManagerSetupImpl will use
-                        Collection entities = PersistenceUnitProcessor.buildEntityList(processor, classLoaderToUse);
+                        Collection<MetadataClass> entities = PersistenceUnitProcessor.buildEntityList(processor, classLoaderToUse);
                         this.weaver = TransformerFactory.createTransformerAndModifyProject(session, entities, classLoaderToUse, weaveLazy, weaveChangeTracking, weaveFetchGroups, weaveInternal, weaveRest, weaveMappedSuperClass);
-                        session.getProject().setClassNamesForWeaving(new ArrayList(processor.getProject().getWeavableClassNames()));
+                        session.getProject().setClassNamesForWeaving(new ArrayList<>(processor.getProject().getWeavableClassNames()));
                     }
 
                     //moved from deployment:
@@ -2093,13 +2093,13 @@
                 // The transformer is capable of altering domain classes to handle a LAZY hint for OneToOne mappings.  It will only
                 // be returned if we we are meant to process these mappings.
                 if (enableWeaving) {
-                    Collection persistenceClasses = new ArrayList();
+                    Collection persistenceClasses = new ArrayList<>();
                     MetadataAsmFactory factory = new MetadataAsmFactory(new MetadataLogger(session), classLoaderToUse);
                     if (shouldBuildProject) {
                         // If deploying from a sessions-xml it is still desirable to allow the classes to be weaved.
                         // build a list of entities the persistence unit represented by this EntityManagerSetupImpl will use
-                        for (Iterator iterator = session.getProject().getDescriptors().keySet().iterator(); iterator.hasNext(); ) {
-                            persistenceClasses.add(factory.getMetadataClass(((Class)iterator.next()).getName()));
+                        for (Iterator<Class<?>> iterator = session.getProject().getDescriptors().keySet().iterator(); iterator.hasNext(); ) {
+                            persistenceClasses.add(factory.getMetadataClass(iterator.next().getName()));
                         }
                     } else {
                         // build a list of entities the persistence unit represented by this EntityManagerSetupImpl will use
@@ -3989,11 +3989,11 @@
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
                         helperClass = AccessController.doPrivileged(
-                                new PrivilegedClassForName(helperClassName, true, appClassLoader));
+                                new PrivilegedClassForName<>(helperClassName, true, appClassLoader));
                     } catch (Throwable t) {
                         // Try the ClassLoader that loaded Eclipselink classes
                         ClassLoader eclipseLinkClassLoader = EntityManagerSetupImpl.class.getClassLoader();
-                        helperClass = AccessController.doPrivileged(new PrivilegedClassForName(helperClassName, true, eclipseLinkClassLoader));
+                        helperClass = AccessController.doPrivileged(new PrivilegedClassForName<>(helperClassName, true, eclipseLinkClassLoader));
                     }
                 } else {
                     try {
@@ -4041,7 +4041,7 @@
                 validationMode = (ValidationMode) AccessController.doPrivileged(new PrivilegedMethodInvoker(method, persitenceUnitInfo));
             } else {
                 method = PrivilegedAccessHelper.getDeclaredMethod(PersistenceUnitInfo.class, "getValidationMode", null);
-                validationMode = (ValidationMode) PrivilegedAccessHelper.invokeMethod(method, persitenceUnitInfo, null);
+                validationMode = PrivilegedAccessHelper.invokeMethod(method, persitenceUnitInfo, null);
             }
         } catch (Throwable exception) {
             // We are running in JavaEE5 environment. Catch and swallow any exceptions and return null.
@@ -4087,7 +4087,7 @@
             boolean classInitialized = false;
             String className = MetadataHelper.getQualifiedCanonicalName(manType.getJavaType().getName(), getSession());
             try {
-                Class clazz = (Class)this.getSession().getDatasourcePlatform().convertObject(className, ClassConstants.CLASS);
+                Class clazz = this.getSession().getDatasourcePlatform().convertObject(className, ClassConstants.CLASS);
                 classInitialized=true;
                 this.getSession().log(SessionLog.FINER, SessionLog.METAMODEL, "metamodel_canonical_model_class_found", className);
                 String fieldName = "";
@@ -4177,7 +4177,7 @@
         updateCompositeMembersProperties(compositeMemberPuInfos, predeployProperties);
         // Don't log these properties - may contain passwords. The properties will be logged by contained persistence units.
         Map compositeMemberMapOfProperties = (Map)getConfigProperty(PersistenceUnitProperties.COMPOSITE_UNIT_PROPERTIES, predeployProperties);
-        this.compositeMemberEmSetupImpls = new HashSet(compositeMemberPuInfos.size());
+        this.compositeMemberEmSetupImpls = new HashSet<>(compositeMemberPuInfos.size());
         this.processor = new MetadataProcessor();
         if (enableWeaving) {
             this.weaver = new PersistenceWeaver(new HashMap<String, ClassDetails>());
@@ -4272,7 +4272,7 @@
             boolean classInitialized = false;
             String className = MetadataHelper.getQualifiedCanonicalName(((ManagedTypeImpl)manType).getJavaTypeName(), getSession());
             try {
-                Class clazz = (Class)this.getSession().getDatasourcePlatform().convertObject(className, ClassConstants.CLASS);
+                Class clazz = this.getSession().getDatasourcePlatform().convertObject(className, ClassConstants.CLASS);
                 classInitialized=true;
                 this.getSession().log(SessionLog.FINER, SessionLog.METAMODEL, "metamodel_canonical_model_class_found", className);
                 Field[] fields = null;
@@ -4332,7 +4332,7 @@
      * for required properties overrides values with those from composite properties.
      */
     protected void updateCompositeMembersProperties(Map compositeProperties) {
-        Set<SEPersistenceUnitInfo> compositePuInfos = new HashSet(compositeMemberEmSetupImpls.size());
+        Set<SEPersistenceUnitInfo> compositePuInfos = new HashSet<>(compositeMemberEmSetupImpls.size());
         for (EntityManagerSetupImpl compositeMemberEmSetupImpl : compositeMemberEmSetupImpls) {
             compositePuInfos.add((SEPersistenceUnitInfo)compositeMemberEmSetupImpl.persistenceUnitInfo);
         }
@@ -4351,10 +4351,10 @@
         Map compositeMemberMapOfProperties = (Map)getConfigProperty(PersistenceUnitProperties.COMPOSITE_UNIT_PROPERTIES, compositeProperties);
         Map newCompositeMemberMapOfProperties;
         if (compositeMemberMapOfProperties == null) {
-            newCompositeMemberMapOfProperties = new HashMap(compositePuInfos.size());
+            newCompositeMemberMapOfProperties = new HashMap<>(compositePuInfos.size());
         } else {
             // Don't alter user-supplied properties' map - create a copy instead
-            newCompositeMemberMapOfProperties = new HashMap(compositeMemberMapOfProperties);
+            newCompositeMemberMapOfProperties = new HashMap<>(compositeMemberMapOfProperties);
         }
 
         for (SEPersistenceUnitInfo compositePuInfo : compositePuInfos) {
@@ -4362,10 +4362,10 @@
             Map compositeMemberProperties = (Map)newCompositeMemberMapOfProperties.get(compositeMemberPuName);
             Map newCompositeMemberProperties;
             if (compositeMemberProperties == null) {
-                newCompositeMemberProperties = new HashMap();
+                newCompositeMemberProperties = new HashMap<>();
             } else {
                 // Don't alter user-supplied properties - create a copy instead
-                newCompositeMemberProperties = new HashMap(compositeMemberProperties);
+                newCompositeMemberProperties = new HashMap<>(compositeMemberProperties);
             }
             overrideMemberProperties(newCompositeMemberProperties, compositeProperties);
             newCompositeMemberProperties = mergeMaps(newCompositeMemberProperties, compositePuInfo.getProperties());
@@ -4410,7 +4410,7 @@
      */
     protected static Map<String, SEPersistenceUnitInfo> getCompositeMemberPuInfoMap(PersistenceUnitInfo puInfo, Map predeployProperties) {
         Set<SEPersistenceUnitInfo> memeberPuInfoSet = PersistenceUnitProcessor.getPersistenceUnits(puInfo.getClassLoader(), predeployProperties, puInfo.getJarFileUrls());
-        HashMap<String, SEPersistenceUnitInfo> memberPuInfoMap = new HashMap(memeberPuInfoSet.size());
+        HashMap<String, SEPersistenceUnitInfo> memberPuInfoMap = new HashMap<>(memeberPuInfoSet.size());
         for (SEPersistenceUnitInfo memberPuInfo : memeberPuInfoSet) {
             // override transaction type with composite's transaction type
             memberPuInfo.setTransactionType(puInfo.getTransactionType());
@@ -4449,7 +4449,7 @@
      * Return a Set of composite member SEPersistenceUnitInfo.
      */
     protected static Set<SEPersistenceUnitInfo> getCompositeMemberPuInfoSet(PersistenceUnitInfo puInfo, Map predeployProperties) {
-        return new HashSet(getCompositeMemberPuInfoMap(puInfo, predeployProperties).values());
+        return new HashSet<>(getCompositeMemberPuInfoMap(puInfo, predeployProperties).values());
     }
 
     public static void throwPersistenceUnitNameAlreadyInUseException(String puName, PersistenceUnitInfo newPuInfo, PersistenceUnitInfo exsitingPuInfo) {
@@ -4480,7 +4480,7 @@
         EntityManagerSetupImpl newSetupImpl = new EntityManagerSetupImpl(uniqueName, sessionName);
         newSetupImpl.setIsInContainerMode(isInContainerMode);
         newSetupImpl.enableWeaving = enableWeaving;
-        Map refreshProperties = new HashMap();
+        Map refreshProperties = new HashMap<>();
         refreshProperties.putAll(getSession().getProperties());
         if (properties != null){
             refreshProperties.putAll(properties);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryHintsHandler.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryHintsHandler.java
index 5a32780..a3fb2e5 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryHintsHandler.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryHintsHandler.java
@@ -235,9 +235,9 @@
      * and set the valueArray if the set of valid values is finite.
      */
     protected static abstract class Hint {
-        static HashMap mainMap = new HashMap();
+        static HashMap<String, Hint> mainMap = new HashMap<>();
         Object[] valueArray;
-        HashMap valueMap;
+        HashMap<String, Object> valueMap;
         String name;
         String defaultValue;
         Object defaultValueToApply;
@@ -328,7 +328,7 @@
         abstract DatabaseQuery applyToDatabaseQuery(Object valueToApply, DatabaseQuery query, ClassLoader loader, AbstractSession activeSession);
 
         static void verify(String hintName, boolean shouldUseDefault, Object hintValue, String queryName, AbstractSession session) {
-            Hint hint = (Hint)mainMap.get(hintName);
+            Hint hint = mainMap.get(hintName);
             if(hint == null) {
                 if(session != null) {
                     session.log(SessionLog.FINEST, SessionLog.QUERY, "unknown_query_hint", new Object[]{getPrintValue(queryName), hintName});
@@ -352,7 +352,7 @@
         }
 
         static DatabaseQuery apply(String hintName, boolean shouldUseDefault, Object hintValue, DatabaseQuery query, ClassLoader loader, AbstractSession activeSession) {
-            Hint hint = (Hint)mainMap.get(hintName);
+            Hint hint = mainMap.get(hintName);
             if (hint == null) {
                 // unknown hint name - silently ignored.
                 return query;
@@ -406,11 +406,11 @@
             return hintValue != null ? hintValue.toString().toUpperCase(Locale.ROOT) : null;
         }
 
-        static Class loadClass(String className, DatabaseQuery query, ClassLoader loader) throws QueryException {
+        static Class<?> loadClass(String className, DatabaseQuery query, ClassLoader loader) throws QueryException {
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
-                        return AccessController.doPrivileged(new PrivilegedClassForName(className, true, loader));
+                        return AccessController.doPrivileged(new PrivilegedClassForName<>(className, true, loader));
                     } catch (PrivilegedActionException exception) {
                         throw QueryException.classNotFoundWhileUsingQueryHint(query, className, exception.getException());
                     }
@@ -422,10 +422,10 @@
             }
         }
 
-        static Object newInstance(Class theClass, DatabaseQuery query, String hint) {
+        static <T> T newInstance(Class<T> theClass, DatabaseQuery query, String hint) {
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    return AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(theClass));
+                    return AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<T>(theClass));
                 } else {
                     return PrivilegedAccessHelper.newInstanceFromClass(theClass);
                 }
@@ -436,7 +436,7 @@
 
         void initialize() {
             if(valueArray != null) {
-                valueMap = new HashMap(valueArray.length);
+                valueMap = new HashMap<>(valueArray.length);
                 if(valueArray instanceof Object[][]) {
                     Object[][] valueArray2 = (Object[][])valueArray;
                     for(int i=0; i<valueArray2.length; i++) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryImpl.java
index 00792c8..775a6b5 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryImpl.java
@@ -180,7 +180,7 @@
      * @return the results of the query execution
      */
     protected Object executeReadQuery() {
-        List parameterValues = processParameters();
+        List<Object> parameterValues = processParameters();
         // TODO: the following performFlush() call is a temporary workaround for
         // bug 4752493:
         // CTS: INMEMORY QUERYING IN EJBQUERY BROKEN DUE TO CHANGE TO USE
@@ -295,7 +295,7 @@
             entityManager.checkForTransaction(true);
 
             // fix for bug:4288845, did not add the parameters to the query
-            List parameterValues = processParameters();
+            List<Object> parameterValues = processParameters();
             if (isFlushModeAUTO()) {
                 performPreQueryFlush();
             }
@@ -568,20 +568,20 @@
      */
     protected List<Object> processParameters() {
         DatabaseQuery query = getDatabaseQueryInternal();
-        List arguments = query.getArguments();
+        List<String> arguments = query.getArguments();
         if (arguments.isEmpty()) {
             // This occurs for native queries, as the query does not know of its arguments.
             // This may have issues, it is better if the query set its arguments
             // when parsing the SQL.
 
-            arguments = new ArrayList<String>(this.parameterValues.keySet());
+            arguments = new ArrayList<>(this.parameterValues.keySet());
             query.setArguments(arguments);
         }
         // now create parameterValues in the same order as the argument list
         int size = arguments.size();
         List<Object> parameterValues = new ArrayList<Object>(size);
         for (int index = 0; index < size; index++) {
-            String name = (String) arguments.get(index);
+            String name = arguments.get(index);
             Object parameter = this.parameterValues.get(name);
             if ((parameter != null) || this.parameterValues.containsKey(name)) {
                 parameterValues.add(parameter);
@@ -1054,7 +1054,7 @@
     public Parameter<?> getParameter(String name) {
         //don't rollback transaction on error
         entityManager.verifyOpen();
-        Parameter param = getInternalParameters().get(name);
+        Parameter<?> param = getInternalParameters().get(name);
         if (param == null) {
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("NO_PARAMETER_WITH_NAME", new Object[] { name, this.databaseQuery }));
         }
@@ -1068,7 +1068,7 @@
     public Parameter<?> getParameter(int position) {
         //don't rollback transaction on error
         entityManager.verifyOpen();
-        Parameter param = getInternalParameters().get(String.valueOf(position));
+        Parameter<?> param = getInternalParameters().get(String.valueOf(position));
         if (param == null) {
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("NO_PARAMETER_WITH_INDEX", new Object[] { position, this.databaseQuery }));
         }
@@ -1142,7 +1142,7 @@
      */
     public Set<Parameter<?>> getParameters() {
         entityManager.verifyOpen();//don't rollback transaction
-        return new HashSet(getInternalParameters().values());
+        return new HashSet<>(getInternalParameters().values());
     }
 
     /**
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/StoredProcedureQueryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/StoredProcedureQueryImpl.java
index 3cf7d7b..2a28966 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/StoredProcedureQueryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/StoredProcedureQueryImpl.java
@@ -61,6 +61,7 @@
 import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.jpa.querydef.ParameterExpressionImpl;
 import org.eclipse.persistence.internal.localization.ExceptionLocalization;
+import org.eclipse.persistence.internal.sessions.AbstractRecord;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.logging.SessionLog;
 import org.eclipse.persistence.queries.DataReadQuery;
@@ -123,7 +124,7 @@
             executeCall.matchFieldOrder(resultSet, accessor, session);
             ResultSetMetaData metaData = resultSet.getMetaData();
 
-            List result =  new Vector();
+            List<AbstractRecord> result =  new Vector<>();
             while (resultSet.next()) {
                 result.add(accessor.fetchRow(executeCall.getFields(), executeCall.getFieldsArray(), resultSet, metaData, session));
             }
@@ -1118,7 +1119,7 @@
      */
     @Override
     protected void setParameterInternal(String name, Object value, boolean isIndex) {
-        Parameter parameter = this.getInternalParameters().get(name);
+        Parameter<?> parameter = this.getInternalParameters().get(name);
         StoredProcedureCall call = (StoredProcedureCall) getDatabaseQuery().getCall();
         if (parameter == null) {
             if (isIndex) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/BeanValidationInitializationHelper.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/BeanValidationInitializationHelper.java
index 24c53d5..58c3705 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/BeanValidationInitializationHelper.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/BeanValidationInitializationHelper.java
@@ -127,7 +127,7 @@
             Class loadedClass = null;
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 loadedClass = AccessController.doPrivileged(
-                        new PrivilegedClassForName(className, true, classLoader));
+                        new PrivilegedClassForName<>(className, true, classLoader));
             } else {
                 loadedClass = PrivilegedAccessHelper.getClassForName(className, true, classLoader);
             }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JPAInitializer.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JPAInitializer.java
index 50896a5..2c04bc0 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JPAInitializer.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JPAInitializer.java
@@ -96,7 +96,7 @@
         // Bug#4452468  When globalInstrumentation is null, there is no weaving
         checkWeaving(mergedProperties);
 
-        Set tempLoaderSet = PersistenceUnitProcessor.buildClassSet(persistenceUnitInfo, m);
+        Set<String> tempLoaderSet = PersistenceUnitProcessor.buildClassSet(persistenceUnitInfo, m);
         // Create the temp loader that will not cache classes for entities in our persistence unit
         ClassLoader tempLoader = createTempLoader(tempLoaderSet);
         persistenceUnitInfo.setNewTempClassLoader(tempLoader);
@@ -206,7 +206,7 @@
      * that we will be deploying.
      */
     protected Set loadEntityClasses(Collection entityNames, ClassLoader classLoader) {
-        Set entityClasses = new HashSet();
+        Set entityClasses = new HashSet<>();
 
         // Load the classes using the loader passed in
         AbstractSessionLog.getLog().log(SessionLog.FINER, SessionLog.JPA, "cmp_loading_entities_using_loader", classLoader);
@@ -260,10 +260,10 @@
     public void initialize(Map m) {
         boolean keepInitialMaps = keepAllPredeployedPersistenceUnits();
         if(keepInitialMaps) {
-            this.initialPuInfos = new HashMap();
+            this.initialPuInfos = new HashMap<>();
         }
         // always create initialEmSetupImpls - it's used to check for puName uniqueness in initPersistenceUnits
-        this.initialEmSetupImpls = new HashMap();
+        this.initialEmSetupImpls = new HashMap<>();
         // ailitchev - copied from findPersistenceUnitInfoInArchives: mkeith - get resource name from prop and include in subsequent call
         String descriptorPath = (String) m.get(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML);
         final Set<Archive> pars;
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JavaSECMPInitializer.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JavaSECMPInitializer.java
index 76808e7..24a982e 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JavaSECMPInitializer.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JavaSECMPInitializer.java
@@ -102,7 +102,7 @@
                         }
                         usesAgent = true;
                         initializer = new JavaSECMPInitializer(classLoader);
-                        initializer.initialize(m != null ? m : new HashMap(0));
+                        initializer.initialize(m != null ? m : new HashMap<>(0));
                         // all the transformers have been added to instrumentation, don't need it any more.
                         globalInstrumentation = null;
                     }
@@ -181,7 +181,7 @@
             try {
                 Class[] argsClasses = new Class[] { URL[].class, ClassLoader.class, Collection.class, boolean.class };
                 Object[] args = new Object[] { urlPath, currentLoader, col, shouldOverrideLoadClassForCollectionMembers };
-                Constructor classLoaderConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(TempEntityLoader.class, argsClasses, true));
+                Constructor classLoaderConstructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(TempEntityLoader.class, argsClasses, true));
                 tempLoader = (ClassLoader) AccessController.doPrivileged(new PrivilegedInvokeConstructor(classLoaderConstructor, args));
             } catch (PrivilegedActionException privilegedException) {
                 throw new PersistenceException(EntityManagerSetupException.failedToInstantiateTemporaryClassLoader(privilegedException));
@@ -236,7 +236,7 @@
      * The version of initializeFromMain that passes an empty map.
      */
     public static void initializeFromMain() {
-        initializeFromMain(new HashMap());
+        initializeFromMain(new HashMap<>());
     }
 
     /**
@@ -356,7 +356,7 @@
                 // it doesn't return true if the class has been loaded by parent loader
                 // (forced to live with that because findLoadedClass method defined as final protected:
                 //  neither can override it nor call it on the parent loader)
-                Class c = findLoadedClass(name);
+                Class<?> c = findLoadedClass(name);
                 if (c == null) {
                     c = findClass(name);
                 }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JavaSECMPInitializerAgent.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JavaSECMPInitializerAgent.java
index 27566c3..08eb8d9 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JavaSECMPInitializerAgent.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/JavaSECMPInitializerAgent.java
@@ -47,7 +47,7 @@
     }
 
     public static void initializeFromAgent(Instrumentation instr) throws Throwable {
-            Class cls = Class.forName("org.eclipse.persistence.internal.jpa.deployment.JavaSECMPInitializer");
+            Class<?> cls = Class.forName("org.eclipse.persistence.internal.jpa.deployment.JavaSECMPInitializer");
             Method method = cls.getDeclaredMethod("initializeFromAgent", new Class[] { Instrumentation.class });
             try {
                 method.invoke(null, new Object[] { instr });
@@ -57,7 +57,7 @@
     }
 
     public static void initializeFromMain(Instrumentation instr) throws Exception {
-            Class cls = Class.forName("org.eclipse.persistence.internal.jpa.deployment.JavaSECMPInitializer");
+            Class<?> cls = Class.forName("org.eclipse.persistence.internal.jpa.deployment.JavaSECMPInitializer");
             Field field = cls.getField("globalInstrumentation");
             field.set(null, instr);
     }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
index d29a6d0..dc6b7b5 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
@@ -137,9 +137,9 @@
         Set<String> set = new HashSet<String>();
         set.addAll(persistenceUnitInfo.getManagedClassNames());
         ClassLoader loader = persistenceUnitInfo.getClassLoader();
-        Iterator i = persistenceUnitInfo.getJarFileUrls().iterator();
+        Iterator<URL> i = persistenceUnitInfo.getJarFileUrls().iterator();
         while (i.hasNext()) {
-            set.addAll(getClassNamesFromURL((URL)i.next(), loader, properties));
+            set.addAll(getClassNamesFromURL(i.next(), loader, properties));
         }
         if (!persistenceUnitInfo.excludeUnlistedClasses()){
             set.addAll(getClassNamesFromURL(persistenceUnitInfo.getPersistenceUnitRootUrl(), loader, properties));
@@ -421,7 +421,7 @@
             descriptorPath = PrivilegedAccessHelper.getSystemProperty(PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML, PersistenceUnitProperties.ECLIPSELINK_PERSISTENCE_XML_DEFAULT);
         }
         Set<Archive> archives = findPersistenceArchives(loader, descriptorPath, jarFileUrls, m);
-        Set<SEPersistenceUnitInfo> puInfos = new HashSet();
+        Set<SEPersistenceUnitInfo> puInfos = new HashSet<>();
         try {
             for(Archive archive : archives) {
                 List<SEPersistenceUnitInfo> puInfosFromArchive = getPersistenceUnits(archive, loader);
@@ -461,7 +461,7 @@
         } else {
             try {
                 if (loader != null) {
-                    Class archiveClass = loader.loadClass(factoryClassName);
+                    Class<?> archiveClass = loader.loadClass(factoryClassName);
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                         try {
                             factory = (ArchiveFactory)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(archiveClass));
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XMLException.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XMLException.java
index 43ed2dc..1f991e2 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XMLException.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XMLException.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
@@ -24,7 +24,7 @@
 
     public XMLException() {
         super();
-        m_nestedExceptions = new ArrayList();
+        m_nestedExceptions = new ArrayList<>();
     }
 
     public void addNestedException(Exception nestedException) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XMLNodeList.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XMLNodeList.java
index a74ce21..24ed868 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XMLNodeList.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XMLNodeList.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
@@ -22,14 +22,14 @@
  * Implementation of the org.w3c.dom.NodeList interface
  */
 public class XMLNodeList implements NodeList {
-    private ArrayList nodes;
+    private ArrayList<Node> nodes;
 
     public XMLNodeList() {
-        nodes = new ArrayList();
+        nodes = new ArrayList<>();
     }
 
     public XMLNodeList(int size) {
-        nodes = new ArrayList(size);
+        nodes = new ArrayList<>(size);
     }
 
     @Override
@@ -39,7 +39,7 @@
 
     @Override
     public Node item(int i) {
-        return (Node)nodes.get(i);
+        return nodes.get(i);
     }
 
     public void add(Node node) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataHelper.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataHelper.java
index ce8219f..2269b39 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataHelper.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataHelper.java
@@ -96,7 +96,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    return AccessController.doPrivileged(new PrivilegedClassForName(classname, true, loader));
+                    return AccessController.doPrivileged(new PrivilegedClassForName<>(classname, true, loader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.unableToLoadClass(classname, exception.getException());
                 }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java
index c268d7e..b8bb99c 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProcessor.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.
  * Copyright (c) 1998, 2018 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -93,7 +93,7 @@
     protected MetadataFactory m_factory;
     protected MetadataProject m_project;
     protected AbstractSession m_session;
-    protected Map m_predeployProperties;
+    protected Map<String, Object> m_predeployProperties;
     protected MetadataProcessor m_compositeProcessor;
     protected Set<MetadataProcessor> m_compositeMemberProcessors;
     protected MetadataSource m_metadataSource;
@@ -109,7 +109,7 @@
      * Called from EntityManagerSetupImpl. The 'real' EJB 3.0 processing
      * that includes XML and annotations.
      */
-    public MetadataProcessor(PersistenceUnitInfo puInfo, AbstractSession session, ClassLoader loader, boolean weaveLazy, boolean weaveEager, boolean weaveFetchGroups, boolean multitenantSharedEmf, boolean multitenantSharedCache, Map predeployProperties, MetadataProcessor compositeProcessor) {
+    public MetadataProcessor(PersistenceUnitInfo puInfo, AbstractSession session, ClassLoader loader, boolean weaveLazy, boolean weaveEager, boolean weaveFetchGroups, boolean multitenantSharedEmf, boolean multitenantSharedCache, Map<String, Object> predeployProperties, MetadataProcessor compositeProcessor) {
         m_loader = loader;
         m_session = session;
         m_project = new MetadataProject(puInfo, session, weaveLazy, weaveEager, weaveFetchGroups, multitenantSharedEmf, multitenantSharedCache);
@@ -127,7 +127,7 @@
      */
     public void addCompositeMemberProcessor(MetadataProcessor compositeMemberProcessor) {
         if (m_compositeMemberProcessors == null) {
-            m_compositeMemberProcessors = new HashSet();
+            m_compositeMemberProcessors = new HashSet<>();
         }
         m_compositeMemberProcessors.add(compositeMemberProcessor);
     }
@@ -192,7 +192,7 @@
      * Returns projects owned by compositeProcessor minus the passed project.
      */
     public Set<MetadataProject> getPearProjects(MetadataProject project) {
-        Set<MetadataProject> pearProjects = new HashSet();
+        Set<MetadataProject> pearProjects = new HashSet<>();
         if (m_compositeMemberProcessors != null) {
             for(MetadataProcessor processor : m_compositeMemberProcessors) {
                 MetadataProject pearProject = processor.getProject();
@@ -339,7 +339,7 @@
         }
 
         // Add all the classes off the classpath at the persistence unit root url.
-        Set<String> unlistedClasses = Collections.EMPTY_SET;
+        Set<String> unlistedClasses = Collections.emptySet();
         if (! persistenceUnitInfo.excludeUnlistedClasses()) {
             unlistedClasses = PersistenceUnitProcessor.getClassNamesFromURL(persistenceUnitInfo.getPersistenceUnitRootUrl(), m_loader, m_predeployProperties);
         }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java
index 74bfc5b..5a69cef 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java
@@ -1324,7 +1324,7 @@
                     m_sharedCacheMode = AccessController.doPrivileged(new PrivilegedMethodInvoker<SharedCacheMode>(method, m_persistenceUnitInfo));
                 } else {
                     method = PrivilegedAccessHelper.getDeclaredMethod(PersistenceUnitInfo.class, "getSharedCacheMode", null);
-                    m_sharedCacheMode = (SharedCacheMode) PrivilegedAccessHelper.invokeMethod(method, m_persistenceUnitInfo, null);
+                    m_sharedCacheMode = PrivilegedAccessHelper.invokeMethod(method, m_persistenceUnitInfo, null);
                 }
             } catch (Throwable exception) {
                 // Swallow any exceptions, shared cache mode will be null.
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/ORMetadata.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/ORMetadata.java
index 927ffb5..fdbe3f6 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/ORMetadata.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/ORMetadata.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
@@ -461,7 +461,7 @@
     /**
      * INTERNAL:
      * This is a value is that is used when logging messages for overriding.
-     * @see shouldOverride
+     * @see #shouldOverride(ORMetadata)
      */
     protected String getXMLElement() {
         return m_xmlElement;
@@ -517,9 +517,9 @@
      * INTERNAL:
      * It is assumed this is a list of ORMetadata
      */
-    protected void initXMLObjects(List metadatas, MetadataAccessibleObject accessibleObject) {
+    protected <T extends ORMetadata> void initXMLObjects(List<T> metadatas, MetadataAccessibleObject accessibleObject) {
         if (metadatas != null) {
-            for (ORMetadata metadata : (List<ORMetadata>) metadatas) {
+            for (T metadata : metadatas) {
                 metadata.initXMLObject(accessibleObject, m_entityMappings);
             }
         }
@@ -533,9 +533,9 @@
      * compatibility. If the text object is initialized the metadata list is
      * set to null to ease further processing (logging, warnings, overrides etc.)
      */
-    protected String initXMLTextObject(List metadatas) {
+    protected <T extends ORMetadata> String initXMLTextObject(List<T> metadatas) {
         if (metadatas != null && metadatas.size() == 1) {
-            ORMetadata metadata = ((ORMetadata) metadatas.get(0));
+            T metadata = metadatas.get(0);
 
             if (metadata.hasText()) {
                 String text = metadata.getText();
@@ -587,13 +587,13 @@
      * not check for duplicates or any overrides at this time. Just appends
      * all items from list2 to list1.
      */
-    protected List mergeORObjectLists(List list1, List list2) {
-        List<ORMetadata> newList = new ArrayList<ORMetadata>();
+    protected <T extends ORMetadata> List<T> mergeORObjectLists(List<T> list1, List<T> list2) {
+        List<T> newList = new ArrayList<>();
 
-        for (ORMetadata obj1 : (List<ORMetadata>) list1) {
+        for (T obj1 : list1) {
             boolean found = false;
 
-            for (ORMetadata obj2 : (List<ORMetadata>) list2) {
+            for (T obj2 : list2) {
                 if (obj2.getIdentifier().equals(obj1.getIdentifier())) {
                     if (obj2.shouldOverride(obj1)) {
                         newList.add(obj2);
@@ -612,10 +612,10 @@
         }
 
         // Now go through m2 and see what is not in m1
-        for (ORMetadata obj2 : (List<ORMetadata>) list2) {
+        for (T obj2 : list2) {
             boolean found = false;
 
-            for (ORMetadata obj1 : (List<ORMetadata>) list1) {
+            for (ORMetadata obj1 : list1) {
                if (obj2.getIdentifier().equals(obj1.getIdentifier())) {
                     found = true;
                     break;
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/objects/MetadataAnnotation.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/objects/MetadataAnnotation.java
index a67ab84..d0e5d71 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/objects/MetadataAnnotation.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/objects/MetadataAnnotation.java
@@ -37,7 +37,7 @@
     protected boolean isMeta = false;
 
     /** Map of attribute names and values. */
-    protected Map<String, Object> m_attributes = new HashMap<String, Object>();
+    protected Map<String, Object> m_attributes = new HashMap<>();
 
     /**
      * Default constructor.
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/objects/MetadataAsmFactory.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/objects/MetadataAsmFactory.java
index 164d872..04988e8 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/objects/MetadataAsmFactory.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/objects/MetadataAsmFactory.java
@@ -551,7 +551,7 @@
         // since it is a JDK class, just use reflection.
         if ((className.length() > 5) && className.substring(0, 5).equals("java.")) {
             try {
-                Class reflectClass = Class.forName(className);
+                Class<?> reflectClass = Class.forName(className);
                 if (reflectClass.getSuperclass() != null) {
                     metadataClass.setSuperclassName(reflectClass.getSuperclass().getName());
                 }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/cache/CacheIndexMetadata.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/cache/CacheIndexMetadata.java
index 71db232..c31454f 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/cache/CacheIndexMetadata.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/cache/CacheIndexMetadata.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -43,7 +43,7 @@
  */
 public class CacheIndexMetadata extends ORMetadata {
 
-    private List<String> m_columnNames = new ArrayList();
+    private List<String> m_columnNames = new ArrayList<>();
     private Boolean updateable;
 
     /**
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/graphs/NamedSubgraphMetadata.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/graphs/NamedSubgraphMetadata.java
index 9c3ec7b..7d4eb04 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/graphs/NamedSubgraphMetadata.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/graphs/NamedSubgraphMetadata.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -20,6 +20,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.internal.jpa.metadata.ORMetadata;
 import org.eclipse.persistence.internal.jpa.metadata.accessors.classes.ClassAccessor;
@@ -69,7 +70,7 @@
         super(namedSubgraph, accessor);
 
         m_name = namedSubgraph.getAttributeString("name");
-        m_type = getMetadataClass(namedSubgraph.getAttributeClass("type", ClassConstants.Object_Class));
+        m_type = getMetadataClass(namedSubgraph.getAttributeClass("type", CoreClassConstants.OBJECT));
 
         for (Object attributeNode : namedSubgraph.getAttributeArray("attributeNodes")) {
             m_namedAttributeNodes.add(new NamedAttributeNodeMetadata((MetadataAnnotation) attributeNode, accessor));
@@ -161,7 +162,7 @@
         if (m_typeName != null && ! m_typeName.equals("")) {
             m_type = initXMLClassName(m_typeName);
         } else {
-            m_type = getMetadataClass(ClassConstants.Object_Class);
+            m_type = getMetadataClass(CoreClassConstants.OBJECT);
         }
     }
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java
index d2e832d..b63b0c8 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListener.java
@@ -551,7 +551,7 @@
             // So far so good, now check the method modifiers.
             validateMethodModifiers(method);
         } else {
-            Class parameterClass = (numberOfParameters == 0) ? null : method.getParameterTypes()[0];
+            Class<?> parameterClass = (numberOfParameters == 0) ? null : method.getParameterTypes()[0];
             throw ValidationException.invalidEntityListenerCallbackMethodArguments(m_entityClass, parameterClass, getListenerClass(), method.getName());
         }
     }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListenerMetadata.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListenerMetadata.java
index 0b9ea06..71e7c0e 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListenerMetadata.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/EntityListenerMetadata.java
@@ -233,7 +233,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    return AccessController.doPrivileged(new PrivilegedClassForName(classname, true, loader));
+                    return AccessController.doPrivileged(new PrivilegedClassForName<>(classname, true, loader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.unableToLoadClass(classname, exception.getException());
                 }
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 70fce14..9f4c307 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
@@ -123,7 +123,7 @@
         this.serializableMethods = new ConcurrentHashMap<>();
         for (String event: methods.keySet()){
             java.util.List<Method> methodList = methods.get(event);
-            java.util.List<MethodSerialImpl> newMethodList = new java.util.ArrayList();
+            java.util.List<MethodSerialImpl> newMethodList = new java.util.ArrayList<>();
             for (Method method: methodList) {
                 MethodSerialImpl serializableMethod = new MethodSerialImpl(method);
                 newMethodList.add(serializableMethod);
@@ -142,7 +142,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    entityListenerClass = AccessController.doPrivileged(new PrivilegedClassForName(listenerClassName, true, loader));
+                    entityListenerClass = AccessController.doPrivileged(new PrivilegedClassForName<>(listenerClassName, true, loader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.unableToLoadClass(listenerClassName, exception.getException());
                 }
@@ -163,8 +163,7 @@
      */
     public void addEventMethod(String event, Method method) {
         if (!getMethods().containsKey(event)) {
-            List methodsList = new ArrayList<MethodSerialImpl>();
-            methodsList.add(method);
+            List<MethodSerialImpl> methodsList = new ArrayList<>();
             serializableMethods.put(event, methodsList);
         }
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/MethodSerialImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/MethodSerialImpl.java
index 72d6541..2b8404d 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/MethodSerialImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/MethodSerialImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -40,8 +40,8 @@
     public MethodSerialImpl(Method method) {
         methodName = method.getName();
         declaringClassName = method.getDeclaringClass().getName();
-        paramList = new java.util.ArrayList((method.getParameterTypes()).length);
-        for (Class clazz: method.getParameterTypes()) {
+        paramList = new java.util.ArrayList<>((method.getParameterTypes()).length);
+        for (Class<?> clazz: method.getParameterTypes()) {
             paramList.add(clazz.getName());
         }
     }
@@ -52,7 +52,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    declaringClass = AccessController.doPrivileged(new PrivilegedClassForName(declaringClassName, true, loader));
+                    declaringClass = AccessController.doPrivileged(new PrivilegedClassForName<>(declaringClassName, true, loader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.unableToLoadClass(declaringClassName, exception.getException());
                 }
@@ -70,7 +70,7 @@
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        argTypes[i++] = AccessController.doPrivileged(new PrivilegedClassForName(paramType, true, loader));
+                        argTypes[i++] = AccessController.doPrivileged(new PrivilegedClassForName<>(paramType, true, loader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.unableToLoadClass(paramType, exception.getException());
                     }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/NamedQueryMetadata.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/NamedQueryMetadata.java
index 0e73144..a47c792 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/NamedQueryMetadata.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/NamedQueryMetadata.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
@@ -219,7 +219,7 @@
                 Object[] values = null;
 
                 if (value instanceof Object[]) {
-                    List list = new ArrayList(Arrays.asList((Object[])value));
+                    List<Object> list = new ArrayList<>(Arrays.asList((Object[])value));
                     list.add(hint.getValue());
                     values = list.toArray();
                 } else {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/IdentifiableTypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/IdentifiableTypeImpl.java
index 153ca6b..29a95be 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/IdentifiableTypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/IdentifiableTypeImpl.java
@@ -39,7 +39,6 @@
 import org.eclipse.persistence.descriptors.CMPPolicy;
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.internal.helper.DatabaseField;
-import org.eclipse.persistence.internal.jpa.CMP3Policy;
 import org.eclipse.persistence.internal.localization.ExceptionLocalization;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 
@@ -229,7 +228,7 @@
                 for(DatabaseMapping aMapping : getDescriptor().getMappings()) {
                     if(aMapping.isJPAId()) {
                         // get the attribute Id (declared or not)
-                        Attribute anAttribute = this.getAttribute(aMapping.getAttributeName());
+                        Attribute<X, ?> anAttribute = this.getAttribute(aMapping.getAttributeName());
                         if(anAttribute != null) {
                             return this.getMetamodel().getType(((Bindable)anAttribute).getBindableJavaType()); // all Attributes are Bindable
                         }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ManagedTypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ManagedTypeImpl.java
index 952e665..9414514 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ManagedTypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ManagedTypeImpl.java
@@ -771,7 +771,7 @@
         // Note this method provides the same functionality of the more specific IdentifiableType.superType but is general to ManagedTypeImpl
         ManagedTypeImpl<?> aSuperType = null;
         // Get the superType if it exists (without using IdentifiableType.superType)
-        Class aSuperClass = this.getJavaType().getSuperclass();
+        Class<? super X> aSuperClass = this.getJavaType().getSuperclass();
         // The superclass for top-level types will be Object - which we will leave as a null supertype on the type
         if(null != aSuperClass && aSuperClass != ClassConstants.OBJECT &&
                 this.getMetamodel().getType(aSuperClass).isManagedType()) { // 315287: return null for BasicType
@@ -1077,7 +1077,7 @@
          *     Exit(false) as soon as attribute is found in a superType - without continuing to the root
          *     continue as long as we find an attribute in the superType (essentially only MappedSuperclass parents)
          **/
-        Attribute anAttribute = this.getMembers().get(attributeName);
+        Attribute<X, ?> anAttribute = this.getMembers().get(attributeName);
         ManagedTypeImpl<?> aSuperType = getManagedSuperType();
 
         // Base Case: If we are at the root, check for the attribute and return results immediately
@@ -1095,7 +1095,7 @@
             }
         } else {
            // Recursive Case: check hierarchy both if the immediate superclass is a MappedSuperclassType or EntityType
-           Attribute aSuperTypeAttribute = aSuperType.getMembers().get(attributeName);
+           Attribute<?, ?> aSuperTypeAttribute = aSuperType.getMembers().get(attributeName);
            // UC1.3 The immediate mappedSuperclass may have the attribute - we check it in the base case of the next recursive call
            if(null != aSuperTypeAttribute) {
                // return false immediately if a superType exists above the first level
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/TypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/TypeImpl.java
index c0c9f65..406336b 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/TypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/TypeImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -73,17 +73,18 @@
      *  Return the represented Java type.
      *  @return Java type
      */
+    @SuppressWarnings({"unchecked"})
     public Class<X> getJavaType(ClassLoader classLoader) {
         if (javaClass == null){
             try{
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try {
-                        javaClass = AccessController.doPrivileged(new PrivilegedClassForName(javaClassName, true, classLoader));
+                        javaClass = (Class<X>) AccessController.doPrivileged(new PrivilegedClassForName(javaClassName, true, classLoader));
                     } catch (PrivilegedActionException exception) {
                         throw ValidationException.classNotFoundWhileConvertingClassNames(javaClassName, exception.getException());
                     }
                 } else {
-                    javaClass = org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(javaClassName, true, classLoader);
+                    javaClass = PrivilegedAccessHelper.getClassForName(javaClassName, true, classLoader);
                 }
             } catch (ClassNotFoundException exc){
                 throw ValidationException.classNotFoundWhileConvertingClassNames(javaClassName, exc);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CompoundExpressionImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CompoundExpressionImpl.java
index 9b20f57..d3215a4 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CompoundExpressionImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CompoundExpressionImpl.java
@@ -42,11 +42,11 @@
     protected boolean isNegated = false;
 
     public <T> CompoundExpressionImpl (Metamodel metamodel, org.eclipse.persistence.expressions.Expression expressionNode, List<Expression<?>> compoundExpressions){
-        super(metamodel, (Class<Boolean>)ClassConstants.BOOLEAN, expressionNode, compoundExpressions);
+        super(metamodel, ClassConstants.BOOLEAN, expressionNode, compoundExpressions);
     }
 
     public <T> CompoundExpressionImpl (Metamodel metamodel, org.eclipse.persistence.expressions.Expression expressionNode, List<Expression<?>> compoundExpressions, String operator){
-        super(metamodel, (Class<Boolean>)ClassConstants.BOOLEAN, expressionNode, compoundExpressions, operator);
+        super(metamodel, ClassConstants.BOOLEAN, expressionNode, compoundExpressions, operator);
     }
 
     /**
@@ -97,7 +97,7 @@
      */
     @Override
     public Predicate not(){
-        List<Expression<?>> list = new ArrayList();
+        List<Expression<?>> list = new ArrayList<>();
         list.add(this);
         CompoundExpressionImpl expr = new CompoundExpressionImpl(this.metamodel, this.currentNode.not(), list, "not");
         expr.setIsNegated(true);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CompoundSelectionImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CompoundSelectionImpl.java
index 837a96b..aa8834e 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CompoundSelectionImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CompoundSelectionImpl.java
@@ -17,6 +17,8 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 
 import jakarta.persistence.criteria.CompoundSelection;
 import jakarta.persistence.criteria.Selection;
@@ -49,9 +51,9 @@
 
     public CompoundSelectionImpl(Class javaType, Selection[] subSelections, boolean validate) {
         super(javaType, null);
-        this.subSelections = new ArrayList();
+        this.subSelections = new ArrayList<>();
         //used to validate that an alias is only used once
-        java.util.Map tempMap = new java.util.TreeMap();
+        Map<String, Selection> tempMap = new TreeMap<>();
         for (Selection sel : subSelections) {
             if (validate) {
                 if (sel.isCompoundSelection() && !((SelectionImpl)sel).isConstructor()) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaBuilderImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaBuilderImpl.java
index af5084b..0b12f94 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaBuilderImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaBuilderImpl.java
@@ -106,7 +106,7 @@
                 if (resultClass.isPrimitive() || resultClass.equals(ClassConstants.STRING)|| BasicTypeHelperImpl.getInstance().isWrapperClass(resultClass) || BasicTypeHelperImpl.getInstance().isDateClass(resultClass)) {
                     return new CriteriaQueryImpl<T>(metamodel, ResultType.OTHER, resultClass, this);
                 } else {
-                    TypeImpl type = ((MetamodelImpl)this.metamodel).getType(resultClass);
+                    TypeImpl<T> type = ((MetamodelImpl)this.metamodel).getType(resultClass);
                     if (type != null && type.getPersistenceType().equals(PersistenceType.ENTITY)) {
                         return new CriteriaQueryImpl(this.metamodel, ResultType.ENTITY, resultClass, this);
                     } else {
@@ -556,7 +556,7 @@
                 throw new IllegalArgumentException(ExceptionLocalization.buildMessage("PREDICATE_PASSED_TO_EVALUATION"));
             }
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().equal(true), list, "equals");
     }
@@ -592,7 +592,7 @@
      */
     @Override
     public Predicate isNull(Expression<?> x){
-        return new PredicateImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().isNull(), new ArrayList(), BooleanOperator.AND);
+        return new PredicateImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().isNull(), new ArrayList<>(), BooleanOperator.AND);
     }
 
     /**
@@ -602,7 +602,7 @@
      */
     @Override
     public Predicate isNotNull(Expression<?> x){
-        return new PredicateImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().notNull(),new ArrayList(), BooleanOperator.AND);
+        return new PredicateImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().notNull(),new ArrayList<>(), BooleanOperator.AND);
     }
 
     // equality:
@@ -618,7 +618,7 @@
     @Override
     public Predicate equal(Expression<?> x, Expression<?> y){
 
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().equal(((InternalSelection)y).getCurrentNode()), list, "equals");
@@ -638,7 +638,7 @@
         if (((InternalSelection)x).getCurrentNode() == null || ((InternalSelection)y).getCurrentNode() == null){
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().notEqual(((InternalSelection)y).getCurrentNode()), list, "not equal");
@@ -661,7 +661,7 @@
         }
         if (y instanceof ParameterExpression) return this.equal(x, (ParameterExpression)y);
 
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(this.internalLiteral(y));
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().equal(y), list, "equal");
@@ -682,7 +682,7 @@
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
         if (y instanceof ParameterExpression) return this.notEqual(x, (ParameterExpression)y);
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(this.internalLiteral(y));
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().notEqual(y), list, "not equal");
@@ -704,7 +704,7 @@
         if (((InternalSelection)x).getCurrentNode() == null || ((InternalSelection)y).getCurrentNode() == null){
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().greaterThan(((InternalSelection)y).getCurrentNode()), list, "greaterThan");
@@ -743,7 +743,7 @@
         if (((ExpressionImpl)x).getCurrentNode() == null || ((ExpressionImpl)y).getCurrentNode() == null){
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new CompoundExpressionImpl(this.metamodel, ((ExpressionImpl)x).getCurrentNode().greaterThanEqual(((ExpressionImpl)y).getCurrentNode()), list, "greaterThanEqual");
@@ -764,7 +764,7 @@
         if (((ExpressionImpl)x).getCurrentNode() == null || ((ExpressionImpl)y).getCurrentNode() == null){
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new CompoundExpressionImpl(this.metamodel, ((ExpressionImpl)x).getCurrentNode().lessThanEqual(((ExpressionImpl)y).getCurrentNode()), list, "lessThanEqual");
@@ -785,7 +785,7 @@
     @Override
     public <Y extends Comparable<? super Y>> Predicate between(Expression<? extends Y> v, Expression<? extends Y> x, Expression<? extends Y> y){
 
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(v);
         list.add(x);
         list.add(y);
@@ -808,7 +808,7 @@
         if (((ExpressionImpl)x).getCurrentNode() == null ){
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(expressionY);
         return new CompoundExpressionImpl(this.metamodel, ((ExpressionImpl)x).getCurrentNode().greaterThan(((ExpressionImpl)expressionY).getCurrentNode()), list, "greaterThan");
@@ -830,7 +830,7 @@
         if (((ExpressionImpl)x).getCurrentNode() == null ){
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(expressionY);
         return new CompoundExpressionImpl(this.metamodel, ((ExpressionImpl)x).getCurrentNode().lessThan(((ExpressionImpl)expressionY).getCurrentNode()), list, "lessThan");
@@ -852,7 +852,7 @@
         if (((ExpressionImpl)x).getCurrentNode() == null ){
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(expressionY);
         return new CompoundExpressionImpl(this.metamodel, ((ExpressionImpl)x).getCurrentNode().greaterThanEqual(((ExpressionImpl)expressionY).getCurrentNode()), list, "greaterThanEqual");
@@ -874,7 +874,7 @@
         if (((ExpressionImpl)x).getCurrentNode() == null ){
             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("OPERATOR_EXPRESSION_IS_CONJUNCTION"));
         }
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(expressionY);
         return new CompoundExpressionImpl(this.metamodel, ((ExpressionImpl)x).getCurrentNode().lessThanEqual(((ExpressionImpl)expressionY).getCurrentNode()), list, "lessThanEqual");
@@ -894,7 +894,7 @@
      */
     @Override
     public <Y extends Comparable<? super Y>> Predicate between(Expression<? extends Y> v, Y x, Y y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(v);
         list.add(this.internalLiteral(x));
         list.add(this.internalLiteral(y));
@@ -902,7 +902,7 @@
     }
 
     protected List<Expression<?>> buildList(Expression<?>... expressions){
-        ArrayList list = new ArrayList();
+        List list = new ArrayList<>();
         for(Expression<?> exp : expressions){
             list.add(exp);
         }
@@ -922,7 +922,7 @@
      */
     @Override
     public Predicate gt(Expression<? extends Number> x, Expression<? extends Number> y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().greaterThan(((InternalSelection)y).getCurrentNode()), list, "gt");
@@ -955,7 +955,7 @@
      */
     @Override
     public Predicate ge(Expression<? extends Number> x, Expression<? extends Number> y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().greaterThanEqual(((InternalSelection)y).getCurrentNode()), list, "ge");
@@ -973,7 +973,7 @@
      */
     @Override
     public Predicate le(Expression<? extends Number> x, Expression<? extends Number> y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().lessThanEqual(((InternalSelection)y).getCurrentNode()), list, "le");
@@ -991,7 +991,7 @@
      */
     @Override
     public Predicate gt(Expression<? extends Number> x, Number y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(internalLiteral(y));
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().greaterThan(y), list, "gt");
@@ -1024,7 +1024,7 @@
      */
     @Override
     public Predicate ge(Expression<? extends Number> x, Number y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(internalLiteral(y));
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().greaterThanEqual(y), list, "ge");
@@ -1130,7 +1130,7 @@
      */
     @Override
     public <N extends Number> Expression<N> diff(Expression<? extends N> x, Expression<? extends N> y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         return new FunctionExpressionImpl(this.metamodel, x.getJavaType(), ExpressionMath.subtract(((InternalSelection)x).getCurrentNode(), ((InternalSelection)y).getCurrentNode()), list, "diff");
@@ -1175,7 +1175,7 @@
      */
     @Override
     public <N extends Number> Expression<N> diff(Expression<? extends N> x, N y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(this.internalLiteral(y));
         return new FunctionExpressionImpl(this.metamodel, y.getClass(), ExpressionMath.subtract(((InternalSelection)x).getCurrentNode(), y), list, "diff");
@@ -1220,7 +1220,7 @@
      */
     @Override
     public <N extends Number> Expression<N> diff(N x, Expression<? extends N> y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         ExpressionImpl literal = (ExpressionImpl) this.internalLiteral(x);
         list.add(literal);
         list.add(y);
@@ -1636,7 +1636,7 @@
      */
     @Override
     public Predicate like(Expression<String> x, Expression<String> pattern){
-        List list = this.buildList(x, pattern);
+        List<Expression<?>> list = this.buildList(x, pattern);
         return new CompoundExpressionImpl(this.metamodel,
             ((InternalSelection)x).getCurrentNode().like(((InternalSelection)pattern).getCurrentNode()), list, "like");
     }
@@ -1655,7 +1655,7 @@
      */
     @Override
     public Predicate like(Expression<String> x, Expression<String> pattern, Expression<Character> escapeChar){
-        List list = this.buildList(x, pattern, escapeChar);
+        List<Expression<?>> list = this.buildList(x, pattern, escapeChar);
         return new CompoundExpressionImpl(this.metamodel,
             ((InternalSelection)x).getCurrentNode().like(((InternalSelection)pattern).getCurrentNode(), ((InternalSelection)escapeChar).getCurrentNode()), list, "like");
     }
@@ -1690,7 +1690,7 @@
      */
     @Override
     public Predicate like(Expression<String> x, String pattern){
-        List list = this.buildList(x, this.internalLiteral(pattern));
+        List<Expression<?>> list = this.buildList(x, this.internalLiteral(pattern));
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().like(pattern), list, "like");
     }
 
@@ -1725,7 +1725,7 @@
      */
     @Override
     public Predicate like(Expression<String> x, String pattern, char escapeChar){
-        List list = this.buildList(x, this.internalLiteral(pattern), this.internalLiteral(escapeChar));
+        List<Expression<?>> list = this.buildList(x, this.internalLiteral(pattern), this.internalLiteral(escapeChar));
         String escapeString = String.valueOf(escapeChar);
 
         return new CompoundExpressionImpl(this.metamodel,
@@ -1744,7 +1744,7 @@
      */
     @Override
     public Predicate notLike(Expression<String> x, Expression<String> pattern){
-        List list = this.buildList(x, pattern);
+        List<Expression<?>> list = this.buildList(x, pattern);
 
         return new CompoundExpressionImpl(this.metamodel,
             ((InternalSelection)x).getCurrentNode().notLike(((InternalSelection)pattern).getCurrentNode()), list, "notLike");
@@ -1764,7 +1764,7 @@
      */
     @Override
     public Predicate notLike(Expression<String> x, Expression<String> pattern, Expression<Character> escapeChar){
-        List list = this.buildList(x, pattern, escapeChar);
+        List<Expression<?>> list = this.buildList(x, pattern, escapeChar);
 
         return new CompoundExpressionImpl(this.metamodel,
             ((InternalSelection)x).getCurrentNode().notLike(((InternalSelection)pattern).getCurrentNode(),
@@ -1800,7 +1800,7 @@
      */
     @Override
     public Predicate notLike(Expression<String> x, String pattern){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(this.internalLiteral(pattern));
 
@@ -1853,7 +1853,7 @@
      */
     @Override
     public Expression<String> concat(Expression<String> x, Expression<String> y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(y);
         org.eclipse.persistence.expressions.Expression xNode = ((InternalSelection)x).getCurrentNode();
@@ -1877,7 +1877,7 @@
      */
     @Override
     public Expression<String> concat(Expression<String> x, String y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(x);
         list.add(this.internalLiteral(y));
         return new FunctionExpressionImpl(this.metamodel, ClassConstants.STRING, ((InternalSelection)x).getCurrentNode().concat(y), list, CONCAT);
@@ -1895,7 +1895,7 @@
      */
     @Override
     public Expression<String> concat(String x, Expression<String> y){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         ExpressionImpl literal = (ExpressionImpl) this.internalLiteral(x);
         list.add(literal);
         list.add(y);
@@ -1976,7 +1976,7 @@
      */
     @Override
     public Expression<String> trim(Expression<String> x){
-        List list = this.buildList(x);
+        List<Expression<?>> list = this.buildList(x);
         return new FunctionExpressionImpl(this.metamodel, ClassConstants.STRING, ((InternalSelection)x).getCurrentNode().trim(), list, "trim");
     }
 
@@ -1991,7 +1991,7 @@
      */
     @Override
     public Expression<String> trim(Trimspec ts, Expression<String> x){
-        List list = this.buildList(x);
+        List<Expression<?>> list = this.buildList(x);
 
         if(ts == Trimspec.LEADING) {
             return new FunctionExpressionImpl(this.metamodel, ClassConstants.STRING, ((InternalSelection)x).getCurrentNode().leftTrim(), list, "leftTrim");
@@ -2013,7 +2013,7 @@
      */
     @Override
     public Expression<String> trim(Expression<Character> t, Expression<String> x){
-        List list = this.buildList(x, t);
+        List<Expression<?>> list = this.buildList(x, t);
         return new FunctionExpressionImpl(this.metamodel, ClassConstants.STRING, ((InternalSelection)x).getCurrentNode().trim(((InternalSelection)t).getCurrentNode()), list, "trim");
     }
 
@@ -2030,7 +2030,7 @@
      */
     @Override
     public Expression<String> trim(Trimspec ts, Expression<Character> t, Expression<String> x){
-        List list = this.buildList(x, t);
+        List<Expression<?>> list = this.buildList(x, t);
 
         if(ts == Trimspec.LEADING) {
             return new FunctionExpressionImpl(this.metamodel, ClassConstants.STRING,
@@ -2082,7 +2082,7 @@
      */
     @Override
     public Expression<String> lower(Expression<String> x){
-        List list = this.buildList(x);
+        List<Expression<?>> list = this.buildList(x);
         return new FunctionExpressionImpl(this.metamodel, ClassConstants.STRING, ((InternalSelection)x).getCurrentNode().toLowerCase(), list, "lower");
     }
 
@@ -2095,7 +2095,7 @@
      */
     @Override
     public Expression<String> upper(Expression<String> x){
-        List list = this.buildList(x);
+        List<Expression<?>> list = this.buildList(x);
         return new FunctionExpressionImpl(this.metamodel, ClassConstants.STRING, ((InternalSelection)x).getCurrentNode().toUpperCase(), list, "upper");
     }
 
@@ -2224,9 +2224,9 @@
      */
     @Override
     public <T> In<T> in(Expression<? extends T> expression){
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(expression);
-        return new InImpl(metamodel, (ExpressionImpl) expression, new ArrayList(), list);
+        return new InImpl(metamodel, (ExpressionImpl) expression, new ArrayList<>(), list);
     }
 
     // coalesce, nullif:
@@ -2311,7 +2311,7 @@
     @Override
     public <T> Coalesce<T> coalesce(){
         ArgumentListFunctionExpression coalesce = new ExpressionBuilder().coalesce();
-        return new CoalesceImpl(metamodel, Object.class, coalesce, new ArrayList());
+        return new CoalesceImpl(metamodel, Object.class, coalesce, new ArrayList<>());
     }
 
     /**
@@ -2324,7 +2324,7 @@
     @Override
     public <C, R> SimpleCase<C, R> selectCase(Expression<? extends C> expression){
         ArgumentListFunctionExpression caseStatement = new ExpressionBuilder().caseStatement();
-        return new SimpleCaseImpl(metamodel, Object.class, caseStatement, new ArrayList(), expression);
+        return new SimpleCaseImpl(metamodel, Object.class, caseStatement, new ArrayList<>(), expression);
     }
 
     /**
@@ -2335,7 +2335,7 @@
     @Override
     public <R> Case<R> selectCase(){
         ArgumentListFunctionExpression caseStatement = new ExpressionBuilder().caseConditionStatement();
-        return new CaseImpl(metamodel, Object.class, caseStatement, new ArrayList());
+        return new CaseImpl(metamodel, Object.class, caseStatement, new ArrayList<>());
     }
 
     /**
@@ -2354,13 +2354,13 @@
         if (args != null && args.length > 0){
         List<org.eclipse.persistence.expressions.Expression> params = new ArrayList<org.eclipse.persistence.expressions.Expression>();
         for (int index = 1; index < args.length; ++index){
-            Expression x = args[index];
+            Expression<?> x = args[index];
             params.add(((InternalSelection)x).getCurrentNode());
         }
 
         return new FunctionExpressionImpl<T>(metamodel, type, ((InternalSelection)args[0]).getCurrentNode().getFunctionWithArguments(name, params), buildList(args), name);
         }else{
-            return new FunctionExpressionImpl<T>(metamodel, type, new ExpressionBuilder().getFunction(name), new ArrayList(0), name);
+            return new FunctionExpressionImpl<T>(metamodel, type, new ExpressionBuilder().getFunction(name), new ArrayList<>(0), name);
         }
     }
 
@@ -2371,7 +2371,7 @@
      */
     @Override
     public <T> Expression<T> fromExpression(org.eclipse.persistence.expressions.Expression expression, Class<T> type) {
-        return new FunctionExpressionImpl<T>(this.metamodel, type, expression, new ArrayList(0));
+        return new FunctionExpressionImpl<T>(this.metamodel, type, expression, new ArrayList<>(0));
     }
 
     /**
@@ -2381,7 +2381,7 @@
      */
     @Override
     public Expression fromExpression(org.eclipse.persistence.expressions.Expression expression) {
-        return new FunctionExpressionImpl(this.metamodel, Object.class, expression, new ArrayList(0));
+        return new FunctionExpressionImpl(this.metamodel, Object.class, expression, new ArrayList<>(0));
     }
 
     /**
@@ -2671,7 +2671,7 @@
     @Override
     public <T> CriteriaDelete<T> createCriteriaDelete(Class<T> targetEntity) {
         if (targetEntity != null) {
-            TypeImpl type = ((MetamodelImpl)this.metamodel).getType(targetEntity);
+            TypeImpl<T> type = ((MetamodelImpl)this.metamodel).getType(targetEntity);
             if (type != null && type.getPersistenceType().equals(PersistenceType.ENTITY)) {
                 return new CriteriaDeleteImpl(this.metamodel, this, targetEntity);
             }
@@ -2682,7 +2682,7 @@
     @Override
     public <T> CriteriaUpdate<T> createCriteriaUpdate(Class<T> targetEntity) {
         if (targetEntity != null) {
-            TypeImpl type = ((MetamodelImpl)this.metamodel).getType(targetEntity);
+            TypeImpl<T> type = ((MetamodelImpl)this.metamodel).getType(targetEntity);
             if (type != null && type.getPersistenceType().equals(PersistenceType.ENTITY)) {
                 return new CriteriaUpdateImpl(this.metamodel, this, targetEntity);
             }
@@ -2693,7 +2693,7 @@
     @Override
     public <X, T, V extends T> Join<X, V> treat(Join<X, T> join, Class<V> type) {
         JoinImpl parentJoin = (JoinImpl)join;
-        JoinImpl joinImpl = new JoinImpl<X, V>(parentJoin, this.metamodel.managedType(type), this.metamodel,
+        JoinImpl<X, V> joinImpl = new JoinImpl<X, V>(parentJoin, this.metamodel.managedType(type), this.metamodel,
                 type, parentJoin.currentNode.treat(type), parentJoin.getModel(), parentJoin.getJoinType());
         parentJoin.joins.add(joinImpl);
         joinImpl.isJoin = parentJoin.isJoin;
@@ -2784,7 +2784,7 @@
     @Override
     public <X, T extends X> Root<T> treat(Root<X> root, Class<T> type) {
         RootImpl parentRoot = (RootImpl)root;
-        EntityType entity = this.metamodel.entity(type);
+        EntityType<T> entity = this.metamodel.entity(type);
         return new RootImpl<T>(entity, this.metamodel, type, parentRoot.currentNode.treat(type), entity);
     }
 }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaQueryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaQueryImpl.java
index 5b544c8..1a76351 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaQueryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/CriteriaQueryImpl.java
@@ -361,7 +361,7 @@
      */
     @Override
     public CriteriaQuery<T> orderBy(Order... o) {
-        this.orderBy = new ArrayList();
+        this.orderBy = new ArrayList<>();
         for (Order order : o) {
             this.orderBy.add(order);
         }
@@ -412,7 +412,7 @@
         Constructor constructor = null;
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(class1, constructorArgs, false));
+                constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(class1, constructorArgs, false));
             } else {
                 constructor = PrivilegedAccessHelper.getConstructorFor(class1, constructorArgs, false);
             }
@@ -523,7 +523,7 @@
                 reportQuery.setShouldReturnSingleAttribute(true);
             } else {
                 if (this.queryResult.equals(ResultType.TUPLE)) {
-                    reportQuery = new TupleQuery(this.selection == null ? new ArrayList() : this.selection.getCompoundSelectionItems());
+                    reportQuery = new TupleQuery(this.selection == null ? new ArrayList<>() : this.selection.getCompoundSelectionItems());
                 } else {
                     reportQuery = new ReportQuery();
                     reportQuery.setShouldReturnWithoutReportQueryResult(true);
@@ -672,7 +672,7 @@
         } else {
             ReportQuery reportQuery = null;
             if (this.queryResult.equals(ResultType.TUPLE)) {
-                List list = new ArrayList();
+                List list = new ArrayList<>();
                 list.add(this.selection);
                 reportQuery = new TupleQuery(list);
             } else {
@@ -713,7 +713,7 @@
             if (this.where != null && ((InternalSelection) this.where).getCurrentNode() != null && ((InternalSelection) this.where).getCurrentNode().getBuilder() != null && ((InternalSelection) this.where).getCurrentNode().getBuilder().getQueryClass() != null) {
                 query.setReferenceClass(((InternalSelection) this.where).getCurrentNode().getBuilder().getQueryClass());
             } else if (roots != null && ! roots.isEmpty()){
-                Root root = this.getRoots().iterator().next();
+                Root<?> root = this.getRoots().iterator().next();
                 query.setReferenceClass(root.getJavaType());
             }
         }
@@ -740,7 +740,7 @@
     public DatabaseQuery translate() {
         ObjectLevelReadQuery query = (ObjectLevelReadQuery)super.translate();
 
-        for (Iterator iterator = this.getRoots().iterator(); iterator.hasNext();) {
+        for (Iterator<Root<?>> iterator = this.getRoots().iterator(); iterator.hasNext();) {
             findJoins((FromImpl) iterator.next());
         }
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/ExpressionImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/ExpressionImpl.java
index a6c860f..26955f5 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/ExpressionImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/ExpressionImpl.java
@@ -78,7 +78,7 @@
 
     @Override
     public Predicate in(Object... values) {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new CompoundExpressionImpl(this.metamodel, this.currentNode.in(values), list, "in");
     }
@@ -99,7 +99,7 @@
                 // and route the execution to the right method
                 return in((Expression<Collection<?>>) values[0]);
             }
-            List list = new ArrayList();
+            List list = new ArrayList<>();
             list.add(this);
             if (values.length == 1 && ((InternalExpression) values[0]).isSubquery()) {
                 list.add(values[0]);
@@ -130,7 +130,7 @@
      */
     @Override
     public Predicate in(Collection<?> values) {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new InImpl(this.metamodel, this, values, list);
     }
@@ -142,7 +142,7 @@
      */
     @Override
     public Predicate in(Expression<Collection<?>> values) {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(values);
         list.add(this);
         return new InImpl(metamodel, this, (ExpressionImpl)values, list);
@@ -150,7 +150,7 @@
 
     @Override
     public Predicate isNotNull() {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new CompoundExpressionImpl(this.metamodel, this.currentNode.notNull(), list, "not null");
     }
@@ -158,7 +158,7 @@
 
     @Override
     public Predicate isNull() {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new CompoundExpressionImpl(this.metamodel, this.currentNode.isNull(), list, "is null");
     }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/FromImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/FromImpl.java
index 232333c..3286a7c 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/FromImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/FromImpl.java
@@ -17,8 +17,10 @@
 package org.eclipse.persistence.internal.jpa.querydef;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.Stack;
 
@@ -148,7 +150,7 @@
         if (((SingularAttribute)assoc).getType().getPersistenceType().equals(PersistenceType.BASIC)){
             throw new IllegalStateException(ExceptionLocalization.buildMessage("CAN_NOT_JOIN_TO_BASIC"));
         }
-        Class clazz = assoc.getBindableJavaType();
+        Class<Y> clazz = assoc.getBindableJavaType();
         Fetch<X, Y> join = null;
         ObjectExpression exp = ((ObjectExpression)this.currentNode).newDerivedExpressionNamed(assoc.getName());
         if (jt.equals(JoinType.LEFT)){
@@ -276,7 +278,7 @@
             return new PathImpl<Y>(this, this.metamodel, att.getBindableJavaType(),this.currentNode.get(att.getName()), att);
         }else{
             Class<Y> clazz = att.getBindableJavaType();
-            Join join = new JoinImpl<X, Y>(this, this.metamodel.managedType(clazz), this.metamodel, clazz,this.currentNode.get(att.getName()), att);
+            Join<X, Y> join = new JoinImpl<>(this, this.metamodel.managedType(clazz), this.metamodel, clazz,this.currentNode.get(att.getName()), att);
             this.joins.add(join);
             return join;
         }
@@ -294,7 +296,7 @@
     public <E, C extends java.util.Collection<E>> Expression<C> get(PluralAttribute<X, C, E> collection){
 
         // This is a special Expression that represents just the collection for member of etc...
-        return new ExpressionImpl<C>(this.metamodel, ClassConstants.Collection_Class ,this.currentNode.anyOf(collection.getName()));
+        return new ExpressionImpl<C>(this.metamodel, (Class<C>) ((Class<E>) Class.class) ,this.currentNode.anyOf(collection.getName()));
     }
 
     /**
@@ -306,7 +308,7 @@
      */
     @Override
     public <K, V, M extends java.util.Map<K, V>> Expression<M> get(MapAttribute<X, K, V> map){
-        return new ExpressionImpl<M>(this.metamodel, ClassConstants.Map_Class ,this.currentNode.anyOf(map.getName()));
+        return new ExpressionImpl<M>(this.metamodel, (Class<M>) ((Class<?>) Class.class) ,this.currentNode.anyOf(map.getName()));
     }
 
     /**
@@ -367,7 +369,7 @@
         if (((SingularAttribute)attribute).getType().getPersistenceType().equals(PersistenceType.BASIC)){
             throw new IllegalStateException(ExceptionLocalization.buildMessage("CAN_NOT_JOIN_TO_BASIC"));
         }
-        Class clazz = attribute.getBindableJavaType();
+        Class<Y> clazz = attribute.getBindableJavaType();
         Join<X, Y> join = null;
         ObjectExpression exp = ((ObjectExpression)this.currentNode).newDerivedExpressionNamed(attribute.getName());
         if (jt.equals(JoinType.LEFT)){
@@ -406,7 +408,7 @@
     @Override
     public <Y> CollectionJoin<X, Y> join(CollectionAttribute<? super X, Y> collection, JoinType jt) {
         org.eclipse.persistence.expressions.Expression node;
-        Class clazz = collection.getBindableJavaType();
+        Class<Y> clazz = collection.getBindableJavaType();
         CollectionJoin<X, Y> join = null;
         if (jt.equals(JoinType.INNER)) {
             node = this.currentNode.anyOf(collection.getName());
@@ -428,7 +430,7 @@
     @Override
     public <Y> SetJoin<X, Y> join(jakarta.persistence.metamodel.SetAttribute<? super X, Y> set, JoinType jt) {
         org.eclipse.persistence.expressions.Expression node;
-        Class clazz = set.getBindableJavaType();
+        Class<Y> clazz = set.getBindableJavaType();
         SetJoin<X, Y> join = null;
         if (jt.equals(JoinType.INNER)) {
             node = this.currentNode.anyOf(set.getName());
@@ -450,7 +452,7 @@
     @Override
     public <Y> ListJoin<X, Y> join(ListAttribute<? super X, Y> list, JoinType jt) {
         org.eclipse.persistence.expressions.Expression node;
-        Class clazz = list.getBindableJavaType();
+        Class<Y> clazz = list.getBindableJavaType();
         ListJoin<X, Y> join = null;
         if (jt.equals(JoinType.INNER)) {
             node = this.currentNode.anyOf(list.getName());
@@ -472,7 +474,7 @@
     @Override
     public <K, V> MapJoin<X, K, V> join(MapAttribute<? super X, K, V> map, JoinType jt) {
         org.eclipse.persistence.expressions.Expression node;
-        Class clazz = map.getBindableJavaType();
+        Class<V> clazz = map.getBindableJavaType();
         MapJoin<X, K, V> join = null;
         if (jt.equals(JoinType.INNER)) {
             node = this.currentNode.anyOf(map.getName());
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/FunctionExpressionImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/FunctionExpressionImpl.java
index b5c8ee8..8b62aa7 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/FunctionExpressionImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/FunctionExpressionImpl.java
@@ -44,7 +44,7 @@
         if (compoundExpressions != null){
             this.expressions = compoundExpressions;
         }else{
-            this.expressions = new ArrayList();
+            this.expressions = new ArrayList<>();
         }
     }
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/InImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/InImpl.java
index e708717..9b48188 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/InImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/InImpl.java
@@ -150,7 +150,7 @@
     @Override
     public Predicate not(){
         parentNode = this.getCurrentNode().not();
-        ArrayList list = new ArrayList();
+        List<Expression<?>> list = new ArrayList<>();
         list.add(this);
         CompoundExpressionImpl expr = new CompoundExpressionImpl(this.metamodel, parentNode, list, "not");
         expr.setIsNegated(true);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/JoinImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/JoinImpl.java
index fba26dc..9a17e67 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/JoinImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/JoinImpl.java
@@ -112,7 +112,7 @@
         if (((ExpressionImpl)this.on).isPredicate()) return (Predicate)this.on;
 
         //see queryBuilder.isTrue(this.on);
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this.on);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)this.on).getCurrentNode().equal(true), list, "equals");
     }
@@ -140,7 +140,7 @@
                         ((CompoundExpressionImpl)restrictions[i]).getCurrentNode());
                 ((CompoundExpressionImpl)a).setParentNode(currentNode);
                 ((CompoundExpressionImpl)restrictions[i]).setParentNode(currentNode);
-                ArrayList list = new ArrayList();
+                ArrayList list = new ArrayList<>();
                 list.add(a);
                 list.add(restrictions[i]);
                 a = new PredicateImpl(this.metamodel, currentNode, list, BooleanOperator.AND);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/PredicateImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/PredicateImpl.java
index ff2fc5d..fd64536 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/PredicateImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/PredicateImpl.java
@@ -94,7 +94,7 @@
             predicateImpl.setIsNegated(true);
             return predicateImpl;
         }
-        List<Expression<?>> list = new ArrayList();
+        List<Expression<?>> list = new ArrayList<>();
         list.add(this);
         predicateImpl = new PredicateImpl(this.metamodel, this.currentNode.not(), list, this.booloperator);
         predicateImpl.setIsNegated(true);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/SubQueryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/SubQueryImpl.java
index 9f3eb98..fac2310 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/SubQueryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/SubQueryImpl.java
@@ -87,8 +87,8 @@
             this.subQuery.setReferenceClass(result);
         }
         this.subQuery.setDistinctState(ObjectLevelReadQuery.DONT_USE_DISTINCT);
-        this.correlatedJoins = new HashSet();
-        this.correlations = new HashSet();
+        this.correlatedJoins = new HashSet<>();
+        this.correlations = new HashSet<>();
         this.currentNode = new SubSelectExpression(subQuery, new ExpressionBuilder());
         this.parent = parent;
     }
@@ -103,10 +103,10 @@
     @Override
     public Subquery<T> select(Expression<T> selection) {
         findRootAndParameters(selection);
-        for (Iterator iterator = this.getRoots().iterator(); iterator.hasNext();){
+        for (Iterator<Root<?>> iterator = this.getRoots().iterator(); iterator.hasNext();){
             findJoins((FromImpl)iterator.next());
         }
-        for (Iterator iterator = this.getCorrelatedJoins().iterator(); iterator.hasNext();){
+        for (Iterator<Join<?, ?>> iterator = this.getCorrelatedJoins().iterator(); iterator.hasNext();){
             findJoins((FromImpl)iterator.next());
         }
 
@@ -123,7 +123,7 @@
             }
             this.subQuery.setExpressionBuilder(((InternalSelection)selection.getCompoundSelectionItems().get(0)).getCurrentNode().getBuilder());
         } else {
-            TypeImpl type = ((MetamodelImpl)this.metamodel).getType(selection.getJavaType());
+            TypeImpl<? extends T> type = ((MetamodelImpl)this.metamodel).getType(selection.getJavaType());
             if (type != null && type.getPersistenceType().equals(PersistenceType.ENTITY)) {
                 this.subQuery.addAttribute("", new ConstantExpression(1, ((InternalSelection)selection).getCurrentNode().getBuilder()));
                 this.subQuery.addNonFetchJoinedAttribute(((InternalSelection)selection).getCurrentNode());
@@ -157,10 +157,10 @@
             currentNode = currentNode.and(exp);
         }
         this.subQuery.setSelectionCriteria(currentNode);
-        for (Iterator iterator = this.getRoots().iterator(); iterator.hasNext();){
+        for (Iterator<Root<?>> iterator = this.getRoots().iterator(); iterator.hasNext();){
             findJoins((FromImpl)iterator.next());
         }
-        for (Iterator iterator = this.getCorrelatedJoins().iterator(); iterator.hasNext();){
+        for (Iterator<Join<?, ?>> iterator = this.getCorrelatedJoins().iterator(); iterator.hasNext();){
             findJoins((FromImpl)iterator.next());
         }
         return this;
@@ -186,10 +186,10 @@
             currentNode = currentNode.and(exp);
         }
         this.subQuery.setSelectionCriteria(currentNode);
-        for (Iterator iterator = this.getRoots().iterator(); iterator.hasNext();){
+        for (Iterator<Root<?>> iterator = this.getRoots().iterator(); iterator.hasNext();){
             findJoins((FromImpl)iterator.next());
         }
-        for (Iterator iterator = this.getCorrelatedJoins().iterator(); iterator.hasNext();){
+        for (Iterator<Join<?, ?>> iterator = this.getCorrelatedJoins().iterator(); iterator.hasNext();){
             findJoins((FromImpl)iterator.next());
         }
         return this;
@@ -476,7 +476,7 @@
 
     @Override
     public Predicate in(Object... values) {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new CompoundExpressionImpl(this.metamodel, this.currentNode.in(values), list, "in");
     }
@@ -489,7 +489,7 @@
      */
     @Override
     public Predicate in(Expression<?>... values) {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         for (Expression exp: values){
             if (!((InternalExpression)exp).isLiteral() && !((InternalExpression) exp).isParameter()){
@@ -509,7 +509,7 @@
      */
     @Override
     public Predicate in(Collection<?> values) {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new CompoundExpressionImpl(this.metamodel, this.currentNode.in(values), list, "in");
     }
@@ -521,14 +521,14 @@
      */
     @Override
     public Predicate in(Expression<Collection<?>> values) {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new CompoundExpressionImpl(this.metamodel, this.currentNode.in(((InternalSelection)values).getCurrentNode()), list, "in");
     }
 
     @Override
     public Predicate isNotNull() {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new CompoundExpressionImpl(this.metamodel, this.currentNode.notNull(), list, "not null");
     }
@@ -536,7 +536,7 @@
 
     @Override
     public Predicate isNull() {
-        List list = new ArrayList();
+        List list = new ArrayList<>();
         list.add(this);
         return new CompoundExpressionImpl(this.metamodel, this.currentNode.isNull(), list, "is null");
     }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/ClassWeaver.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/ClassWeaver.java
index 3c4fe28..b74e7e6 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/ClassWeaver.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/ClassWeaver.java
@@ -748,8 +748,8 @@
         }
 
         if (classDetails.shouldWeaveValueHolders()) {
-            for (Iterator iterator = classDetails.getAttributesMap().values().iterator(); iterator.hasNext();) {
-                AttributeDetails attributeDetails = (AttributeDetails) iterator.next();
+            for (Iterator<AttributeDetails> iterator = classDetails.getAttributesMap().values().iterator(); iterator.hasNext();) {
+                AttributeDetails attributeDetails = iterator.next();
                 if (attributeDetails.weaveValueHolders()) { // &&
                                                             // !attributeDetails.isAttributeOnSuperClass())
                                                             // {
@@ -1409,8 +1409,8 @@
             boolean attributeAccess = false;
             // For each attribute we need to check what methods and variables to
             // add.
-            for (Iterator iterator = this.classDetails.getAttributesMap().values().iterator(); iterator.hasNext();) {
-                AttributeDetails attributeDetails = (AttributeDetails) iterator.next();
+            for (Iterator<AttributeDetails> iterator = this.classDetails.getAttributesMap().values().iterator(); iterator.hasNext();) {
+                AttributeDetails attributeDetails = iterator.next();
                 // Only add to classes that actually contain the attribute we
                 // are
                 // processing
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/PersistenceWeaver.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/PersistenceWeaver.java
index 9ebe5e7..76f166b 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/PersistenceWeaver.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/PersistenceWeaver.java
@@ -95,7 +95,7 @@
         final SessionLog log = AbstractSessionLog.getLog();
         // PERF: Is finest logging on weaving turned on?
         final boolean shouldLogFinest = log.shouldLog(SessionLog.FINEST, SessionLog.WEAVER);
-        final Map classDetailsMap = this.classDetailsMap;
+        final Map<String, ClassDetails> classDetailsMap = this.classDetailsMap;
         // Check if cleared already.
         if (classDetailsMap == null) {
             return null;
@@ -107,7 +107,7 @@
              * Thus, we must check the classDetailsMap to see if we are 'interested'
              * in the class.
              */
-            final ClassDetails classDetails = (ClassDetails)classDetailsMap.get(Helper.toSlashedClassName(className));
+            final ClassDetails classDetails = classDetailsMap.get(Helper.toSlashedClassName(className));
 
             if (classDetails != null) {
                 if (shouldLogFinest) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/TransformerFactory.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/TransformerFactory.java
index 0b626aa..6b3f246 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/TransformerFactory.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/TransformerFactory.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
@@ -111,7 +111,7 @@
      * We assume that if a mapping exists, the attribute must either be mapped from the owning
      * class or from a superclass.
      */
-    public void addClassDetailsForMappedSuperClasses(MetadataClass clz, ClassDescriptor initialDescriptor, ClassDetails classDetails, Map classDetailsMap, List unMappedAttributes, boolean weaveChangeTracking){
+    public void addClassDetailsForMappedSuperClasses(MetadataClass clz, ClassDescriptor initialDescriptor, ClassDetails classDetails, Map<String, ClassDetails> classDetailsMap, List<DatabaseMapping> unMappedAttributes, boolean weaveChangeTracking){
         MetadataClass superClz = clz.getSuperclass();
         if (superClz == null || superClz.isObject()){
             return;
@@ -127,7 +127,7 @@
 
         boolean weaveValueHolders = canWeaveValueHolders(superClz, unMappedAttributes);
 
-        List stillUnMappedMappings = null;
+        List<DatabaseMapping> stillUnMappedMappings = null;
         ClassDetails superClassDetails = createClassDetails(superClz, weaveValueHolders, weaveChangeTracking, weaveFetchGroups, weaveInternal, weaveRest);
         superClassDetails.setIsMappedSuperClass(true);
 
@@ -204,8 +204,8 @@
             }
 
             // hookup superClassDetails
-            for (Iterator i = classDetailsMap.values().iterator(); i.hasNext();) {
-                ClassDetails classDetails = (ClassDetails)i.next();
+            for (Iterator<ClassDetails> i = classDetailsMap.values().iterator(); i.hasNext();) {
+                ClassDetails classDetails = i.next();
                 ClassDetails superClassDetails = classDetailsMap.get(classDetails.getSuperClassName());
                 if (superClassDetails == null) {
                     ClassDescriptor descriptor = findDescriptor(session.getProject(), classDetails.getDescribedClass().getName());
@@ -220,8 +220,8 @@
 
             // Fix weaveChangeTracking based on superclasses,
             // we should only weave change tracking if our whole hierarchy can.
-            for (Iterator i = classDetailsMap.values().iterator(); i.hasNext();) {
-                ClassDetails classDetails = (ClassDetails)i.next();
+            for (Iterator<ClassDetails> i = classDetailsMap.values().iterator(); i.hasNext();) {
+                ClassDetails classDetails = i.next();
                 classDetails.setShouldWeaveChangeTracking(classDetails.canWeaveChangeTracking());
             }
         }
@@ -298,7 +298,7 @@
         classDetails.setShouldWeaveFetchGroups(weaveFetchGroups);
         classDetails.setShouldWeaveInternal(weaveInternal);
         classDetails.setShouldWeaveREST(weaveRest);
-        MetadataMethod method = metadataClass.getMethod("clone", new ArrayList(), false);
+        MetadataMethod method = metadataClass.getMethod("clone", new ArrayList<>(), false);
         classDetails.setImplementsCloneMethod(method != null);
         return classDetails;
     }
@@ -309,9 +309,9 @@
      * This avoids having to construct a project by class facilitating weaving
      */
     protected ClassDescriptor findDescriptor(Project project, String className){
-        Iterator iterator = project.getOrderedDescriptors().iterator();
+        Iterator<ClassDescriptor> iterator = project.getOrderedDescriptors().iterator();
         while (iterator.hasNext()){
-            ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
+            ClassDescriptor descriptor = iterator.next();
             if (descriptor.getJavaClassName().equals(className)){
                 return descriptor;
             }
@@ -344,7 +344,7 @@
         if (mapping.isAbstractDirectMapping() && mapping.getAttributeAccessor().isVirtualAttributeAccessor()){
             return metadataClass.getMetadataClass(((AbstractDirectMapping)mapping).getAttributeClassificationName());
         } else if (getterMethod != null) {
-            MetadataMethod method = metadataClass.getMethod(getterMethod, new ArrayList(), checkSuperclass);
+            MetadataMethod method = metadataClass.getMethod(getterMethod, new ArrayList<>(), checkSuperclass);
             if (method == null) {
                 return null;
             }
@@ -364,14 +364,14 @@
      *  Return the list of mappings that is not specifically found on the given class.  These attributes will
      *  be found on MappedSuperclasses.
      */
-    protected List storeAttributeMappings(MetadataClass metadataClass, ClassDetails classDetails, List mappings, boolean weaveValueHolders) {
-        List unMappedAttributes = new ArrayList();
+    protected List<DatabaseMapping> storeAttributeMappings(MetadataClass metadataClass, ClassDetails classDetails, List<DatabaseMapping> mappings, boolean weaveValueHolders) {
+        List<DatabaseMapping> unMappedAttributes = new ArrayList<>();
         Map<String, AttributeDetails> attributesMap = new HashMap<String, AttributeDetails>();
         Map<String, AttributeDetails> settersMap = new HashMap<String, AttributeDetails>();
         Map<String, AttributeDetails> gettersMap = new HashMap<String, AttributeDetails>();
 
-        for (Iterator iterator = mappings.iterator(); iterator.hasNext();) {
-            DatabaseMapping mapping = (DatabaseMapping)iterator.next();
+        for (Iterator<DatabaseMapping> iterator = mappings.iterator(); iterator.hasNext();) {
+            DatabaseMapping mapping = iterator.next();
 
             // Can't weave something that isn't really there and not going to be there.
             if (mapping.isMultitenantPrimaryKeyMapping()) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/PersistenceProvider.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/PersistenceProvider.java
index f4c18d6..0e0d4e2 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/PersistenceProvider.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/PersistenceProvider.java
@@ -183,7 +183,7 @@
      */
     @Override
     public EntityManagerFactory createEntityManagerFactory(String emName, Map properties){
-        Map nonNullProperties = (properties == null) ? new HashMap() : properties;
+        Map nonNullProperties = (properties == null) ? new HashMap<>() : properties;
 
         if (checkForProviderProperty(nonNullProperties)){
             String name = (emName == null) ? "" : emName;
@@ -243,7 +243,7 @@
     @Override
     public boolean generateSchema(String persistenceUnitName, Map properties) {
         String puName = (persistenceUnitName == null) ? "" : persistenceUnitName;
-        Map nonNullProperties = (properties == null) ? new HashMap() : properties;
+        Map nonNullProperties = (properties == null) ? new HashMap<>() : properties;
 
         // If not EclipseLink, do nothing.
         if (checkForProviderProperty(nonNullProperties)) {
@@ -320,7 +320,7 @@
         // Record that we are inside a JEE container to allow weaving for non managed persistence units.
         JavaSECMPInitializer.setIsInContainer(true);
 
-        Map nonNullProperties = (properties == null) ? new HashMap() : properties;
+        Map nonNullProperties = (properties == null) ? new HashMap<>() : properties;
 
         String forceTargetServer = EntityManagerFactoryProvider.getConfigPropertyAsString(SystemProperties.ENFORCE_TARGET_SERVER, null);
         if ("true".equalsIgnoreCase(forceTargetServer)) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveClassTransformer.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveClassTransformer.java
index 9a458db..a2cd1a4 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveClassTransformer.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveClassTransformer.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
@@ -112,7 +112,7 @@
             if (persistenceUnitsList==null) {
                 throw PersistenceUnitLoadingException.couldNotGetUnitInfoFromUrl(inputArchiveURL);
             }
-            Map emptyMap = new HashMap(0);
+            Map emptyMap = new HashMap<>(0);
             Iterator<SEPersistenceUnitInfo> persistenceUnitsIterator = persistenceUnitsList.iterator();
             while (persistenceUnitsIterator.hasNext()) {
                 SEPersistenceUnitInfo unitInfo = persistenceUnitsIterator.next();
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveProcessor.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveProcessor.java
index 8669d0d..168a263 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveProcessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveProcessor.java
@@ -40,7 +40,6 @@
 import org.eclipse.persistence.internal.localization.ToStringLocalization;
 import org.eclipse.persistence.jpa.Archive;
 import org.eclipse.persistence.logging.AbstractSessionLog;
-import org.eclipse.persistence.logging.DefaultSessionLog;
 import org.eclipse.persistence.logging.SessionLog;
 
 /**
@@ -258,9 +257,9 @@
         Archive sourceArchive =(new ArchiveFactoryImpl()).createArchive(source, null, null);
         if (sourceArchive != null) {
             try {
-                Iterator entries = sourceArchive.getEntries();
+                Iterator<String> entries = sourceArchive.getEntries();
                 while (entries.hasNext()){
-                    String entryName = (String)entries.next();
+                    String entryName = entries.next();
                     InputStream entryInputStream = sourceArchive.getEntry(entryName);
 
                     // Add a directory entry
@@ -280,7 +279,7 @@
                     byte[] originalClassBytes=null;
                     byte[] transferredClassBytes=null;
                     try {
-                        Class thisClass = this.classLoader.loadClass(className);
+                        Class<?> thisClass = this.classLoader.loadClass(className);
                         // If the class is not in the classpath, we simply copy the entry
                         // to the target(no weaving).
                         if (thisClass == null){
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/IDResolverWrapper.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/IDResolverWrapper.java
index 429d815..6a40d82 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/IDResolverWrapper.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/IDResolverWrapper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -106,7 +106,7 @@
     public Callable<?> resolve(Object id, Class targetType) throws SAXException {
         try {
             Object[] params = new Object[] { id.toString(), targetType };
-            return (Callable<?>) PrivilegedAccessHelper.invokeMethod(this.resolveMethod, this.resolver, params);
+            return PrivilegedAccessHelper.invokeMethod(this.resolveMethod, this.resolver, params);
         } catch (Exception ex) {
             throw XMLMarshalException.errorInvokingIDResolver(RESOLVE_METHOD_NAME, this.resolver, ex);
         }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/MultiArgInstantiationPolicy.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/MultiArgInstantiationPolicy.java
index 9d9cac0..f4fefda 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/MultiArgInstantiationPolicy.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/MultiArgInstantiationPolicy.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
@@ -63,7 +63,7 @@
                     try{
                         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                             try {
-                                values[i] = AccessController.doPrivileged(new PrivilegedClassForName(parameterTypeNames[i], true, loader));
+                                values[i] = AccessController.doPrivileged(new PrivilegedClassForName<>(parameterTypeNames[i], true, loader));
                             } catch (PrivilegedActionException exception) {
                                 throw ValidationException.classNotFoundWhileConvertingClassNames(parameterTypeNames[i], exception.getException());
                             }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/XMLJavaTypeConverter.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/XMLJavaTypeConverter.java
index 3f09a8b..675d9ef 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/XMLJavaTypeConverter.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/XMLJavaTypeConverter.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
@@ -51,7 +51,7 @@
 public class XMLJavaTypeConverter extends org.eclipse.persistence.oxm.mappings.converters.XMLConverterAdapter {
     protected Class boundType = Object.class;
     protected Class valueType = Object.class;
-    protected Class xmlAdapterClass;
+    protected Class<?> xmlAdapterClass;
     protected String xmlAdapterClassName;
     protected XmlAdapter xmlAdapter;
     protected QName schemaType;
@@ -241,7 +241,7 @@
         if (xmlAdapterClass == null) {
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    xmlAdapterClass = AccessController.doPrivileged(new PrivilegedClassForName(getXmlAdapterClassName(), true, loader));
+                    xmlAdapterClass = AccessController.doPrivileged(new PrivilegedClassForName<>(getXmlAdapterClassName(), true, loader));
                 } else {
                     xmlAdapterClass = PrivilegedAccessHelper.getClassForName(getXmlAdapterClassName(), true, loader);
                 }
@@ -260,14 +260,14 @@
         try {
         try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    xmlAdapter = (XmlAdapter) AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(getXmlAdapterClass()));
+                    xmlAdapter = (XmlAdapter) AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(getXmlAdapterClass()));
                 } else {
                     xmlAdapter = (XmlAdapter) PrivilegedAccessHelper.newInstanceFromClass(getXmlAdapterClass());
                 }
             } catch (IllegalAccessException e) {
                 Constructor ctor = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                        ctor = AccessController.doPrivileged(new PrivilegedGetConstructorFor(xmlAdapterClass, new Class[0], true));
+                        ctor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(xmlAdapterClass, new Class[0], true));
                 } else {
                     ctor = PrivilegedAccessHelper.getDeclaredConstructorFor(xmlAdapterClass, new Class[0], true);
                 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContext.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContext.java
index 3c7d3ff..4a97ca5 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContext.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContext.java
@@ -1498,7 +1498,7 @@
                     } else if (type == CoreClassConstants.XML_GREGORIAN_CALENDAR) {
                         name = Constants.ANY_SIMPLE_TYPE_QNAME;
                     } else {
-                        name = (QName) XMLConversionManager.getDefaultJavaTypes().get(type);
+                        name = XMLConversionManager.getDefaultJavaTypes().get(type);
                     }
                 }
             }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBEnumTypeConverter.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBEnumTypeConverter.java
index d9d7ad1..87404ae 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBEnumTypeConverter.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBEnumTypeConverter.java
@@ -63,7 +63,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    m_enumClass = AccessController.doPrivileged(new PrivilegedClassForName(m_enumClassName, true, classLoader));
+                    m_enumClass = AccessController.doPrivileged(new PrivilegedClassForName<>(m_enumClassName, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(m_enumClassName, exception.getException());
                 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshaller.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshaller.java
index 3eef795..1a8faf9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshaller.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshaller.java
@@ -188,7 +188,7 @@
                 return xmlroot;
             }
         } else {
-            xmlroot.setSchemaType((QName) org.eclipse.persistence.internal.oxm.XMLConversionManager.getDefaultJavaTypes().get(elt.getDeclaredType()));
+            xmlroot.setSchemaType(org.eclipse.persistence.internal.oxm.XMLConversionManager.getDefaultJavaTypes().get(elt.getDeclaredType()));
         }
 
         if (elt instanceof WrappedValue) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshaller.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshaller.java
index 6b465a1..510a2a7 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshaller.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshaller.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
@@ -1198,9 +1198,9 @@
                 value = null;
             } else if(null == xsiType) {
                 if (clazz == CoreClassConstants.ABYTE || clazz == CoreClassConstants.APBYTE || clazz.getCanonicalName().equals("jakarta.activation.DataHandler")) {
-                    value = (T) xcm.convertObject(stringBuilder.toString(), clazz, Constants.BASE_64_BINARY_QNAME);
+                    value = xcm.convertObject(stringBuilder.toString(), clazz, Constants.BASE_64_BINARY_QNAME);
                 } else {
-                    value = (T) xcm.convertObject(stringBuilder.toString(), clazz);
+                    value = xcm.convertObject(stringBuilder.toString(), clazz);
                 }
             } else {
                 int colonIndex = xsiType.indexOf(':');
@@ -1216,7 +1216,7 @@
                 }
                 String typeNamespace = namespaces.get(typePrefix);
                 QName typeQName = new QName(typeNamespace, typeName);
-                value = (T) xcm.convertObject(stringBuilder.toString(), clazz, typeQName);
+                value = xcm.convertObject(stringBuilder.toString(), clazz, typeQName);
 
             }
 
@@ -1324,7 +1324,7 @@
             if (xsiNil) {
                 value = null;
             } else {
-                value = (E) xcm.convertObject(stringBuffer.toString(), componentClass);
+                value = xcm.convertObject(stringBuffer.toString(), componentClass);
             }
             addValue(value);
             stringBuffer.reset();
@@ -1345,7 +1345,7 @@
 
             while (st.hasMoreTokens()) {
                 String nextToken = st.nextToken();
-                value = (E) xcm.convertObject(nextToken, componentClass);
+                value = xcm.convertObject(nextToken, componentClass);
                 addValue(value);
             }
             stringBuffer.reset();
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/AnnotationsProcessor.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/AnnotationsProcessor.java
index 70206cf..fef80cf 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/AnnotationsProcessor.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/AnnotationsProcessor.java
@@ -373,7 +373,7 @@
                                     qname = Constants.ANY_SIMPLE_TYPE_QNAME;
                                 } else {
                                     Class theClass = helper.getClassForJavaClass(nextClass);
-                                    qname = (QName) XMLConversionManager.getDefaultJavaTypes().get(theClass);
+                                    qname = XMLConversionManager.getDefaultJavaTypes().get(theClass);
                                 }
                             }
                         }
@@ -738,7 +738,7 @@
         if(xmlAccessorFactory != null) {
             Class xmlAccessorFactoryClass = null;
             try {
-                xmlAccessorFactoryClass = (Class)PrivilegedAccessHelper.invokeMethod(valueMethod, xmlAccessorFactory, new Object[]{});
+                xmlAccessorFactoryClass = PrivilegedAccessHelper.invokeMethod(valueMethod, xmlAccessorFactory, new Object[]{});
                 info.setXmlAccessorFactory(new AccessorFactoryWrapper(PrivilegedAccessHelper.newInstanceFromClass(xmlAccessorFactoryClass)));
             } catch (Exception ex) {
                 throw JAXBException.errorInstantiatingAccessorFactory(xmlAccessorFactoryClass, ex);
@@ -1344,7 +1344,7 @@
             Object seeAlso = helper.getAnnotation(javaClass, xmlSeeAlsoClass);
             Class[] values = null;
             try {
-                values = (Class[]) PrivilegedAccessHelper.invokeMethod(valueMethod, seeAlso, new Object[] {});
+                values = PrivilegedAccessHelper.invokeMethod(valueMethod, seeAlso, new Object[] {});
             } catch (Exception ex) {
             }
 
@@ -1951,7 +1951,7 @@
                         if (helper.isAnnotationPresent(javaField, XmlAttribute.class)) {
                             Object value = ((JavaFieldImpl) javaField).get(null);
                             if (value != null) {
-                                String stringValue = (String) XMLConversionManager.getDefaultXMLManager().convertObject(value, String.class, property.getSchemaType());
+                                String stringValue = XMLConversionManager.getDefaultXMLManager().convertObject(value, String.class, property.getSchemaType());
                                 property.setFixedValue(stringValue);
                             }
                         }
@@ -2486,7 +2486,7 @@
             try{
                 Method requireMethod = PrivilegedAccessHelper.getMethod(XmlElementRef.class, "required", new Class[0], true);
                 if(requireMethod != null){
-                    Boolean val = (Boolean)PrivilegedAccessHelper.invokeMethod(requireMethod, nextRef);
+                    Boolean val = PrivilegedAccessHelper.invokeMethod(requireMethod, nextRef);
                     property.setIsRequired(val);
                 }
             } catch (Exception exception){
@@ -3399,7 +3399,7 @@
             // reflectively load XmlSchema class to avoid dependency
             try {
                 Method locationMethod = PrivilegedAccessHelper.getDeclaredMethod(XmlSchema.class, "location", new Class[] {});
-                String location = (String) PrivilegedAccessHelper.invokeMethod(locationMethod, xmlSchema, new Object[] {});
+                String location = PrivilegedAccessHelper.invokeMethod(locationMethod, xmlSchema, new Object[] {});
 
                 if (location != null) {
                     if (location.equals("##generate")) {
@@ -3603,7 +3603,7 @@
                 Annotation xmlAccessorFactory = helper.getAnnotation(pack, CompilerHelper.ACCESSOR_FACTORY_ANNOTATION_CLASS);
                 Class xmlAccessorFactoryClass = null;
                 try {
-                    xmlAccessorFactoryClass = (Class)PrivilegedAccessHelper.invokeMethod(CompilerHelper.ACCESSOR_FACTORY_VALUE_METHOD, xmlAccessorFactory, new Object[]{});
+                    xmlAccessorFactoryClass = PrivilegedAccessHelper.invokeMethod(CompilerHelper.ACCESSOR_FACTORY_VALUE_METHOD, xmlAccessorFactory, new Object[]{});
                     packageInfo.setAccessorFactory(new AccessorFactoryWrapper(PrivilegedAccessHelper.newInstanceFromClass(xmlAccessorFactoryClass)));
                 } catch (Exception ex) {
                     throw JAXBException.errorInstantiatingAccessorFactory(xmlAccessorFactoryClass, ex);
@@ -3612,7 +3612,7 @@
                 Annotation xmlAccessorFactory = helper.getAnnotation(pack, CompilerHelper.OLD_ACCESSOR_FACTORY_ANNOTATION_CLASS);
                 Class xmlAccessorFactoryClass = null;
                 try {
-                    xmlAccessorFactoryClass = (Class)PrivilegedAccessHelper.invokeMethod(CompilerHelper.OLD_ACCESSOR_FACTORY_VALUE_METHOD, xmlAccessorFactory, new Object[]{});
+                    xmlAccessorFactoryClass = PrivilegedAccessHelper.invokeMethod(CompilerHelper.OLD_ACCESSOR_FACTORY_VALUE_METHOD, xmlAccessorFactory, new Object[]{});
                     packageInfo.setAccessorFactory(new AccessorFactoryWrapper(PrivilegedAccessHelper.newInstanceFromClass(xmlAccessorFactoryClass)));
                 } catch (Exception ex) {
                     throw JAXBException.errorInstantiatingAccessorFactory(xmlAccessorFactoryClass, ex);
@@ -3621,7 +3621,7 @@
                 Annotation xmlAccessorFactory = helper.getAnnotation(pack, CompilerHelper.INTERNAL_ACCESSOR_FACTORY_ANNOTATION_CLASS);
                 Class xmlAccessorFactoryClass = null;
                 try {
-                    xmlAccessorFactoryClass = (Class)PrivilegedAccessHelper.invokeMethod(CompilerHelper.INTERNAL_ACCESSOR_FACTORY_VALUE_METHOD, xmlAccessorFactory, new Object[]{});
+                    xmlAccessorFactoryClass = PrivilegedAccessHelper.invokeMethod(CompilerHelper.INTERNAL_ACCESSOR_FACTORY_VALUE_METHOD, xmlAccessorFactory, new Object[]{});
                     packageInfo.setAccessorFactory(new AccessorFactoryWrapper(PrivilegedAccessHelper.newInstanceFromClass(xmlAccessorFactoryClass)));
                 } catch (Exception ex) {
                     throw JAXBException.errorInstantiatingAccessorFactory(xmlAccessorFactoryClass, ex);
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
index 4918e06..30100f5 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MappingsGenerator.java
@@ -2119,7 +2119,7 @@
                         Class declaredClass;
                         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                                 try {
-                                    declaredClass = AccessController.doPrivileged(new PrivilegedClassForName(componentType.getRawName(), false, helper.getClassLoader()));
+                                    declaredClass = AccessController.doPrivileged(new PrivilegedClassForName<>(componentType.getRawName(), false, helper.getClassLoader()));
                                 } catch (PrivilegedActionException exception) {
                                     throw JAXBException.classNotFoundException(componentType.getRawName());
                                 }
@@ -2139,7 +2139,7 @@
                         Class declaredClass;
                         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                                 try {
-                                    declaredClass = AccessController.doPrivileged(new PrivilegedClassForName(itemType.getRawName(), false, helper.getClassLoader()));
+                                    declaredClass = AccessController.doPrivileged(new PrivilegedClassForName<>(itemType.getRawName(), false, helper.getClassLoader()));
                                 } catch (PrivilegedActionException exception) {
                                     throw JAXBException.classNotFoundException(itemType.getRawName());
                                 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java
index ccf474e..308f510 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.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
@@ -68,7 +68,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try{
-                    domainClass = AccessController.doPrivileged(new PrivilegedClassForName(domainClassName, true, loader));
+                    domainClass = AccessController.doPrivileged(new PrivilegedClassForName<>(domainClassName, true, loader));
                 }catch (PrivilegedActionException ex){
                     if (ex.getCause() instanceof ClassNotFoundException){
                         throw (ClassNotFoundException) ex.getCause();
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java
index d0cfb9d..89ee438 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.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
@@ -68,7 +68,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try{
-                    domainClass = AccessController.doPrivileged(new PrivilegedClassForName(domainClassName, true, loader));
+                    domainClass = AccessController.doPrivileged(new PrivilegedClassForName<>(domainClassName, true, loader));
                 }catch (PrivilegedActionException ex){
                     if (ex.getCause() instanceof ClassNotFoundException){
                         throw (ClassNotFoundException) ex.getCause();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/generics/Root.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/generics/Root.java
index cb7a922..f38a1a9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/generics/Root.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/generics/Root.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -20,7 +20,7 @@
 @XmlRootElement
 public class Root {
 
-    @XmlJavaTypeAdapter(AAdapter.class)
+    @XmlJavaTypeAdapter(value = AAdapter.class)
     public A<B> a;
 
     public boolean equals(Object obj) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementrefs/adapter/XmlElementRefsAdapterTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementrefs/adapter/XmlElementRefsAdapterTestCases.java
index fcfa376..d03833d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementrefs/adapter/XmlElementRefsAdapterTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementrefs/adapter/XmlElementRefsAdapterTestCases.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
@@ -46,8 +46,8 @@
         Foo f = new Foo();
         f.e1OrE2 = new ArrayList<JAXBElement<byte[]>>();
 
-        byte[] bytes = (byte[]) XMLConversionManager.getDefaultXMLManager().convertObject("001122", byte[].class);
-        byte[] bytes2 = (byte[]) XMLConversionManager.getDefaultXMLManager().convertObject("cafe", byte[].class, Constants.BASE_64_BINARY_QNAME);
+        byte[] bytes = XMLConversionManager.getDefaultXMLManager().convertObject("001122", byte[].class);
+        byte[] bytes2 = XMLConversionManager.getDefaultXMLManager().convertObject("cafe", byte[].class, Constants.BASE_64_BINARY_QNAME);
 
         JAXBElement jb1= new JAXBElement(new QName("e1"), byte[].class, bytes);
         f.e1OrE2.add(jb1);
@@ -63,8 +63,8 @@
         Foo f = new Foo();
         f.e1OrE2 = new ArrayList<JAXBElement<byte[]>>();
 
-        byte[] bytes = (byte[]) XMLConversionManager.getDefaultXMLManager().convertObject("001122", byte[].class);
-        byte[] bytes2 = (byte[]) XMLConversionManager.getDefaultXMLManager().convertObject("cafe", byte[].class, Constants.BASE_64_BINARY_QNAME);
+        byte[] bytes = XMLConversionManager.getDefaultXMLManager().convertObject("001122", byte[].class);
+        byte[] bytes2 = XMLConversionManager.getDefaultXMLManager().convertObject("cafe", byte[].class, Constants.BASE_64_BINARY_QNAME);
 
         JAXBElement jb1= new JAXBElement(new QName("e1"), byte[].class, bytes);
         JAXBElement jb2= new JAXBElement(new QName("e2"), byte[].class, bytes2);
@@ -80,7 +80,7 @@
         Binder binder = jaxbContext.createBinder();
         Document doc = parser.parse(ClassLoader.getSystemResourceAsStream(XML_RESOURCE));
         Foo unmarshalled =  (Foo)binder.unmarshal(doc);
-        byte[] bytes = (byte[]) XMLConversionManager.getDefaultXMLManager().convertObject("001122", byte[].class);
+        byte[] bytes = XMLConversionManager.getDefaultXMLManager().convertObject("001122", byte[].class);
         JAXBElement jbe= new JAXBElement(new QName("e1"), byte[].class, bytes);
         unmarshalled.e1OrE2.add(jbe);
         binder.updateXML(unmarshalled);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/binarydatacollection/EmployeeWithByteArrayObject.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/binarydatacollection/EmployeeWithByteArrayObject.java
index a81ebd5..a93ce97 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/binarydatacollection/EmployeeWithByteArrayObject.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/binarydatacollection/EmployeeWithByteArrayObject.java
@@ -80,7 +80,7 @@
                 if (next != null) {
                     returnString += next + " ";
                     if(next instanceof Byte[]) {
-                        returnString = "\n" + "-->" + new String(Base64.base64Encode(((byte[])ConversionManager.getDefaultManager().convertObject(next, byte[].class))));
+                        returnString = "\n" + "-->" + new String(Base64.base64Encode(ConversionManager.getDefaultManager().convertObject(next, byte[].class)));
                     }
                 } else {
                     returnString += ("null_item" + " ");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/simpletypes/typetranslator/childelement/Phone.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/simpletypes/typetranslator/childelement/Phone.java
index a5331d2..ad87418 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/simpletypes/typetranslator/childelement/Phone.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/simpletypes/typetranslator/childelement/Phone.java
@@ -32,7 +32,7 @@
     }
 
     public String toString() {
-        return "Phone(number=" + (Integer) number + ")";
+        return "Phone(number=" + number + ")";
     }
 
     public boolean equals(Object object) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/platform/PlatformCreateDocumentTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/platform/PlatformCreateDocumentTestCases.java
index 92a4a6a..e31b828 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/platform/PlatformCreateDocumentTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/platform/PlatformCreateDocumentTestCases.java
@@ -169,8 +169,8 @@
     }
 
     public void testCreateInvalidXMLPlatform() throws Exception {
-        Class originalClass = XMLPlatformFactory.getInstance().getXMLPlatformClass();
-        XMLPlatformFactory.getInstance().setXMLPlatformClass(PlatformCreateDocumentTestCases.class);
+        Class<? extends XMLPlatform> originalClass = XMLPlatformFactory.getInstance().getXMLPlatformClass();
+        XMLPlatformFactory.getInstance().setXMLPlatformClass((Class) PlatformCreateDocumentTestCases.class);
         try {
             XMLPlatform xmlPlatform = XMLPlatformFactory.getInstance().getXMLPlatform();
         } catch (XMLPlatformException e) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/BooleanTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/BooleanTestCases.java
index 08e4fed..54012b3 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/BooleanTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/BooleanTestCases.java
@@ -32,12 +32,12 @@
     }
 
     public void testConvertEmptyStringTo_boolean() {
-        boolean test = (Boolean) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, boolean.class);
+        boolean test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, boolean.class);
         assertEquals(false, test);
     }
 
     public void testConvertEmptyStringTo_Boolean() {
-        Boolean test = (Boolean) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Boolean.class);
+        Boolean test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Boolean.class);
         assertEquals(false, test.booleanValue());
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/DateAndTimeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/DateAndTimeTestCases.java
index ab1d77c..0d4d76b 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/DateAndTimeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/DateAndTimeTestCases.java
@@ -137,49 +137,49 @@
 
     public void testUtilDateToUtilDate() {
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_1MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(control, java.util.Date.class);
+        java.util.Date test = xcm.convertObject(control, java.util.Date.class);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_default_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class);
+        String test = xcm.convertObject(utilDate, String.class);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_default_0ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21T07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class);
+        String test = xcm.convertObject(utilDate, String.class);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_default_1ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_1MS);
         String control = "1975-02-21T07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class);
+        String test = xcm.convertObject(utilDate, String.class);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_default_10ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_10MS);
         String control = "1975-02-21T07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class);
+        String test = xcm.convertObject(utilDate, String.class);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_default_100ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_100MS);
         String control = "1975-02-21T07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class);
+        String test = xcm.convertObject(utilDate, String.class);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_date_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
@@ -197,7 +197,7 @@
         cal.set(Calendar.MILLISECOND, 1);
         java.util.Date utilDate = cal.getTime();
 
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         boolean passed = control.equals(test) || zControl.equals(test);
         assertTrue(passed);
     }
@@ -219,154 +219,154 @@
 
         java.util.Date utilDate = cal.getTime();
 
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_date() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21";
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_dateTime_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_dateTime_0ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21T07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_dateTime_1ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_1MS);
         String control = "1975-02-21T07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_dateTime_10ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_10MS);
         String control = "1975-02-21T07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_dateTime_100ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_100MS);
         String control = "1975-02-21T07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_time_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_time_0ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_time_1ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_1MS);
         String control = "07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_time_10ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_10MS);
         String control = "07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_time_100ms() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_100MS);
         String control = "07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gDay_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gDay() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "---21";
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gMonth_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gMonth() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "--02";
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gMonthDay_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gMonthDay() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "--02-21";
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gYear_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gYear() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975";
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gYearMonth_null() {
         java.util.Date utilDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testUtilDateToString_gYearMonth() {
         java.util.Date utilDate = new java.util.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975-02";
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -374,8 +374,8 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.util.Date utilDate = (java.util.Date) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.util.Date.class);
-        String testString = (String) xmlConversionManager.convertObject(utilDate, String.class);
+        java.util.Date utilDate = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.util.Date.class);
+        String testString = xmlConversionManager.convertObject(utilDate, String.class);
         assertEquals("2003-08-29T03:00:00-04:00", testString);
     }
 
@@ -383,8 +383,8 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.util.Date utilDate = (java.util.Date) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.util.Date.class);
-        String testString = (String) xmlConversionManager.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Date utilDate = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.util.Date.class);
+        String testString = xmlConversionManager.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals("2003-08-29T03:00:00-04:00", testString);
     }
 
@@ -392,43 +392,43 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.util.Date utilDate = (java.util.Date) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.util.Date.class);
-        String testString = (String) xmlConversionManager.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
+        java.util.Date utilDate = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.util.Date.class);
+        String testString = xmlConversionManager.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals("03:00:00-04:00", testString);
     }
 
     public void testStringToUtilDate_default_null() {
         String string = null;
         java.util.Date control = null;
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_default_0ms() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_0MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_default_1ms() {
         String string = " \t 1975-02-21T07:47:15.001 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_1MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_default_10ms() {
         String string = " \t 1975-02-21T07:47:15.01 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_10MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_default_100ms() {
         String string = " \t 1975-02-21T07:47:15.1 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_100MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class);
         assertEquals(control, test);
     }
 
@@ -490,21 +490,21 @@
     public void testStringToUtilDate_date_null() {
         String string = null;
         java.util.Date control = null;
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_date() {
         String string = " \t 1975-02-21 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_date_negative1() {
         String string = "1975-02-21T07:47:15";
         java.util.Date control = new java.util.Date(CONTROL_DATE);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
@@ -544,42 +544,42 @@
     public void testStringToUtilDate_dateTime_null() {
         String string = null;
         java.util.Date control = null;
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_dateTime() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_0MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_dateTime_0ms() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_0MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_dateTime_1ms() {
         String string = " \t 1975-02-21T07:47:15.001 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_1MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_dateTime_10ms() {
         String string = " \t 1975-02-21T07:47:15.01 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_10MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_dateTime_100ms() {
         String string = " \t 1975-02-21T07:47:15.1 \t ";
         java.util.Date control = new java.util.Date(CONTROL_DATE_TIME_100MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -630,42 +630,42 @@
     public void testStringToUtilDate_time_null() {
         String string = null;
         java.util.Date control = null;
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_time() {
         String string = " \t 07:47:15 \t ";
         java.util.Date control = new java.util.Date(CONTROL_TIME_0MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_time_0ms() {
         String string = " \t 07:47:15 \t ";
         java.util.Date control = new java.util.Date(CONTROL_TIME_0MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_time_1ms() {
         String string = " \t 07:47:15.001 \t ";
         java.util.Date control = new java.util.Date(CONTROL_TIME_1MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_time_10ms() {
         String string = " \t 07:47:15.01 \t ";
         java.util.Date control = new java.util.Date(CONTROL_TIME_10MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_time_100ms() {
         String string = " \t 07:47:15.1 \t ";
         java.util.Date control = new java.util.Date(CONTROL_TIME_100MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -714,14 +714,14 @@
     public void testStringToUtilDate_gDay_null() {
         String string = null;
         java.util.Date control = null;
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.G_DAY_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_gDay() {
         String string = " \t ---21 \t ";
         java.util.Date control = new java.util.Date(CONTROL_G_DAY);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.G_DAY_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -739,14 +739,14 @@
     public void testStringToUtilDate_gMonth_null() {
         String string = null;
         java.util.Date control = null;
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.G_MONTH_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_gMonth() {
         String string = " \t --02 \t ";
         java.util.Date control = new java.util.Date(CONTROL_G_MONTH);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.G_MONTH_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -764,14 +764,14 @@
     public void testStringToUtilDate_gMonthDay_null() {
         String string = null;
         java.util.Date control = null;
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_gMonthDay() {
         String string = " \t --02-21 \t ";
         java.util.Date control = new java.util.Date(CONTROL_G_MONTH_DAY);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -789,14 +789,14 @@
     public void testStringToUtilDate_gYear_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_gYear() {
         String string = " \t 1975 \t ";
         java.util.Date control = new java.util.Date(CONTROL_G_YEAR);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
@@ -814,14 +814,14 @@
     public void testStringToUtilDate_gYearMonth_null() {
         String string = null;
         java.util.Date control = null;
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToUtilDate_gYearMonth() {
         String string = " \t 1975-02 \t ";
         java.util.Date control = new java.sql.Date(CONTROL_G_YEAR_MONTH);
-        java.util.Date test = (java.util.Date)xcm.convertObject(string, java.util.Date.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.util.Date test = xcm.convertObject(string, java.util.Date.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -839,175 +839,175 @@
     // -------------------------------------------------------------------------
     public void testSqlDateToSqlDate() {
         java.sql.Date control = new java.sql.Date(CONTROL_DATE);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(control, java.sql.Date.class);
+        java.sql.Date test = xcm.convertObject(control, java.sql.Date.class);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_default_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class);
+        String test = xcm.convertObject(sqlDate, String.class);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_default() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21";
-        String test = (String)xcm.convertObject(sqlDate, String.class);
+        String test = xcm.convertObject(sqlDate, String.class);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_date_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_date() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21";
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_dateTime_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_dateTime_0ms() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21T07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_dateTime_1ms() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_1MS);
         String control = "1975-02-21T07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_dateTime_10ms() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_10MS);
         String control = "1975-02-21T07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_dateTime_100ms() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_100MS);
         String control = "1975-02-21T07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_time_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_time_0ms() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_time_1ms() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_1MS);
         String control = "07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_time_10ms() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_10MS);
         String control = "07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_time_100ms() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_100MS);
         String control = "07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gDay_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gDay() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "---21";
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gMonth_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gMonth() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "--02";
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gMonthDay_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gMonthDay() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "--02-21";
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gYear_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gYear() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975";
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gYearMonth_null() {
         java.sql.Date sqlDate = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlDateToString_gYearMonth() {
         java.sql.Date sqlDate = new java.sql.Date(CONTROL_DATE_TIME_0MS);
         String control = "1975-02";
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -1015,8 +1015,8 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.sql.Date sqlDate = (java.sql.Date) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
-        String testString = (String) xmlConversionManager.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Date sqlDate = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
+        String testString = xmlConversionManager.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals("2003-08-29T03:00:00-04:00", testString);
     }
 
@@ -1024,29 +1024,29 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.sql.Date sqlDate = (java.sql.Date) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
-        String testString = (String) xmlConversionManager.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
+        java.sql.Date sqlDate = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
+        String testString = xmlConversionManager.convertObject(sqlDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals("03:00:00-04:00", testString);
     }
 
     public void testStringToSqlDate_default_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_default() {
         String string = " \t 1975-02-21 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_default_negative1() {
         String string = "1975-02-21T07:47:15";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class);
         assertEquals(control, test);
     }
 
@@ -1075,21 +1075,21 @@
     public void testStringToSqlDate_date_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_date() {
         String string = " \t 1975-02-21 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_date_negative1() {
         String string = "1975-02-21T07:47:15";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class);
         assertEquals(control, test);
     }
 
@@ -1118,42 +1118,42 @@
     public void testStringToSqlDate_dateTime_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_dateTime() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_dateTime_0ms() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_dateTime_1ms() {
         String string = " \t 1975-02-21T07:47:15.001 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_dateTime_10ms() {
         String string = " \t 1975-02-21T07:47:15.01 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_dateTime_100ms() {
         String string = " \t 1975-02-21T07:47:15.1 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_DATE_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -1204,42 +1204,42 @@
     public void testStringToSqlDate_time_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_time() {
         String string = " \t 07:47:15 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_time_0ms() {
         String string = " \t 07:47:15 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_time_1ms() {
         String string = " \t 07:47:15.001 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_time_10ms() {
         String string = " \t 07:47:15.01 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_time_100ms() {
         String string = " \t 07:47:15.1 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_TIME_0MS);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -1279,14 +1279,14 @@
     public void testStringToSqlDate_gDay_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_DAY_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_gDay() {
         String string = " \t ---21 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_G_DAY);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_DAY_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -1304,14 +1304,14 @@
     public void testStringToSqlDate_gMonth_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_MONTH_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_gMonth() {
         String string = " \t --02 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_G_MONTH);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_MONTH_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -1329,14 +1329,14 @@
     public void testStringToSqlDate_gMonthDay_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_gMonthDay() {
         String string = " \t --02-21 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_G_MONTH_DAY);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -1354,14 +1354,14 @@
     public void testStringToSqlDate_gYear_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_gYear() {
         String string = " \t 1975 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_G_YEAR);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
@@ -1379,14 +1379,14 @@
     public void testStringToSqlDate_gYearMonth_null() {
         String string = null;
         java.sql.Date control = null;
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlDate_gYearMonth() {
         String string = " \t 1975-02 \t ";
         java.sql.Date control = new java.sql.Date(CONTROL_G_YEAR_MONTH);
-        java.sql.Date test = (java.sql.Date)xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.sql.Date test = xcm.convertObject(string, java.sql.Date.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -1404,21 +1404,21 @@
     // -------------------------------------------------------------------------
     public void testSqlTimeToSqlTime() {
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(control, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(control, Time.class);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_default_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class);
+        String test = xcm.convertObject(sqlTime, String.class);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_default() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_TIME_0MS);
         String control = "07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class);
+        String test = xcm.convertObject(sqlTime, String.class);
         boolean passed = control.equals(test) || control.equals(test.replace("+01:00", "Z"));
         assertTrue(passed);
     }
@@ -1426,14 +1426,14 @@
     public void testSqlTimeToString_default_0ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_TIME_0MS);
         String control = "07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class);
+        String test = xcm.convertObject(sqlTime, String.class);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_default_1ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_TIME_1MS);
         String control = "07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class);
+        String test = xcm.convertObject(sqlTime, String.class);
         assertEquals(control, test);
     }
 
@@ -1449,182 +1449,182 @@
     public void testSqlTimeToString_default_10ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_TIME_10MS);
         String control = "07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class);
+        String test = xcm.convertObject(sqlTime, String.class);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_default_100ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_TIME_100MS);
         String control = "07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class);
+        String test = xcm.convertObject(sqlTime, String.class);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_date_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_date() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21";
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_dateTime_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_dateTime() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21T07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_dateTime_0ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21T07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_dateTime_1ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_1MS);
         String control = "1975-02-21T07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_dateTime_10ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_10MS);
         String control = "1975-02-21T07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_dateTime_100ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_100MS);
         String control = "1975-02-21T07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_time_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_time() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_time_0ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_time_1ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_1MS);
         String control = "07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_time_10ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_10MS);
         String control = "07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_time_100ms() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_100MS);
         String control = "07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gDay_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gDay() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "---21";
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gMonth_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gMonth() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "--02";
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gMonthDay_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gMonthDay() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "--02-21";
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gYear_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gYear() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "1975";
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gYearMonth_null() {
         java.sql.Time sqlTime = null;
         String control = null;
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testSqlTimeToString_gYearMonth() {
         java.sql.Time sqlTime = new java.sql.Time(CONTROL_DATE_TIME_0MS);
         String control = "1975-02";
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -1632,8 +1632,8 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.sql.Time sqlTime = (java.sql.Time) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
-        String testString = (String) xmlConversionManager.convertObject(sqlTime, String.class);
+        java.sql.Time sqlTime = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, Time.class, XMLConstants.DATE_TIME_QNAME);
+        String testString = xmlConversionManager.convertObject(sqlTime, String.class);
         assertEquals("03:00:00-04:00", testString);
     }
 
@@ -1641,8 +1641,8 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.sql.Time sqlTime = (java.sql.Time) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
-        String testString = (String) xmlConversionManager.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Time sqlTime = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, Time.class, XMLConstants.DATE_TIME_QNAME);
+        String testString = xmlConversionManager.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals("2003-08-29T03:00:00-04:00", testString);
     }
 
@@ -1650,50 +1650,50 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.sql.Time sqlTime = (java.sql.Time) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
-        String testString = (String) xmlConversionManager.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
+        java.sql.Time sqlTime = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, Time.class, XMLConstants.DATE_TIME_QNAME);
+        String testString = xmlConversionManager.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
         assertEquals("03:00:00-04:00", testString);
     }
 
     public void testStringToSqlTime_default_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(string, Time.class);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_default() {
         String string = " \t 07:47:15 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(string, Time.class);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_default_0ms() {
         String string = " \t 07:47:15 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(string, Time.class);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_default_1ms() {
         String string = " \t 07:47:15.001 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(string, Time.class);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_default_10ms() {
         String string = " \t 07:47:15.01 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(string, Time.class);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_default_100ms() {
         String string = " \t 07:47:15.1 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(string, Time.class);
         assertEquals(control, test);
     }
 
@@ -1733,28 +1733,28 @@
     public void testStringToSqlTime_date_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_date() {
         String string = " \t 1975-02-21 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_DATE);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_date_negative1() {
         String string = "1975-02-21T07:47:15";
         java.sql.Time control = new java.sql.Time(CONTROL_DATE);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_date_negative2() {
         try {
             String string = "07:47:15";
-            Time test = (Time)xcm.convertObject(string, Time.class, XMLConstants.DATE_QNAME);
+            Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_QNAME);
         } catch (ConversionException e) {
             assertTrue(WRONG_EXCEPTION_THROWN, e.getErrorCode() == ConversionException.INCORRECT_DATE_FORMAT);
             return;
@@ -1765,7 +1765,7 @@
     public void testStringToSqlTime_date_negative3() {
         try {
             String string = "1975$02$21";
-            Time test = (Time)xcm.convertObject(string, Time.class, XMLConstants.DATE_QNAME);
+            Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_QNAME);
         } catch (ConversionException e) {
             assertTrue(WRONG_EXCEPTION_THROWN, e.getErrorCode() == ConversionException.INCORRECT_DATE_FORMAT);
             return;
@@ -1776,49 +1776,49 @@
     public void testStringToSqlTime_dateTime_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_dateTime() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_DATE_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_dateTime_0ms() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_DATE_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_dateTime_1ms() {
         String string = " \t 1975-02-21T07:47:15.001 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_DATE_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_dateTime_10ms() {
         String string = " \t 1975-02-21T07:47:15.01 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_DATE_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_dateTime_100ms() {
         String string = " \t 1975-02-21T07:47:15.1 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_DATE_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_dateTime_negative1() {
         try {
             String string = "1975-02-21";
-            Time test = (Time)xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
+            Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         } catch (ConversionException e) {
             assertTrue(WRONG_EXCEPTION_THROWN, e.getErrorCode() == ConversionException.INCORRECT_DATE_TIME_FORMAT);
             return;
@@ -1829,7 +1829,7 @@
     public void testStringToSqlTime_dateTime_negative2() {
         try {
             String string = "07:47:15";
-            Time test = (Time)xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
+            Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         } catch (ConversionException e) {
             assertTrue(WRONG_EXCEPTION_THROWN, e.getErrorCode() == ConversionException.INCORRECT_DATE_TIME_FORMAT);
         }
@@ -1838,7 +1838,7 @@
     public void testStringToSqlTime_dateTime_negative3() {
         try {
             String string = "1975$02$21T07$47$15";
-            Time test = (Time)xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
+            Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         } catch (ConversionException e) {
             assertTrue(WRONG_EXCEPTION_THROWN, e.getErrorCode() == ConversionException.INCORRECT_DATE_TIME_FORMAT);
             return;
@@ -1849,7 +1849,7 @@
     public void testStringToSqlTime_dateTime_negative4() {
         try {
             String string = "1975-02-21$07:47:15";
-            Time test = (Time)xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
+            Time test = xcm.convertObject(string, Time.class, XMLConstants.DATE_TIME_QNAME);
         } catch (ConversionException e) {
             assertTrue(WRONG_EXCEPTION_THROWN, e.getErrorCode() == ConversionException.INCORRECT_DATE_TIME_FORMAT);
             return;
@@ -1860,42 +1860,42 @@
     public void testStringToSqlTime_time_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_time() {
         String string = " \t 07:47:15 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_time_0ms() {
         String string = " \t 07:47:15 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_time_1ms() {
         String string = " \t 07:47:15.001 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_time_10ms() {
         String string = " \t 07:47:15.01 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_time_100ms() {
         String string = " \t 07:47:15.1 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_TIME_0MS);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.TIME_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -1933,14 +1933,14 @@
     public void testStringToSqlTime_gDay_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_DAY_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_gDay() {
         String string = " \t ---21 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_G_DAY);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_DAY_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -1958,14 +1958,14 @@
     public void testStringToSqlTime_gMonth_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_MONTH_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_gMonth() {
         String string = " \t --02 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_G_MONTH);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_MONTH_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -1983,14 +1983,14 @@
     public void testStringToSqlTime_gMonthDay_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_gMonthDay() {
         String string = " \t --02-21 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_G_MONTH_DAY);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -2008,14 +2008,14 @@
     public void testStringToSqlTime_gYear_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_YEAR_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_gYear() {
         String string = " \t 1975 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_G_YEAR);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_YEAR_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
@@ -2033,14 +2033,14 @@
     public void testStringToSqlTime_gYearMonth_null() {
         String string = null;
         java.sql.Time control = null;
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToSqlTime_gYearMonth() {
         String string = " \t 1975-02 \t ";
         java.sql.Time control = new java.sql.Time(CONTROL_G_YEAR_MONTH);
-        java.sql.Time test = (java.sql.Time)xcm.convertObject(string, java.sql.Time.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.sql.Time test = xcm.convertObject(string, Time.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -2058,42 +2058,42 @@
     // -------------------------------------------------------------------------
     public void testTimestampToTimestamp() {
         Timestamp control = new Timestamp(CONTROL_DATE_TIME_1MS);
-        Timestamp test = (Timestamp)xcm.convertObject(control, Timestamp.class);
+        Timestamp test = xcm.convertObject(control, Timestamp.class);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_default_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class);
+        String test = xcm.convertObject(timestamp, String.class);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_default_0ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21T07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class);
+        String test = xcm.convertObject(timestamp, String.class);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_default_1ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_1MS);
         String control = "1975-02-21T07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class);
+        String test = xcm.convertObject(timestamp, String.class);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_default_10ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_10MS);
         String control = "1975-02-21T07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class);
+        String test = xcm.convertObject(timestamp, String.class);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_default_100ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_100MS);
         String control = "1975-02-21T07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class);
+        String test = xcm.convertObject(timestamp, String.class);
         assertEquals(control, test);
     }
 
@@ -2101,56 +2101,56 @@
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         timestamp.setNanos(123456789);
         String control = "1975-02-21T07:47:15.123456789"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class);
+        String test = xcm.convertObject(timestamp, String.class);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_date_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_date() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21";
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_dateTime_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_dateTime_0ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21T07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_dateTime_1ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_1MS);
         String control = "1975-02-21T07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_dateTime_10ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_10MS);
         String control = "1975-02-21T07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_dateTime_100ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_100MS);
         String control = "1975-02-21T07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2158,7 +2158,7 @@
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         timestamp.setNanos(123456789);
         String control = "1975-02-21T07:47:15.123456789"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2182,7 +2182,7 @@
         java.sql.Timestamp timestamp = new java.sql.Timestamp(utilDate.getTime());
         timestamp.setNanos(123456789);
 
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2202,42 +2202,42 @@
         java.sql.Timestamp timestamp = new java.sql.Timestamp(utilDate.getTime());
         timestamp.setNanos(123456789);
 
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_time_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_time_0ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "07:47:15"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_time_1ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_1MS);
         String control = "07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_time_10ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_10MS);
         String control = "07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_time_100ms() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_100MS);
         String control = "07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2245,77 +2245,77 @@
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         timestamp.setNanos(123456789);
         String control = "07:47:15.123456789"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gDay_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gDay() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "---21";
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gMonth_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gMonth() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "--02";
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gMonthDay_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gMonthDay() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "--02-21";
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gYear_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gYear() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "1975";
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gYearMonth_null() {
         java.sql.Timestamp timestamp = null;
         String control = null;
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testTimestampToString_gYearMonth() {
         java.sql.Timestamp timestamp = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         String control = "1975-02";
-        String test = (String)xcm.convertObject(timestamp, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(timestamp, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -2323,8 +2323,8 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.sql.Timestamp sqlTimestamp = (java.sql.Timestamp) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
-        String testString = (String) xmlConversionManager.convertObject(sqlTimestamp, String.class);
+        java.sql.Timestamp sqlTimestamp = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        String testString = xmlConversionManager.convertObject(sqlTimestamp, String.class);
         assertEquals("2003-08-29T03:00:00-04:00", testString);
     }
 
@@ -2332,8 +2332,8 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.sql.Timestamp sqlTimestamp = (java.sql.Timestamp) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
-        String testString = (String) xmlConversionManager.convertObject(sqlTimestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp sqlTimestamp = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        String testString = xmlConversionManager.convertObject(sqlTimestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals("2003-08-29T03:00:00-04:00", testString);
     }
 
@@ -2341,43 +2341,43 @@
         XMLConversionManager xmlConversionManager = (XMLConversionManager) XMLConversionManager.getDefaultXMLManager().clone();
         xmlConversionManager.setTimeZone(TimeZone.getTimeZone(CONTROL_DST_TIME_ZONE));
         xmlConversionManager.setTimeZoneQualified(true);
-        java.sql.Timestamp sqlTimestamp = (java.sql.Timestamp) xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
-        String testString = (String) xmlConversionManager.convertObject(sqlTimestamp, String.class, XMLConstants.TIME_QNAME);
+        java.sql.Timestamp sqlTimestamp = xmlConversionManager.convertObject(CONTROL_DST_INPUT_DATE_TIME, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        String testString = xmlConversionManager.convertObject(sqlTimestamp, String.class, XMLConstants.TIME_QNAME);
         assertEquals("03:00:00-04:00", testString);
     }
 
     public void testStringToTimestamp_default_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_default_0ms() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_default_1ms() {
         String string = " \t 1975-02-21T07:47:15.001 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_1MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_default_10ms() {
         String string = " \t 1975-02-21T07:47:15.01 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_10MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_default_100ms() {
         String string = " \t 1975-02-21T07:47:15.1 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_100MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class);
         assertEquals(control, test);
     }
 
@@ -2385,7 +2385,7 @@
         String string = " \t 1975-02-21T07:47:15.123456789 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         control.setNanos(123456789);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class);
         assertEquals(control, test);
     }
 
@@ -2447,21 +2447,21 @@
     public void testStringToTimestamp_date_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_date() {
         String string = " \t 1975-02-21 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_date_negative1() {
         String string = "1975-02-21T07:47:15";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
@@ -2490,42 +2490,42 @@
     public void testStringToTimestamp_dateTime_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_dateTime() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_dateTime_0ms() {
         String string = " \t 1975-02-21T07:47:15 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_dateTime_1ms() {
         String string = " \t 1975-02-21T07:47:15.001 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_1MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_dateTime_10ms() {
         String string = " \t 1975-02-21T07:47:15.01 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_10MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_dateTime_100ms() {
         String string = " \t 1975-02-21T07:47:15.1 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_100MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2533,7 +2533,7 @@
         String string = " \t 1975-02-21T07:47:15.123456789 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_DATE_TIME_0MS);
         control.setNanos(123456789);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2582,42 +2582,42 @@
     public void testStringToTimestamp_time_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_time() {
         String string = " \t 07:47:15 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_TIME_0MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_time_0ms() {
         String string = " \t 07:47:15 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_TIME_0MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_time_1ms() {
         String string = " \t 07:47:15.001 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_TIME_1MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_time_10ms() {
         String string = " \t 07:47:15.01 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_TIME_10MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_time_100ms() {
         String string = " \t 07:47:15.1 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_TIME_100MS);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2625,7 +2625,7 @@
         String string = " \t 07:47:15.123456789 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_TIME_0MS);
         control.setNanos(123456789);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.TIME_QNAME);        assertEquals(control, test);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.TIME_QNAME);        assertEquals(control, test);
     }
 
     public void testStringToTimestamp_time_negative1() {
@@ -2662,14 +2662,14 @@
     public void testStringToTimestamp_gDay_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_DAY_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_gDay() {
         String string = " \t ---21 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_G_DAY);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_DAY_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -2687,14 +2687,14 @@
     public void testStringToTimestamp_gMonth_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_MONTH_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_gMonth() {
         String string = " \t --02 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_G_MONTH);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_MONTH_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -2712,14 +2712,14 @@
     public void testStringToTimestamp_gMonthDay_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_gMonthDay() {
         String string = " \t --02-21 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_G_MONTH_DAY);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -2737,14 +2737,14 @@
     public void testStringToTimestamp_gYear_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_YEAR_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_gYear() {
         String string = " \t 1975 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_G_YEAR);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_YEAR_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
@@ -2762,14 +2762,14 @@
     public void testStringToTimestamp_gYearMonth_null() {
         String string = null;
         java.sql.Timestamp control = null;
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToTimestamp_gYearMonth() {
         String string = " \t 1975-02 \t ";
         java.sql.Timestamp control = new java.sql.Timestamp(CONTROL_G_YEAR_MONTH);
-        java.sql.Timestamp test = (java.sql.Timestamp)xcm.convertObject(string, java.sql.Timestamp.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(string, Timestamp.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -2787,14 +2787,14 @@
     // -------------------------------------------------------------------------
     public void testCalendarToCalendar() {
         Calendar control = Calendar.getInstance();
-        Calendar test = (Calendar)xcm.convertObject(control, Calendar.class);
+        Calendar test = xcm.convertObject(control, Calendar.class);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_default_date_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2805,14 +2805,14 @@
         calendar.set(Calendar.MONTH, Calendar.FEBRUARY);
         calendar.set(Calendar.DATE, 21);
         String control = "1975-02-21";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_default_dateTime_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2822,7 +2822,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21T07:47:15";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2832,7 +2832,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_1MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21T07:47:15.001";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2842,7 +2842,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_10MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21T07:47:15.01";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2852,14 +2852,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_100MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21T07:47:15.1";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_default_time_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2871,7 +2871,7 @@
         calendar.set(Calendar.SECOND, 15);
         calendar.set(Calendar.MILLISECOND, 0);
         String control = "07:47:15";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2883,7 +2883,7 @@
         calendar.set(Calendar.SECOND, 15);
         calendar.set(Calendar.MILLISECOND, 1);
         String control = "07:47:15.001";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2895,7 +2895,7 @@
         calendar.set(Calendar.SECOND, 15);
         calendar.set(Calendar.MILLISECOND, 10);
         String control = "07:47:15.01";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
@@ -2907,14 +2907,14 @@
         calendar.set(Calendar.SECOND, 15);
         calendar.set(Calendar.MILLISECOND, 100);
         String control = "07:47:15.1";
-        String test = (String)xcm.convertObject(calendar, String.class);
+        String test = xcm.convertObject(calendar, String.class);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_date_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
@@ -2924,14 +2924,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_dateTime_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2941,7 +2941,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21T07:47:15";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2951,7 +2951,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_1MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21T07:47:15.001";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2961,7 +2961,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_10MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21T07:47:15.01";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2971,14 +2971,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_100MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02-21T07:47:15.1";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_time_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2988,7 +2988,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "07:47:15";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -2998,7 +2998,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_1MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "07:47:15.001";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -3008,7 +3008,7 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_10MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "07:47:15.01";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -3018,14 +3018,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_100MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "07:47:15.1";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_gDay_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -3035,14 +3035,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "---21";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_gMonth_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -3052,14 +3052,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "--02";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_gMonthDay_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -3069,14 +3069,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "--02-21";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_gYear_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
@@ -3086,14 +3086,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
     public void testCalendarToString_gYearMonth_null() {
         Calendar calendar = null;
         String control = null;
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -3103,14 +3103,14 @@
         calendar.setTimeInMillis(CONTROL_DATE_TIME_0MS);
         calendar.clear(Calendar.ZONE_OFFSET);
         String control = "1975-02";
-        String test = (String)xcm.convertObject(calendar, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(calendar, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToCalendar_default_dateTime_null() {
         String string = null;
         Calendar control = null;
-        Calendar test = (Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        Calendar test = xcm.convertObject(string, Calendar.class);
         assertEquals(control, test);
     }
 
@@ -3119,7 +3119,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_0MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3128,7 +3128,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_0MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3137,7 +3137,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_1MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3146,7 +3146,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_10MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3155,14 +3155,14 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_100MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
     public void testStringToCalendar_default_date_null() {
         String string = null;
         Calendar control = null;
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertEquals(control, test);
     }
 
@@ -3171,14 +3171,14 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
     public void testStringToCalendar_default_time_null() {
         String string = null;
         Calendar control = null;
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertEquals(control, test);
     }
 
@@ -3187,7 +3187,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_0MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3196,7 +3196,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_0MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3205,7 +3205,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_1MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3214,7 +3214,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_10MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3223,14 +3223,14 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_100MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
     public void testStringToCalendar_date_null() {
         String string = null;
         Calendar control = null;
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.DATE_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
@@ -3239,7 +3239,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.DATE_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.DATE_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3277,7 +3277,7 @@
     public void testStringToCalendar_dateTime_null() {
         String string = null;
         Calendar control = null;
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -3286,7 +3286,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_0MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.DATE_TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3295,7 +3295,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_0MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.DATE_TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3304,7 +3304,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_1MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.DATE_TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3313,7 +3313,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_10MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.DATE_TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3322,7 +3322,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_DATE_TIME_100MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.DATE_TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3371,7 +3371,7 @@
     public void testStringToCalendar_time_null() {
         String string = null;
         Calendar control = null;
-        Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.TIME_QNAME);
+        Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -3380,7 +3380,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_0MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3389,7 +3389,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_0MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3398,7 +3398,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_1MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3407,7 +3407,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_10MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3416,7 +3416,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_TIME_100MS);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.TIME_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.TIME_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3454,7 +3454,7 @@
     public void testStringToCalendar_gDay_null() {
         String string = null;
         Calendar control = null;
-        Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_DAY_QNAME);
+        Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -3463,7 +3463,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_G_DAY);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_DAY_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_DAY_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3481,7 +3481,7 @@
     public void testStringToCalendar_gMonth_null() {
         String string = null;
         Calendar control = null;
-        Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_MONTH_QNAME);
+        Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -3490,7 +3490,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_G_MONTH);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_MONTH_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_MONTH_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3508,7 +3508,7 @@
     public void testStringToCalendar_gMonthDay_null() {
         String string = null;
         Calendar control = null;
-        Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_MONTH_DAY_QNAME);
+        Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals(control, test);
     }
 
@@ -3517,7 +3517,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_G_MONTH_DAY);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_MONTH_DAY_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3535,7 +3535,7 @@
     public void testStringToCalendar_gYear_null() {
         String string = null;
         Calendar control = null;
-        Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_YEAR_QNAME);
+        Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
 
@@ -3544,7 +3544,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_G_YEAR);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_YEAR_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_YEAR_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3562,7 +3562,7 @@
     public void testStringToCalendar_gYearMonth_null() {
         String string = null;
         Calendar control = null;
-        Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals(control, test);
     }
 
@@ -3571,7 +3571,7 @@
         Calendar control = Calendar.getInstance();
         control.clear();
         control.setTimeInMillis(CONTROL_G_YEAR_MONTH);
-        java.util.Calendar test = (java.util.Calendar)xcm.convertObject(string, java.util.Calendar.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        java.util.Calendar test = xcm.convertObject(string, Calendar.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertTrue(control.getTimeInMillis() == test.getTimeInMillis());
     }
 
@@ -3590,7 +3590,7 @@
         DatatypeFactory factory = DatatypeFactory.newInstance();
 
         XMLGregorianCalendar xgc = factory.newXMLGregorianCalendar("2005-11-05");
-        String result = (String)xcm.convertObject(xgc, String.class, XMLConstants.DATE_QNAME);
+        String result = xcm.convertObject(xgc, String.class, XMLConstants.DATE_QNAME);
         assertEquals("2005-11-05", result);
     }
 
@@ -3610,11 +3610,11 @@
 
         String xml1 = xcm.convertObject(xgc1, String.class).toString();
 
-        Calendar c = (Calendar) xcm.convertObject(xml1, Calendar.class);
+        Calendar c = xcm.convertObject(xml1, Calendar.class);
 
         String xml2 = xcm.convertObject(c, String.class).toString();
 
-        XMLGregorianCalendar xgc2 = (XMLGregorianCalendar) xcm.convertObject(xml2, XMLGregorianCalendar.class);
+        XMLGregorianCalendar xgc2 = xcm.convertObject(xml2, XMLGregorianCalendar.class);
 
         assertTrue(xgc1.compare(xgc2) == DatatypeConstants.EQUAL);
     }
@@ -3628,35 +3628,35 @@
 
     public void testExtendedUtilDateToUtilDate() {
         java.util.Date control = new ExtendedUtilDate(CONTROL_DATE_TIME_1MS);
-        java.util.Date test = (java.util.Date)xcm.convertObject(control, java.util.Date.class);
+        java.util.Date test = xcm.convertObject(control, java.util.Date.class);
         assertEquals(control, test);
     }
 
     public void testExtendedUtilDateToString_default_100ms() {
         java.util.Date utilDate = new ExtendedUtilDate(CONTROL_DATE_TIME_100MS);
         String control = "1975-02-21T07:47:15.1"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class);
+        String test = xcm.convertObject(utilDate, String.class);
         assertEquals(control, test);
     }
 
     public void testExtendedUtilDateToString_date() {
         java.util.Date utilDate = new ExtendedUtilDate(CONTROL_DATE_TIME_0MS);
         String control = "1975-02-21";
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
 
     public void testExtendedUtilDateToString_time_10ms() {
         java.util.Date utilDate = new ExtendedUtilDate(CONTROL_DATE_TIME_10MS);
         String control = "07:47:15.01"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
 
     public void testExtendedUtilDateToString_dateTime_1ms() {
         java.util.Date utilDate = new ExtendedUtilDate(CONTROL_DATE_TIME_1MS);
         String control = "1975-02-21T07:47:15.001"+TIMEZONE_OFFSET;
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
 
@@ -3670,14 +3670,14 @@
     public void testPostADDateToSQLDate() {
         String control = "0001-01-01";
         java.sql.Date sqlDate = java.sql.Date.valueOf(control);
-        String test = (String)xcm.convertObject(sqlDate, String.class);
+        String test = xcm.convertObject(sqlDate, String.class);
         assertEquals(control, test);
     }
     
     public void testPostADDateToSQLDate_Date() {
         String control = "0001-01-01";
         java.sql.Date sqlDate = java.sql.Date.valueOf(control);
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
     
@@ -3685,7 +3685,7 @@
         String control = "0001-01-01T00:00:00" + TIMEZONE_OFFSET;
         String input = "0001-01-01";
         java.sql.Date sqlDate = java.sql.Date.valueOf(input);
-        String test = (String)xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
     
@@ -3694,7 +3694,7 @@
         String control = "0001-01-01T01:01:01" + TIMEZONE_OFFSET;
         String input = "0001-01-01 01:01:01";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class);
+        String test = xcm.convertObject(sqlTimestamp, String.class);
         assertEquals(control, test);
     }
     
@@ -3702,7 +3702,7 @@
         String control = "0001-01-01";
         String input = "0001-01-01 01:01:01";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(sqlTimestamp, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
     
@@ -3710,7 +3710,7 @@
         String control = "0001-01-01T01:01:01.001" + TIMEZONE_OFFSET;
         String input = "0001-01-01 01:01:01.001";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlTimestamp, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
     
@@ -3718,7 +3718,7 @@
         String control = "01:01:01.001" + TIMEZONE_OFFSET;
         String input = "0001-01-01 01:01:01.001";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlTimestamp, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
     
@@ -3726,7 +3726,7 @@
         String control = "01"; // first day of month
         String input = "0001-01-01 01:01:01.001";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_DAY_QNAME);
+        String test = xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_DAY_QNAME);
         assertTrue(test.endsWith(control));
     }
     
@@ -3734,7 +3734,7 @@
         String control = "01"; // first month of the year
         String input = "0001-01-01 01:01:01.001";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_MONTH_QNAME);
+        String test = xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_MONTH_QNAME);
         assertTrue(test.endsWith(control));
     }
     
@@ -3742,7 +3742,7 @@
         String control = "01-01"; // first month, first day
         String input = "0001-01-01 01:01:01.001";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        String test = xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertTrue(test.endsWith(control));
     }
     
@@ -3750,7 +3750,7 @@
         String control = "01-01"; // first month, first day
         String input = "0001-01-01 01:01:01.001";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        String test = xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertTrue(test.endsWith(control));
     }
     
@@ -3758,7 +3758,7 @@
         String control = "0001"; // first year (4 digit)
         String input = "0001-01-01 01:01:01.001";
         java.sql.Timestamp sqlTimestamp = java.sql.Timestamp.valueOf(input);
-        String test = (String)xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_YEAR_QNAME);
+        String test = xcm.convertObject(sqlTimestamp, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals(control, test);
     }
     
@@ -3773,7 +3773,7 @@
         cal.set(Calendar.DAY_OF_MONTH, 1);
         java.util.Date utilDate = cal.getTime();
         
-        String test = (String)xcm.convertObject(utilDate, String.class);
+        String test = xcm.convertObject(utilDate, String.class);
         assertEquals(control, test);
     }
     
@@ -3791,7 +3791,7 @@
         cal.set(Calendar.MILLISECOND, 1);
         java.util.Date utilDate = cal.getTime();
         
-        String test = (String)xcm.convertObject(utilDate, String.class);
+        String test = xcm.convertObject(utilDate, String.class);
         assertEquals(control, test);
     }
     
@@ -3805,7 +3805,7 @@
         cal.set(Calendar.DAY_OF_MONTH, 1);
         java.util.Date utilDate = cal.getTime();
         
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
     
@@ -3823,7 +3823,7 @@
         cal.set(Calendar.MILLISECOND, 1);
         java.util.Date utilDate = cal.getTime();
         
-        String test = (String)xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(utilDate, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
     
@@ -3834,7 +3834,7 @@
         
         java.sql.Time sqlTime = java.sql.Time.valueOf(input);
         
-        String test = (String)xcm.convertObject(sqlTime, String.class);
+        String test = xcm.convertObject(sqlTime, String.class);
         assertEquals(control, test);
     }
     
@@ -3844,7 +3844,7 @@
         
         java.sql.Time sqlTime = java.sql.Time.valueOf(input);
         
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.TIME_QNAME);
         assertEquals(control, test);
     }
     
@@ -3863,7 +3863,7 @@
         
         java.sql.Time sqlTime = new java.sql.Time(cal.getTimeInMillis());
         
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_QNAME);
         assertEquals(control, test);
     }
     
@@ -3882,21 +3882,21 @@
         
         java.sql.Time sqlTime = new java.sql.Time(cal.getTimeInMillis());
         
-        String test = (String)xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
+        String test = xcm.convertObject(sqlTime, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals(control, test);
     }
     
     // String -> java.sql.Date tests
     public void testPostADDateStringToSQLDate() {
         String control = "0001-01-01";
-        java.sql.Date sqlDate = (java.sql.Date) xcm.convertObject(control, java.sql.Date.class);
+        java.sql.Date sqlDate = xcm.convertObject(control, java.sql.Date.class);
         String test = sqlDate.toString();
         assertEquals(control, test);
     }
     
     public void testPostADDateStringToSQLDate_Date() {
         String control = "0001-01-01";
-        java.sql.Date sqlDate = (java.sql.Date) xcm.convertObject(control, java.sql.Date.class, XMLConstants.DATE_QNAME);
+        java.sql.Date sqlDate = xcm.convertObject(control, java.sql.Date.class, XMLConstants.DATE_QNAME);
         String test = sqlDate.toString();
         assertEquals(control, test);
     }
@@ -3904,7 +3904,7 @@
     // String -> java.util.Date tests
     public void testPostADDateStringToUtilDate() {
         String input = "0001-01-01T01:01:01.001" + TIMEZONE_OFFSET;
-        java.util.Date test = (java.util.Date) xcm.convertObject(input, java.util.Date.class);
+        java.util.Date test = xcm.convertObject(input, java.util.Date.class);
         
         Calendar cal = Calendar.getInstance();
         cal.clear();
@@ -3922,7 +3922,7 @@
     
     public void testPostADDateStringToUtilDate_Date() {
         String input = "0001-01-01T01:01:01.001" + TIMEZONE_OFFSET;
-        java.util.Date test = (java.util.Date) xcm.convertObject(input, java.util.Date.class, XMLConstants.DATE_QNAME);
+        java.util.Date test = xcm.convertObject(input, java.util.Date.class, XMLConstants.DATE_QNAME);
         
         Calendar cal = Calendar.getInstance();
         cal.clear();
@@ -3936,7 +3936,7 @@
     
     public void testPostADDateStringToUtilDate_DateTime() {
         String input = "0001-01-01T01:01:01.001" + TIMEZONE_OFFSET;
-        java.util.Date test = (java.util.Date) xcm.convertObject(input, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
+        java.util.Date test = xcm.convertObject(input, java.util.Date.class, XMLConstants.DATE_TIME_QNAME);
         
         Calendar cal = Calendar.getInstance();
         cal.clear();
@@ -3955,7 +3955,7 @@
     // String -> java.sql.Timestamp tests
     public void testPostADDateStringToSqlTimestamp() {
         String input = "0001-01-01T01:01:01.001";
-        java.sql.Timestamp test = (java.sql.Timestamp) xcm.convertObject(input, java.sql.Timestamp.class);
+        java.sql.Timestamp test = xcm.convertObject(input, Timestamp.class);
         
         Calendar cal = Calendar.getInstance();
         cal.clear();
@@ -3973,7 +3973,7 @@
     
     public void testPostADDateStringToSqlTimestamp_DateTime() {
         String input = "0001-01-01T01:01:01.001";
-        java.sql.Timestamp test = (java.sql.Timestamp) xcm.convertObject(input, java.sql.Timestamp.class, XMLConstants.DATE_TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(input, Timestamp.class, XMLConstants.DATE_TIME_QNAME);
         
         Calendar cal = Calendar.getInstance();
         cal.clear();
@@ -3991,7 +3991,7 @@
     
     public void testPostADDateStringToSqlTimestamp_Date() {
         String input = "0001-01-01";
-        java.sql.Timestamp test = (java.sql.Timestamp) xcm.convertObject(input, java.sql.Timestamp.class, XMLConstants.DATE_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(input, Timestamp.class, XMLConstants.DATE_QNAME);
         
         Calendar cal = Calendar.getInstance();
         cal.clear();
@@ -4005,7 +4005,7 @@
     
     public void testPostADDateStringToSqlTimestamp_Time() {
         String input = "01:01:01.001";
-        java.sql.Timestamp test = (java.sql.Timestamp) xcm.convertObject(input, java.sql.Timestamp.class, XMLConstants.TIME_QNAME);
+        java.sql.Timestamp test = xcm.convertObject(input, Timestamp.class, XMLConstants.TIME_QNAME);
         
         Calendar cal = Calendar.getInstance();
         cal.clear();
@@ -4021,7 +4021,7 @@
     // String -> java.sql.Time tests
     public void testPostADDateStringToSqlTime() {
         String input = "01:01:01";
-        java.sql.Time test = (java.sql.Time) xcm.convertObject(input, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(input, Time.class);
         java.sql.Time control = java.sql.Time.valueOf(input);
         
         assertEquals(control, test);
@@ -4029,7 +4029,7 @@
     
     public void testPostADDateStringToSqlTimeZeroed() {
         String input = "00:00:00";
-        java.sql.Time test = (java.sql.Time) xcm.convertObject(input, java.sql.Time.class);
+        java.sql.Time test = xcm.convertObject(input, Time.class);
         java.sql.Time control = java.sql.Time.valueOf(input);
         
         assertEquals(control, test);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/DoubleToBigDecimalTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/DoubleToBigDecimalTestCases.java
index a6822dd..338d9c4 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/DoubleToBigDecimalTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/DoubleToBigDecimalTestCases.java
@@ -34,7 +34,7 @@
     public void testConvertDoubleToBigDecimal1() {
         String controlString = "1.1";
         Double controlDouble = Double.valueOf(controlString);
-        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
+        BigDecimal testBigDecimal = xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
         String testString = String.valueOf(testBigDecimal);
         assertEquals(controlString, testString);
     }
@@ -42,7 +42,7 @@
     public void testConvertDoubleToBigDecimal2a() {
         String controlString = "1";
         Double controlDouble = 1.0;
-        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
+        BigDecimal testBigDecimal = xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
         String testString = String.valueOf(testBigDecimal);
         assertEquals(controlString, testString);
     }
@@ -50,7 +50,7 @@
     public void testConvertDoubleToBigDecimal2b() {
         String controlString = "1";
         Double controlDouble = 1.0;
-        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
+        BigDecimal testBigDecimal = xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
         String testString = String.valueOf(testBigDecimal);
         assertEquals(controlString, testString);
     }
@@ -58,7 +58,7 @@
     public void testConvertDoubleToBigDecimal3a() {
         String controlString = "1.0E-10";
         Double controlDouble = Double.valueOf(controlString);
-        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
+        BigDecimal testBigDecimal = xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
         String testString = String.valueOf(testBigDecimal);
         assertEquals(controlString, testString);
     }
@@ -66,7 +66,7 @@
     public void testConvertDoubleToBigDecimal3b() {
         String controlString = "0.00000000010";
         Double controlDouble = Double.valueOf(controlString);
-        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
+        BigDecimal testBigDecimal = xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
         String testString = String.valueOf(testBigDecimal);
         assertEquals("1.0E-10", testString);
     }
@@ -74,7 +74,7 @@
     public void testConvertDoubleToBigDecimal4a() {
         String controlString = "1000000000";
         Double controlDouble = 1000000000.0;
-        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
+        BigDecimal testBigDecimal = xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
         String testString = String.valueOf(testBigDecimal);
         assertEquals("1.0E+9", testString);
     }
@@ -82,7 +82,7 @@
     public void testConvertDoubleToBigDecimal4b() {
         String controlString = "1000000000";
         Double controlDouble = 1000000000.0;
-        BigDecimal testBigDecimal = (BigDecimal) xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
+        BigDecimal testBigDecimal = xmlConversionManager.convertObject(controlDouble, BigDecimal.class);
         String testString = String.valueOf(testBigDecimal);
         assertEquals("1.0E+9", testString);
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/ListTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/ListTestCases.java
index 3bae042..fe24ea3 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/ListTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/ListTestCases.java
@@ -44,7 +44,7 @@
         list.add(CONTROL_ITEM_1);
         list.add(CONTROL_ITEM_2);
         String control = CONTROL_STRING;
-        String test = (String)xcm.convertObject(list, String.class);
+        String test = xcm.convertObject(list, String.class);
         assertEquals(control, test);
     }
 
@@ -53,7 +53,7 @@
         list.add(CONTROL_ITEM_1);
         list.add(CONTROL_ITEM_2);
         String control = CONTROL_STRING;
-        String test = (String)xcm.convertObject(list, String.class, XMLConstants.STRING_QNAME);
+        String test = xcm.convertObject(list, String.class, XMLConstants.STRING_QNAME);
         assertEquals(control, test);
     }
 
@@ -62,7 +62,7 @@
         List control = new ArrayList(2);
         control.add(CONTROL_ITEM_1);
         control.add(CONTROL_ITEM_2);
-        List test = (List)xcm.convertObject(string, List.class);
+        List test = xcm.convertObject(string, List.class);
         assertEquals(control, test);
     }
 
@@ -71,7 +71,7 @@
         List control = new ArrayList(2);
         control.add(CONTROL_ITEM_1);
         control.add(CONTROL_ITEM_2);
-        List test = (List)xcm.convertObject(string, List.class, XMLConstants.STRING_QNAME);
+        List test = xcm.convertObject(string, List.class, XMLConstants.STRING_QNAME);
         assertEquals(control, test);
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/NumberTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/NumberTestCases.java
index 46293c4..916b2d9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/NumberTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/NumberTestCases.java
@@ -38,7 +38,7 @@
 
     public void testConvertWithPlusToByte() {
         Byte controlByte = Byte.valueOf("1");
-        Byte testByte = (Byte) xmlConversionManager.convertObject("+1", Byte.class);
+        Byte testByte = xmlConversionManager.convertObject("+1", Byte.class);
         String testString = String.valueOf(testByte);
         String controlString = String.valueOf(controlByte);
         assertEquals(controlString, testString);
@@ -46,7 +46,7 @@
 
     public void testConvertWithPlusToInteger() {
         Integer controlInteger = Integer.valueOf("1");
-        Integer testInteger = (Integer) xmlConversionManager.convertObject("+1", Integer.class);
+        Integer testInteger = xmlConversionManager.convertObject("+1", Integer.class);
         String testString = String.valueOf(testInteger);
         String controlString = String.valueOf(controlInteger);
         assertEquals(controlString, testString);
@@ -54,7 +54,7 @@
 
     public void testConvertWithMinuToByte() {
         Byte controlByte = Byte.valueOf("-1");
-        Byte testByte = (Byte) xmlConversionManager.convertObject("-1", Byte.class);
+        Byte testByte = xmlConversionManager.convertObject("-1", Byte.class);
         String testString = String.valueOf(testByte);
         String controlString = String.valueOf(controlByte);
         assertEquals(controlString, testString);
@@ -62,79 +62,79 @@
 
     public void testConvertWithMinusToInteger() {
         Integer controlInteger = Integer.valueOf("-1");
-        Integer testInteger = (Integer) xmlConversionManager.convertObject("-1", Integer.class);
+        Integer testInteger = xmlConversionManager.convertObject("-1", Integer.class);
         String testString = String.valueOf(testInteger);
         String controlString = String.valueOf(controlInteger);
         assertEquals(controlString, testString);
     }
 
     public void testConvertEmptyStringTo_byte() {
-        byte test = (Byte) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, byte.class);
+        byte test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, byte.class);
         assertEquals(0, test);
     }
 
     public void testConvertEmptyStringTo_Byte() {
-        Byte test = (Byte) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Byte.class);
+        Byte test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Byte.class);
         assertEquals(0, test.byteValue());
     }
 
     public void testConvertEmptyStringTo_double() {
-        double test = (Double) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, double.class);
+        double test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, double.class);
         assertEquals(0.0, test);
     }
 
     public void testConvertEmptyStringTo_Double() {
-        Double test = (Double) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Double.class);
+        Double test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Double.class);
         assertEquals(0.0, test);
     }
 
     public void testConvertEmptyStringTo_float() {
-        float test = (Float) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, float.class);
+        float test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, float.class);
         assertEquals(0.0, test, 0);
     }
 
     public void testConvertEmptyStringTo_Float() {
-        Float test = (Float) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Float.class);
+        Float test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Float.class);
         assertEquals(0.0, test, 0);
     }
 
     public void testConvertEmptyStringTo_int() {
-        int test = (Integer) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, int.class);
+        int test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, int.class);
         assertEquals(0, test);
     }
 
     public void testConvertEmptyStringTo_Integer() {
-        Integer test = (Integer) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Integer.class);
+        Integer test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Integer.class);
         assertEquals(0, test.intValue());
     }
 
     public void testConvertEmptyStringTo_long() {
-        long test = (Long) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, long.class);
+        long test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, long.class);
         assertEquals(0, test);
     }
 
     public void testConvertEmptyStringTo_Long() {
-        Long test = (Long) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Long.class);
+        Long test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Long.class);
         assertEquals(0, test.longValue());
     }
 
     public void testConvertEmptyStringTo_short() {
-        short test = (Short) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, short.class);
+        short test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, short.class);
         assertEquals(0, test);
     }
 
     public void testConvertEmptyStringTo_Short() {
-        Short test = (Short) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Short.class);
+        Short test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, Short.class);
         assertEquals(0, test.shortValue());
     }
 
     public void testConvertEmptyStringTo_BigDecimal() {
-        BigDecimal test = (BigDecimal) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, BigDecimal.class);
+        BigDecimal test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, BigDecimal.class);
         assertNull(test);
     }
 
     public void testConvertEmptyStringTo_BigInteger() {
-        BigInteger test = (BigInteger) xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, BigInteger.class);
+        BigInteger test = xmlConversionManager.convertObject(XMLConstants.EMPTY_STRING, BigInteger.class);
         assertNull(test);
     }
 
@@ -142,7 +142,7 @@
     public void testConvertBigDecimalTo_String() {
         String controlString = "0.000000001";
         BigDecimal controlBigDecimal = new BigDecimal(controlString);
-        String testString = (String)xmlConversionManager.convertObject(controlBigDecimal, String.class);
+        String testString = xmlConversionManager.convertObject(controlBigDecimal, String.class);
         assertEquals(controlString, testString);
     }
 
@@ -150,7 +150,7 @@
     public void testConvertBigDecimalWithQNameTo_String() {
         String controlString = "0.000000001";
         BigDecimal controlBigDecimal = new BigDecimal(controlString);
-        String testString = (String)xmlConversionManager.convertObject(controlBigDecimal, String.class, XMLConstants.STRING_QNAME);
+        String testString = xmlConversionManager.convertObject(controlBigDecimal, String.class, XMLConstants.STRING_QNAME);
         assertEquals(controlString, testString);
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/QNameTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/QNameTestCases.java
index a739265..55d052f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/QNameTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/QNameTestCases.java
@@ -40,77 +40,77 @@
 
     public void testQNameToQName() {
         QName control = CONTROL_QNAME;
-        QName test = (QName)xcm.convertObject(control, QName.class);
+        QName test = xcm.convertObject(control, QName.class);
         assertEquals(control, test);
     }
 
     public void testQNameToString_default_null() {
         QName qName = null;
         QName control = null;
-        String test = (String)xcm.convertObject(control, String.class);
+        String test = xcm.convertObject(control, String.class);
         assertEquals(control, test);
     }
 
     public void testQNameToString_default() {
         QName qName = CONTROL_QNAME;
         String control = CONTROL_STRING;
-        String test = (String)xcm.convertObject(qName, String.class);
+        String test = xcm.convertObject(qName, String.class);
         assertEquals(control, test);
     }
 
     public void testQNameToString_default_ns() {
         QName qName = CONTROL_QNAME_NS;
         String control = CONTROL_STRING_NS;
-        String test = (String)xcm.convertObject(qName, String.class);
+        String test = xcm.convertObject(qName, String.class);
         assertEquals(control, test);
     }
 
     public void testQNameToString_qname() {
         QName qName = CONTROL_QNAME;
         String control = CONTROL_STRING;
-        String test = (String)xcm.convertObject(qName, String.class, XMLConstants.QNAME_QNAME);
+        String test = xcm.convertObject(qName, String.class, XMLConstants.QNAME_QNAME);
         assertEquals(control, test);
     }
 
     public void testQNameToString_qname_ns() {
         QName qName = CONTROL_QNAME_NS;
         String control = CONTROL_STRING_NS;
-        String test = (String)xcm.convertObject(qName, String.class, XMLConstants.QNAME_QNAME);
+        String test = xcm.convertObject(qName, String.class, XMLConstants.QNAME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToQName_default_null() {
         String string = null;
         QName control = null;
-        QName test = (QName)xcm.convertObject(string, QName.class);
+        QName test = xcm.convertObject(string, QName.class);
         assertEquals(control, test);
     }
 
     public void testStringToQName_default() {
         String string = CONTROL_STRING;
         QName control = CONTROL_QNAME;
-        QName test = (QName)xcm.convertObject(string, QName.class);
+        QName test = xcm.convertObject(string, QName.class);
         assertEquals(control, test);
     }
 
     public void testStringToQName_default_ns() {
         String string = CONTROL_STRING_NS;
         QName control = CONTROL_QNAME_NS;
-        QName test = (QName)xcm.convertObject(string, QName.class);
+        QName test = xcm.convertObject(string, QName.class);
         assertEquals(control, test);
     }
 
     public void testStringToQName_qname() {
         String string = CONTROL_STRING;
         QName control = CONTROL_QNAME;
-        QName test = (QName)xcm.convertObject(string, QName.class, XMLConstants.QNAME_QNAME);
+        QName test = xcm.convertObject(string, QName.class, XMLConstants.QNAME_QNAME);
         assertEquals(control, test);
     }
 
     public void testStringToQName_qname_ns() {
         String string = CONTROL_STRING_NS;
         QName control = CONTROL_QNAME_NS;
-        QName test = (QName)xcm.convertObject(string, QName.class, XMLConstants.QNAME_QNAME);
+        QName test = xcm.convertObject(string, QName.class, XMLConstants.QNAME_QNAME);
         assertEquals(control, test);
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/UrlTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/UrlTestCases.java
index 960ed3c..18008bf 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/UrlTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/UrlTestCases.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -34,18 +34,18 @@
 
     public void testValidStringToUrl() throws Exception {
         URL control = new URL(URL);
-        URL test = (URL) xmlConversionManager.convertObject(URL, URL.class);
+        URL test = xmlConversionManager.convertObject(URL, URL.class);
         assertEquals(control, test);
     }
 
     public void testNullStringToUrl() throws Exception {
-        URL test = (URL) xmlConversionManager.convertObject(null, URL.class);
+        URL test = xmlConversionManager.convertObject(null, URL.class);
         assertNull(test);
     }
 
     public void testInvalidStringToUrl() {
         try {
-            URL test = (URL) xmlConversionManager.convertObject("abc", URL.class);
+            URL test = xmlConversionManager.convertObject("abc", URL.class);
         } catch(ConversionException e) {
             return;
         } catch(Exception e) {
@@ -56,25 +56,25 @@
 
     public void testUrlToString() throws Exception {
         URL control = new URL(URL);
-        String test = (String) xmlConversionManager.convertObject(control, String.class);
+        String test = xmlConversionManager.convertObject(control, String.class);
         assertEquals(URL, test);
     }
 
     public void testNullUrlToString() {
-        String test = (String) xmlConversionManager.convertObject(null, String.class);
+        String test = xmlConversionManager.convertObject(null, String.class);
         assertNull(test);
     }
 
     public void testUrlToUrl() throws Exception {
         URL control = new URL(URL);
-        URL test = (URL) xmlConversionManager.convertObject(control, URL.class);
+        URL test = xmlConversionManager.convertObject(control, URL.class);
         assertEquals(control, test);
     }
 
     public void testUrlToInteger() {
         try {
             URL control = new URL(URL);
-            URL test = (URL) xmlConversionManager.convertObject(control, Integer.class);
+            xmlConversionManager.convertObject(control, Integer.class);
         } catch(ConversionException e) {
             return;
         } catch(Exception e) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/XMLGregorianCalendarTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/XMLGregorianCalendarTestCases.java
index 7f6db7c..8f24235 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/XMLGregorianCalendarTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlconversionmanager/XMLGregorianCalendarTestCases.java
@@ -168,28 +168,28 @@
         String timeString       = "07:30:00+03:00";
         String dateTimeString   = "2009-02-17T07:30:00.000+03:00";
 
-        testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_DAY_QNAME);
+        testString = getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_DAY_QNAME);
         assertEquals("Object to String conversion failed.", gDayString, testString);
 
-        testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_MONTH_QNAME);
+        testString = getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_MONTH_QNAME);
         assertEquals("Object to String conversion failed.", gMonthString, testString);
 
-        testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_MONTH_DAY_QNAME);
+        testString = getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_MONTH_DAY_QNAME);
         assertEquals("Object to String conversion failed.", gMonthDayString, testString);
 
-        testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_YEAR_QNAME);
+        testString = getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_YEAR_QNAME);
         assertEquals("Object to String conversion failed.", gYearString, testString);
 
-        testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
+        testString = getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.G_YEAR_MONTH_QNAME);
         assertEquals("Object to String conversion failed.", gYearMonthString, testString);
 
-        testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.DATE_QNAME);
+        testString = getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.DATE_QNAME);
         assertEquals("Object to String conversion failed.", dateString, testString);
 
-        testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.TIME_QNAME);
+        testString = getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.TIME_QNAME);
         assertEquals("Object to String conversion failed.", timeString, testString);
 
-        testString = (String) getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.DATE_TIME_QNAME);
+        testString = getXmlConversionManager().convertObject(aCal, String.class, XMLConstants.DATE_TIME_QNAME);
         assertEquals("Object to String conversion failed.", dateTimeString, testString);
     }
 
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDODataObject.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDODataObject.java
index e0d9946..d88931c 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDODataObject.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDODataObject.java
@@ -693,7 +693,7 @@
         Type sdotype = null;
         boolean isMany = false;
         boolean isContainment = false;
-        Class valueClass = value.getClass();
+        Class<? extends Object> valueClass = value.getClass();
 
         if (value instanceof Collection) {
             if (((Collection)value).size() > 0) {
@@ -745,7 +745,7 @@
         propertyDO.set("name", name);
         boolean isMany = false;
         boolean isContainment = false;
-        Class valueClass = value.getClass();
+        Class<? extends Object> valueClass = value.getClass();
 
         if (value instanceof Collection) {
             if (((Collection)value).size() > 0) {
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDOType.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDOType.java
index fc6e519..def14e3 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDOType.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDOType.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
@@ -180,7 +180,7 @@
         if ((javaClass == null) && (javaClassName != null)) {
             try {
                 SDOClassLoader loader = ((SDOXMLHelper)aHelperContext.getXMLHelper()).getLoader();
-                Class clazz = loader.getParent().loadClass(javaClassName);
+                Class<?> clazz = loader.getParent().loadClass(javaClassName);
                 if(isValidInstanceClass(clazz)) {
                     javaClass = clazz;
                 } else {
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/ApplicationAccessWLS.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/ApplicationAccessWLS.java
index 69d7802..461fd76 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/ApplicationAccessWLS.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/ApplicationAccessWLS.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 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
@@ -143,14 +143,14 @@
 
         try {
             // Get component invocation manager
-            final Class cicManagerClass = PrivilegedAccessHelper.getClassForName(CIC_MANAGER_CLASS_NAME);
+            final Class<Object> cicManagerClass = PrivilegedAccessHelper.getClassForName(CIC_MANAGER_CLASS_NAME);
             final Method getInstance = PrivilegedAccessHelper.getDeclaredMethod(cicManagerClass, "getInstance", new Class[]{});
             cicManagerInstance = PrivilegedAccessHelper.invokeMethod(getInstance, cicManagerClass);
 
             // Get component invocation context
             getCurrentCicMethod = PrivilegedAccessHelper.getMethod(cicManagerClass, "getCurrentComponentInvocationContext", new Class[]{}, true);
 
-            final Class cicClass = PrivilegedAccessHelper.getClassForName(CIC_CLASS_NAME);
+            final Class<Object> cicClass = PrivilegedAccessHelper.getClassForName(CIC_CLASS_NAME);
             getApplicationIdMethod = PrivilegedAccessHelper.getDeclaredMethod(cicClass, "getApplicationId", new Class[]{});
 
             return true;
@@ -165,7 +165,7 @@
      */
     protected boolean initUsingApplicationAccess() {
         try {
-            final Class applicationAccessClass = PrivilegedAccessHelper.getClassForName("weblogic.application.ApplicationAccess");
+            final Class<Object> applicationAccessClass = PrivilegedAccessHelper.getClassForName("weblogic.application.ApplicationAccess");
             final Method getApplicationAccessMethod = PrivilegedAccessHelper.getDeclaredMethod(applicationAccessClass, "getApplicationAccess", new Class[]{});
             applicationAccessInstance = PrivilegedAccessHelper.invokeMethod(getApplicationAccessMethod, applicationAccessClass);
 
@@ -185,7 +185,7 @@
      */
     private String getAppNameUsingCic() throws InvocationTargetException, IllegalAccessException {
         final Object cicInstance = PrivilegedAccessHelper.invokeMethod(getCurrentCicMethod, cicManagerInstance);
-        return (String) PrivilegedAccessHelper.invokeMethod(getApplicationIdMethod, cicInstance);
+        return PrivilegedAccessHelper.invokeMethod(getApplicationIdMethod, cicInstance);
     }
 
     /**
@@ -193,9 +193,9 @@
      */
     private String getAppNameUsingApplicationAccess(ClassLoader classLoader) throws InvocationTargetException, IllegalAccessException {
         final Object[] parameters = new Object[] {classLoader};
-        final String appName = (String) PrivilegedAccessHelper.invokeMethod(getApplicationNameMethod, applicationAccessInstance, parameters);
+        final String appName = PrivilegedAccessHelper.invokeMethod(getApplicationNameMethod, applicationAccessInstance, parameters);
         if (appName != null) {
-            final String appVersion = (String) PrivilegedAccessHelper.invokeMethod(getApplicationVersionMethod, applicationAccessInstance, parameters);
+            final String appVersion = PrivilegedAccessHelper.invokeMethod(getApplicationVersionMethod, applicationAccessInstance, parameters);
             if (appVersion != null) {
                 return appName + "#" + appVersion;
             }
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/DynamicClassWriter.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/DynamicClassWriter.java
index 430ff4c..7ccd85c 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/DynamicClassWriter.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/DynamicClassWriter.java
@@ -68,7 +68,7 @@
         if (type.isSubType()) {
             try {
                 Field parentEndPropertyIndexField = PrivilegedAccessHelper.getField(parentClass, END_PROPERTY_INDEX, true);
-                Integer parentEndPropertyIndex = (Integer) PrivilegedAccessHelper.getValueFromField(parentEndPropertyIndexField, parentClass);
+                Integer parentEndPropertyIndex = PrivilegedAccessHelper.getValueFromField(parentEndPropertyIndexField, parentClass);
                 startPropertyIndex = parentEndPropertyIndex + 1;
             } catch (NoSuchFieldException e) {
                 startPropertyIndex = 0;
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOClassGenerator.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOClassGenerator.java
index 466311d..ec5b563 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOClassGenerator.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOClassGenerator.java
@@ -14,11 +14,13 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.sdo.helper;
 
+import commonj.sdo.Type;
 import commonj.sdo.helper.HelperContext;
 import java.io.FileReader;
 import java.io.IOException;
 import java.io.Reader;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
 import javax.xml.namespace.QName;
@@ -221,7 +223,7 @@
 
     public Map generate(Source xsdSource, CodeWriter aCodeWriter, SchemaResolver schemaResolver, boolean bProcessImports) {
         SDOTypesGenerator gen = new SDOTypesGenerator(aHelperContext);
-        java.util.List types = gen.define(xsdSource, schemaResolver, true, bProcessImports);
+        List<Type> types = gen.define(xsdSource, schemaResolver, true, bProcessImports);
         return generate(aCodeWriter, types);
     }
 
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOCopyHelper.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOCopyHelper.java
index b671745..6a16728 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOCopyHelper.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOCopyHelper.java
@@ -26,7 +26,6 @@
 import org.eclipse.persistence.sdo.SDODataObject;
 import org.eclipse.persistence.sdo.SDOProperty;
 import org.eclipse.persistence.sdo.SDOSequence;
-import org.eclipse.persistence.sdo.SDOType;
 import org.eclipse.persistence.sdo.ValueStore;
 import org.eclipse.persistence.exceptions.SDOException;
 import commonj.sdo.ChangeSummary;
@@ -155,9 +154,9 @@
         }
 
         if (dataObject.getType().isSequenced()) {
-            List settings = ((SDOSequence)dataObject.getSequence()).getSettings();
+            List<Setting> settings = ((SDOSequence)dataObject.getSequence()).getSettings();
             for (int index = 0, size = dataObject.getSequence().size(); index < size; index++) {
-                Setting nextSetting = (Setting)settings.get(index);
+                Setting nextSetting = settings.get(index);
 
                 Property prop = dataObject.getSequence().getProperty(index);
                 if (prop == null || prop.getType().isDataType()) {
@@ -394,9 +393,9 @@
 
         SDOProperty seqProperty = null;
         try {
-            List settings = origSequence.getSettings();
+            List<Setting> settings = origSequence.getSettings();
             for (int index = 0, size = origSequence.size(); index < size; index++) {
-                Setting nextSetting = (Setting)settings.get(index);
+                Setting nextSetting = settings.get(index);
                 seqProperty = origSequence.getProperty(nextSetting);
 
                 if ((null == seqProperty) || seqProperty.getType().isDataType()) {
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDODataHelper.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDODataHelper.java
index e62b35a..ab44eee 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDODataHelper.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDODataHelper.java
@@ -32,7 +32,6 @@
 import javax.xml.namespace.QName;
 import org.eclipse.persistence.sdo.SDOConstants;
 import org.eclipse.persistence.sdo.SDOProperty;
-import org.eclipse.persistence.sdo.SDOType;
 import org.eclipse.persistence.exceptions.ConversionException;
 import org.eclipse.persistence.exceptions.SDOException;
 import org.eclipse.persistence.internal.core.sessions.CoreAbstractSession;
@@ -734,18 +733,18 @@
             // convert a DataHandler to a string, by getting the bytes and then
             // calling into conversion manager
             try {
-                Class binaryDataHelper = PrivilegedAccessHelper.getClassForName("org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper");
+                Class<Object> binaryDataHelper = PrivilegedAccessHelper.getClassForName("org.eclipse.persistence.internal.oxm.XMLBinaryDataHelper");
                 java.lang.reflect.Method getHelperMethod = PrivilegedAccessHelper.getMethod(binaryDataHelper, "getXMLBinaryDataHelper", new Class[] {}, false);
                 java.lang.reflect.Method stringToDataHandlerMethod = PrivilegedAccessHelper.getMethod(binaryDataHelper, "stringFromDataHandler", new Class[] { Object.class, QName.class, CoreAbstractSession.class }, false);
 
                 Object helper = PrivilegedAccessHelper.invokeMethod(getHelperMethod, binaryDataHelper, new Object[] {});
-                String result = (String) PrivilegedAccessHelper.invokeMethod(stringToDataHandlerMethod, helper, new Object[] { value, xsdType, ((SDOXMLHelper) getHelperContext().getXMLHelper()).getXmlContext().getSession() });
+                String result = PrivilegedAccessHelper.invokeMethod(stringToDataHandlerMethod, helper, new Object[] { value, xsdType, ((SDOXMLHelper) getHelperContext().getXMLHelper()).getXmlContext().getSession() });
                 return result;
             } catch (Exception ex) {
-                return (String) getXMLConversionManager().convertObject(value, ClassConstants.STRING, xsdType);
+                return getXMLConversionManager().convertObject(value, ClassConstants.STRING, xsdType);
             }
         }
-        return (String) getXMLConversionManager().convertObject(value, ClassConstants.STRING, xsdType);
+        return getXMLConversionManager().convertObject(value, ClassConstants.STRING, xsdType);
     }
 
     /**
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOEqualityHelper.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOEqualityHelper.java
index d822fa2..42676f0 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOEqualityHelper.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOEqualityHelper.java
@@ -24,7 +24,6 @@
 import org.eclipse.persistence.sdo.SDODataObject;
 import org.eclipse.persistence.sdo.SDOProperty;
 import org.eclipse.persistence.sdo.SDOSequence;
-import org.eclipse.persistence.sdo.SDOType;
 import org.eclipse.persistence.oxm.XMLRoot;
 import org.eclipse.persistence.oxm.sequenced.Setting;
 
@@ -240,8 +239,8 @@
             return false;
         }
         // the settings inside the sequence must be new objects
-        List originalSettingsList = aSequence.getSettings();
-        List copySettingsList = aSequenceCopy.getSettings();
+        List<Setting> originalSettingsList = aSequence.getSettings();
+        List<Setting> copySettingsList = aSequenceCopy.getSettings();
         if ((null == originalSettingsList) || (null == copySettingsList)) {
             return false;
         }
@@ -258,8 +257,8 @@
          */
         if (isDeep) {
             for (int index = 0, size = aSequence.size(); index < size; index++) {
-                originalProperty = aSequence.getProperty((Setting) originalSettingsList.get(index));
-                copyProperty = aSequenceCopy.getProperty((Setting) copySettingsList.get(index));
+                originalProperty = aSequence.getProperty(originalSettingsList.get(index));
+                copyProperty = aSequenceCopy.getProperty(copySettingsList.get(index));
 
                 // we must handle null properties that represent unstructured text
                 // both null = unstructured
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOHelperContext.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOHelperContext.java
index 030a025..167d226 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOHelperContext.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOHelperContext.java
@@ -543,7 +543,7 @@
         if (null == contextMap) {
             contextMap = new ConcurrentHashMap<String, HelperContext>();
             // use putIfAbsent to avoid concurrent entries in the map
-            ConcurrentHashMap existingMap = helperContexts.putIfAbsent(contextMapKey, contextMap);
+            ConcurrentHashMap<String, HelperContext> existingMap = helperContexts.putIfAbsent(contextMapKey, contextMap);
             if (existingMap != null) {
                 // if a new entry was just added, use it instead of the one we just created
                 contextMap = existingMap;
@@ -1329,7 +1329,7 @@
         if (null == alias) {
             alias = new ConcurrentHashMap<String, String>();
             // use putIfAbsent to avoid concurrent entries in the map
-            ConcurrentHashMap existingMap = aliasMap.putIfAbsent(mapKey, alias);
+            ConcurrentHashMap<String, String> existingMap = aliasMap.putIfAbsent(mapKey, alias);
             if (existingMap != null) {
                 // if a new entry was just added, use it instead of the one we just created
                 alias = existingMap;
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOMarshalListener.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOMarshalListener.java
index b90f019..9cc5981 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOMarshalListener.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOMarshalListener.java
@@ -220,7 +220,7 @@
                 List unsetPropNames = changeSummary.getUnsetProps(nextModifiedDO);
                 if (!unsetPropNames.isEmpty()) {
                     XMLConversionManager xmlConversionManager = ((SDOXMLHelper)typeHelper.getHelperContext().getXMLHelper()).getXmlConversionManager();
-                    String unsetPropsString = (String)xmlConversionManager.convertObject(unsetPropNames, String.class);
+                    String unsetPropsString = xmlConversionManager.convertObject(unsetPropNames, String.class);
                     csNode.setAttributeNS(SDOConstants.SDO_URL, sdoPrefix +//
                                           SDOConstants.SDO_XPATH_NS_SEPARATOR_FRAGMENT +//
                                           SDOConstants.CHANGESUMMARY_UNSET, unsetPropsString);
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOSchemaGenerator.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOSchemaGenerator.java
index c247990..fc27274 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOSchemaGenerator.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOSchemaGenerator.java
@@ -572,7 +572,7 @@
         if (sdoProperty.isDefaultSet()) {
             if (!sdoProperty.isMany() && sdoProperty.getType().isDataType()) {
                 XMLConversionManager xmlConversionManager = ((SDOXMLHelper)aHelperContext.getXMLHelper()).getXmlConversionManager();
-                elem.setDefaultValue((String)xmlConversionManager.convertObject(sdoProperty.getDefault(), ClassConstants.STRING, sdoProperty.getXsdType()));
+                elem.setDefaultValue(xmlConversionManager.convertObject(sdoProperty.getDefault(), ClassConstants.STRING, sdoProperty.getXsdType()));
             }
 
         }
@@ -678,7 +678,7 @@
         if (((SDOProperty)property).isDefaultSet()) {
             if (!property.isMany() && property.getType().isDataType()) {
                 XMLConversionManager xmlConversionManager = ((SDOXMLHelper)aHelperContext.getXMLHelper()).getXmlConversionManager();
-                attr.setDefaultValue((String)xmlConversionManager.convertObject(property.getDefault(), ClassConstants.STRING, ((SDOProperty)property).getXsdType()));
+                attr.setDefaultValue(xmlConversionManager.convertObject(property.getDefault(), ClassConstants.STRING, ((SDOProperty)property).getXsdType()));
             }
         }
         addSimpleComponentAnnotations(attr, property, false);
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java
index 63f6407..1e5d85c 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java
@@ -180,10 +180,10 @@
                 ((SDOTypeHelper) aHelperContext.getTypeHelper()).addType(nextSDOType);
             }
 
-            Iterator anonymousIterator = getAnonymousTypes().iterator();
+            Iterator<SDOType> anonymousIterator = getAnonymousTypes().iterator();
 
             while (anonymousIterator.hasNext()) {
-                SDOType nextSDOType = (SDOType) anonymousIterator.next();
+                SDOType nextSDOType = anonymousIterator.next();
                 ((SDOTypeHelper) aHelperContext.getTypeHelper()).getAnonymousTypes().add(nextSDOType);
             }
 
@@ -470,7 +470,7 @@
         String value = (String) complexType.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
         if (value != null) {
             XMLConversionManager xmlConversionManager = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlConversionManager();
-            java.util.List names = (java.util.List) xmlConversionManager.convertObject(value, java.util.List.class);
+            java.util.List names = xmlConversionManager.convertObject(value, java.util.List.class);
             currentType.setAliasNames(names);
         }
 
@@ -758,7 +758,7 @@
         String value = (String) simpleType.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
         if (value != null) {
             XMLConversionManager xmlConversionManager = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlConversionManager();
-            java.util.List names = (java.util.List) xmlConversionManager.convertObject(value, java.util.List.class);
+            java.util.List names = xmlConversionManager.convertObject(value, java.util.List.class);
             currentType.setAliasNames(names);
         }
 
@@ -1706,7 +1706,7 @@
         String aliasNamesValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
         if (aliasNamesValue != null) {
             XMLConversionManager xmlConversionManager = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlConversionManager();
-            java.util.List names = (java.util.List) xmlConversionManager.convertObject(aliasNamesValue, java.util.List.class);
+            java.util.List names = xmlConversionManager.convertObject(aliasNamesValue, java.util.List.class);
             p.setAliasNames(names);
         }
 
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOUnmarshalListener.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOUnmarshalListener.java
index 42636d1..2e72d3a 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOUnmarshalListener.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOUnmarshalListener.java
@@ -144,7 +144,7 @@
                     List unsetValueList = new ArrayList();
                     if ((unsetValue != null) && (unsetValue.length() > 0)) {
                         XMLConversionManager xmlConversionManager = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlConversionManager();
-                        unsetValueList = (List)xmlConversionManager.convertObject(unsetValue, List.class);
+                        unsetValueList = xmlConversionManager.convertObject(unsetValue, List.class);
                     }
                     if (nextModifiedDO != null) {
                         nextModifiedDO._setModified(true);
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/delegates/SDOTypeHelperDelegate.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/delegates/SDOTypeHelperDelegate.java
index d372725..c70afcb 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/delegates/SDOTypeHelperDelegate.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/delegates/SDOTypeHelperDelegate.java
@@ -475,7 +475,7 @@
         wrappersHashMap.put(SDOConstants.SDO_SHORTOBJECT.getQName(), SDO_SHORTOBJECT_WRAPPER);
 
         // Now add these into the impl-to-type Map
-        Iterator wrappers = wrappersHashMap.values().iterator();
+        Iterator<SDOType> wrappers = wrappersHashMap.values().iterator();
         while (wrappers.hasNext()) {
             SDOWrapperType wrapper = (SDOWrapperType) wrappers.next();
             Iterator descriptors = wrapper.getDescriptorsMap().values().iterator();
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/jaxb/JAXBValueStore.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/jaxb/JAXBValueStore.java
index e1b44fd..a878f4f 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/jaxb/JAXBValueStore.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/jaxb/JAXBValueStore.java
@@ -372,20 +372,20 @@
                     xPathFragment = null;
                     break;
                 }
-                Map attributeChildrenMap = xPathNode.getAttributeChildrenMap();
+                Map<XPathFragment, XPathNode> attributeChildrenMap = xPathNode.getAttributeChildrenMap();
                 if (null == attributeChildrenMap) {
                     xPathNode = null;
                 } else {
-                    xPathNode = (XPathNode) attributeChildrenMap.get(xPathFragment);
+                    xPathNode = attributeChildrenMap.get(xPathFragment);
                 }
             } else if (xPathFragment.nameIsText()) {
                 xPathNode = xPathNode.getTextNode();
             } else {
-                Map nonAttributeChildrenMap = xPathNode.getNonAttributeChildrenMap();
+                Map<XPathFragment, XPathNode> nonAttributeChildrenMap = xPathNode.getNonAttributeChildrenMap();
                 if (null == nonAttributeChildrenMap) {
                     xPathNode = null;
                 } else {
-                    xPathNode = (XPathNode) nonAttributeChildrenMap.get(xPathFragment);
+                    xPathNode = nonAttributeChildrenMap.get(xPathFragment);
                 }
             }
             xPathFragment = xPathFragment.getNextFragment();
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/SDOTestCase.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/SDOTestCase.java
index 2243371..07dfd8d 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/SDOTestCase.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/SDOTestCase.java
@@ -35,15 +35,15 @@
 import java.util.List;
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.eclipse.persistence.oxm.sequenced.Setting;
 import org.eclipse.persistence.sdo.SDOChangeSummary;
 import org.eclipse.persistence.sdo.SDOConstants;
 import org.eclipse.persistence.sdo.SDODataObject;
 import org.eclipse.persistence.sdo.SDOProperty;
 import org.eclipse.persistence.sdo.SDOSequence;
 import org.eclipse.persistence.sdo.SDOSetting;
-import org.eclipse.persistence.sdo.SDOType;
 import org.eclipse.persistence.sdo.ValueStore;
-import org.eclipse.persistence.sdo.helper.SDOClassLoader;
 import org.eclipse.persistence.sdo.helper.SDODataHelper;
 import org.eclipse.persistence.sdo.helper.SDOHelperContext;
 import org.eclipse.persistence.sdo.helper.SDOTypeHelper;
@@ -53,7 +53,6 @@
 import commonj.sdo.impl.HelperProvider;
 import org.eclipse.persistence.Version;
 import org.eclipse.persistence.logging.AbstractSessionLog;
-import org.eclipse.persistence.platform.xml.XMLComparer;
 
 import static org.eclipse.persistence.sdo.SDOConstants.*;
 
@@ -406,9 +405,9 @@
                     } else if (aType.equals(SDO_CHARACTER)) {
                         assertEquals(0, ((Character)aPropertyValue).charValue());
                     } else if (aType.equals(SDO_DOUBLE)) {
-                        assertEquals(0, (Double) aPropertyValue);
+                        assertEquals(0, aPropertyValue);
                     } else if (aType.equals(SDO_FLOAT)) {
-                        assertEquals(0, (Float) aPropertyValue);
+                        assertEquals(0, aPropertyValue);
                     } else if (aType.equals(SDO_INT)) {
                         assertEquals(0, ((Integer)aPropertyValue).intValue());
                     } else if (aType.equals(SDO_SHORT)) {
@@ -699,8 +698,8 @@
         // the settings inside the sequence must be new objects
         SDOSetting originalSetting = null;
         SDOSetting copySetting = null;
-        List originalSettingsList = aSequence.getSettings();
-        List copySettingsList = aSequenceCopy.getSettings();
+        List<? super Setting> originalSettingsList = aSequence.getSettings();
+        List<? super Setting> copySettingsList = aSequenceCopy.getSettings();
         if (null == originalSettingsList || null == copySettingsList) {
             return false;
         }
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/SDOXMLComparer.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/SDOXMLComparer.java
index 734aed8..aaaf513 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/SDOXMLComparer.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/SDOXMLComparer.java
@@ -38,8 +38,8 @@
             String testValue = test.getNodeValue();
             if (controlValue.length() == testValue.length()) {
                 try {
-                    List controlList = (List)XMLConversionManager.getDefaultXMLManager().convertObject(controlValue, List.class);
-                    List testList = (List)XMLConversionManager.getDefaultXMLManager().convertObject(testValue, List.class);
+                    List controlList = XMLConversionManager.getDefaultXMLManager().convertObject(controlValue, List.class);
+                    List testList = XMLConversionManager.getDefaultXMLManager().convertObject(testValue, List.class);
                     if (controlList.size() == testList.size()) {
                         if ((controlList.containsAll(testList)) && testList.containsAll(controlList)) {
                             return true;
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/datafactory/SDODataFactoryExceptionTestCases.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/datafactory/SDODataFactoryExceptionTestCases.java
index fa37e41..9b2d189 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/datafactory/SDODataFactoryExceptionTestCases.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/datafactory/SDODataFactoryExceptionTestCases.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
@@ -86,7 +86,7 @@
      }
 
      public void testInvalidInterfaceClass() throws Exception {
-         Class theClass = this.getClass();
+         Class<? extends SDODataFactoryExceptionTestCases> theClass = this.getClass();
          try {
              dataFactory.create(theClass);
              fail("An IllegalArugmentException should have occurred");
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/helpercontext/SDOHelperContextTest.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/helpercontext/SDOHelperContextTest.java
index f8029dd..5968c0f 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/helpercontext/SDOHelperContextTest.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/helpercontext/SDOHelperContextTest.java
@@ -186,7 +186,7 @@
     @SuppressWarnings("unchecked")
     public void testNotificationListenerWLS() throws Exception {
         final String applicationName = "App1";
-        Class listenerClass = Class.forName("org.eclipse.persistence.sdo.helper.SDOHelperContext$MyNotificationListener");
+        Class<? extends NotificationListener> listenerClass = (Class<? extends NotificationListener>) Class.forName("org.eclipse.persistence.sdo.helper.SDOHelperContext$MyNotificationListener");
         Constructor<? extends NotificationListener> constructor = listenerClass.getDeclaredConstructor(String.class, int.class);
         Field helperContextsField = SDOHelperContext.class.getDeclaredField("helperContexts");
         Field appNameToClassLoaderMapField = SDOHelperContext.class.getDeclaredField("appNameToClassLoaderMap");
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/jaxbhelper/mappings/MappingsTestCases.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/jaxbhelper/mappings/MappingsTestCases.java
index 3cd4dc7..62c8644 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/jaxbhelper/mappings/MappingsTestCases.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/jaxbhelper/mappings/MappingsTestCases.java
@@ -70,7 +70,7 @@
         assertTrue(doSimpleList.contains("FOO"));
         assertTrue(doSimpleList.contains("BAR"));
 
-        List simpleList = root.getSimpleList();
+        List<String> simpleList = root.getSimpleList();
         assertEquals(2, simpleList.size());
         assertTrue(simpleList.contains("FOO"));
         assertTrue(simpleList.contains("BAR"));
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xmlhelper/datatype/SDOXMLHelperDatatypeTestCase.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xmlhelper/datatype/SDOXMLHelperDatatypeTestCase.java
index 5167ec1..7e372e8 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xmlhelper/datatype/SDOXMLHelperDatatypeTestCase.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xmlhelper/datatype/SDOXMLHelperDatatypeTestCase.java
@@ -18,22 +18,17 @@
 import java.io.ByteArrayOutputStream;
 import java.io.FileInputStream;
 import java.io.StringReader;
-import java.util.ArrayList;
 
 import javax.xml.transform.stream.StreamResult;
 
 import org.eclipse.persistence.sdo.SDOConstants;
-import org.eclipse.persistence.sdo.SDOProperty;
 import org.eclipse.persistence.sdo.SDOType;
 import org.eclipse.persistence.sdo.SDOXMLDocument;
-import org.eclipse.persistence.sdo.helper.SDOXMLHelper;
-import org.eclipse.persistence.sdo.helper.delegates.SDOTypeHelperDelegator;
 import org.eclipse.persistence.testing.sdo.SDOTestCase;
 import org.w3c.dom.Document;
 import org.xml.sax.InputSource;
 
 import commonj.sdo.DataObject;
-import commonj.sdo.Property;
 import commonj.sdo.helper.XMLDocument;
 
 public abstract class SDOXMLHelperDatatypeTestCase extends SDOTestCase {
@@ -125,7 +120,7 @@
 
         assertNull(document.getRootObject().getType().getInstanceClass());
 
-        Class instanceClassFromDocument = document.getRootObject().get("value").getClass();
+        Class<? extends Object> instanceClassFromDocument = document.getRootObject().get("value").getClass();
         assertEquals(getDatatypeJavaClass(), instanceClassFromDocument);
     }
 
@@ -137,7 +132,7 @@
 
         assertNull(document.getRootObject().getType().getInstanceClass());
 
-        Class instanceClassFromDocument = document.getRootObject().get("value").getClass();
+        Class<? extends Object> instanceClassFromDocument = document.getRootObject().get("value").getClass();
         assertEquals(getDatatypeJavaClass(), instanceClassFromDocument);
     }
 
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xmlhelper/loadandsave/LoadAndSaveTestCases.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xmlhelper/loadandsave/LoadAndSaveTestCases.java
index 69e851d..8a97d1f 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xmlhelper/loadandsave/LoadAndSaveTestCases.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xmlhelper/loadandsave/LoadAndSaveTestCases.java
@@ -73,7 +73,7 @@
         String className = package1 + "/" + getRootInterfaceName();
         className = className.replaceAll("/", ".");
 
-        Class urlLoadedClass = myURLLoader.loadClass(className);
+        Class<?> urlLoadedClass = myURLLoader.loadClass(className);
 
         ((SDOXMLHelper)xmlHelper).setLoader(new SDOClassLoader(myURLLoader, aHelperContext));
         Class loadedClass2 = ((SDOXMLHelper)xmlHelper).getLoader().loadClass(className);
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xsdhelper/define/ComplexImportsAndIncludesTestCases.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xsdhelper/define/ComplexImportsAndIncludesTestCases.java
index e99ca35..aefcdc7 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xsdhelper/define/ComplexImportsAndIncludesTestCases.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xsdhelper/define/ComplexImportsAndIncludesTestCases.java
@@ -19,6 +19,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.URI;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import javax.xml.transform.Source;
@@ -62,7 +63,7 @@
             java.util.Properties fileProps = new java.util.Properties();
             fileProps.load(indexFIS);
 
-            java.util.Enumeration keyEnum = fileProps.keys();
+            Enumeration<Object> keyEnum = fileProps.keys();
             while (keyEnum.hasMoreElements()) {
                 String s = (String) keyEnum.nextElement();
                 fileIndex.put(fileProps.get(s), s);
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xsdhelper/define/DefineWithImportsNoSchemaLocationTestCases.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xsdhelper/define/DefineWithImportsNoSchemaLocationTestCases.java
index c0c1df1..5fefa86 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xsdhelper/define/DefineWithImportsNoSchemaLocationTestCases.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/helper/xsdhelper/define/DefineWithImportsNoSchemaLocationTestCases.java
@@ -16,7 +16,7 @@
 
 import commonj.sdo.DataObject;
 import commonj.sdo.Type;
-import java.io.FileInputStream;
+
 import java.io.InputStream;
 import java.net.URI;
 import java.net.URL;
@@ -25,8 +25,6 @@
 import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
 import junit.textui.TestRunner;
-import org.eclipse.persistence.sdo.SDOConstants;
-import org.eclipse.persistence.sdo.SDOProperty;
 import org.eclipse.persistence.sdo.SDOType;
 import org.eclipse.persistence.sdo.helper.SDOXSDHelper;
 import org.eclipse.persistence.sdo.helper.SchemaResolver;
@@ -50,7 +48,7 @@
 
         List types = ((SDOXSDHelper) xsdHelper).define(new StreamSource(is), new TestResolver(getSchemaLocation()));
         log("\nExpected:\n");
-        List controlTypes = getControlTypes();
+        List<Type> controlTypes = getControlTypes();
         log(controlTypes);
 
         log("\nActual:\n");
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/changesummary/ChangeSummaryXSDWithCSonChildUndoTestCases.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/changesummary/ChangeSummaryXSDWithCSonChildUndoTestCases.java
index c698778..45cb9e3 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/changesummary/ChangeSummaryXSDWithCSonChildUndoTestCases.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/changesummary/ChangeSummaryXSDWithCSonChildUndoTestCases.java
@@ -14,21 +14,13 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.testing.sdo.model.changesummary;
 
-import java.io.FileInputStream;
-import java.io.InputStream;
-import java.util.ArrayList;
-import java.util.Iterator;
 import java.util.List;
 import junit.textui.TestRunner;
 import org.eclipse.persistence.sdo.SDOChangeSummary;
 import org.eclipse.persistence.sdo.SDODataObject;
 import org.eclipse.persistence.sdo.ValueStore;
-import org.eclipse.persistence.sdo.helper.ListWrapper;
-import org.eclipse.persistence.testing.sdo.SDOTestCase;
 import commonj.sdo.ChangeSummary;
 import commonj.sdo.DataObject;
-import commonj.sdo.Property;
-import commonj.sdo.helper.XMLDocument;
 
 /**
  * This test suite will exercise mulit-operations on changeSummaries that are below the root as well as inter-changeSummary ops.
@@ -411,7 +403,7 @@
         // verify that the objects are returned back to their original stes
         assertNotNull(salesPO1DO.get("items"));
         assertNull(salesPO1DO2.get("items"));
-        List preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
+        List<DataObject> preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
         assertEquals(62, preOrderList.size());
     }
 
@@ -507,7 +499,7 @@
         // verify that the object above the tree is still set
         assertNotNull(salesDO.get("employee[1]"));
         assertNotNull(salesPO1DO.get("buyer"));
-        List preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
+        List<DataObject> preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
         assertEquals(63, preOrderList.size());
     }
 
@@ -1037,7 +1029,7 @@
         assertNotNull(salesPO1ItemsDO.getChangeSummary());
         assertNotNull(salesPO2ItemsDO.getChangeSummary());
 
-        List preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
+        List<DataObject> preOrderList = preOrderTraversalDataObjectList((SDODataObject)rootObject, false);
         assertEquals(62, preOrderList.size());
 
         // preoperation setup
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/dataobject/OpenSequencedTypeTestCases.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/dataobject/OpenSequencedTypeTestCases.java
index 6d32a94..c3b184e 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/dataobject/OpenSequencedTypeTestCases.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/dataobject/OpenSequencedTypeTestCases.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -17,7 +17,6 @@
 import org.eclipse.persistence.sdo.dataobjects.OpenSequencedTypeImpl;
 import org.eclipse.persistence.testing.sdo.SDOTestCase;
 
-import commonj.sdo.Type;
 import commonj.sdo.helper.TypeHelper;
 
 public class OpenSequencedTypeTestCases extends SDOTestCase {
@@ -34,7 +33,7 @@
 
         // Test that the implClass of the Type found in TypeHelper matches the
         // Class in our library (therefore not generated dynamically).
-        Class classFromLib = OpenSequencedTypeImpl.class;
+        Class<OpenSequencedTypeImpl> classFromLib = OpenSequencedTypeImpl.class;
         assertEquals("Classes did not match", classFromLib, typeFromTypeHelper.getImplClass());
     }
 
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/dataobject/xpathengine/XPathEngineBug242108TestCases.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/dataobject/xpathengine/XPathEngineBug242108TestCases.java
index 163e03d..61bfdf3 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/dataobject/xpathengine/XPathEngineBug242108TestCases.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/dataobject/xpathengine/XPathEngineBug242108TestCases.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
@@ -25,7 +25,6 @@
 import org.eclipse.persistence.testing.sdo.SDOTestCase;
 
 import commonj.sdo.DataObject;
-import commonj.sdo.helper.DataFactory;
 
 public class XPathEngineBug242108TestCases extends SDOTestCase {
 
@@ -51,7 +50,7 @@
 
         DataObject do1 = dataFactory.create(testObjectUri, testObjectName);
 
-        Class expectedExceptionClass = IllegalArgumentException.class;
+        Class<IllegalArgumentException> expectedExceptionClass = IllegalArgumentException.class;
         Class caughtExceptionClass = null;
         try {
             do1.set("activity[0]", new String("Test"));
@@ -67,7 +66,7 @@
         List types = xsdHelper.define(is, null);
         DataObject do1 = dataFactory.create(testObjectUri, testObjectName);
 
-        Class expectedExceptionClass = IndexOutOfBoundsException.class;
+        Class<IndexOutOfBoundsException> expectedExceptionClass = IndexOutOfBoundsException.class;
         Class caughtExceptionClass = null;
         try {
             do1.set("activity[99]", new String("Test"));
@@ -83,7 +82,7 @@
         List types = xsdHelper.define(is, null);
         DataObject do1 = dataFactory.create(testObjectUri, testObjectName);
 
-        Class expectedExceptionClass = IndexOutOfBoundsException.class;
+        Class<IndexOutOfBoundsException> expectedExceptionClass = IndexOutOfBoundsException.class;
         Class caughtExceptionClass = null;
         try {
             do1.set("activity.99", new String("Test"));
@@ -99,7 +98,7 @@
         List types = xsdHelper.define(is, null);
         DataObject do1 = dataFactory.create(testObjectUri, testObjectName);
 
-        Class expectedExceptionClass = IllegalArgumentException.class;
+        Class<IllegalArgumentException> expectedExceptionClass = IllegalArgumentException.class;
         Class caughtExceptionClass = null;
         try {
             do1.set("activity", new String("Test"));
@@ -115,7 +114,7 @@
         List types = xsdHelper.define(is, null);
         DataObject do1 = dataFactory.create(testObjectUri, testObjectName);
 
-        Class expectedExceptionClass = SDOException.class;
+        Class<SDOException> expectedExceptionClass = SDOException.class;
         Class caughtExceptionClass = null;
         try {
             do1.set("activity[0]/what", new String("Test"));
@@ -131,7 +130,7 @@
         List types = xsdHelper.define(is, null);
         DataObject do1 = dataFactory.create(testObjectUri, testObjectName);
 
-        Class expectedExceptionClass = SDOException.class;
+        Class<SDOException> expectedExceptionClass = SDOException.class;
         Class caughtExceptionClass = null;
         try {
             do1.set("activity[99]/what", new String("Test"));
@@ -147,7 +146,7 @@
         List types = xsdHelper.define(is, null);
         DataObject do1 = dataFactory.create(testObjectUri, testObjectName);
 
-        Class expectedExceptionClass = SDOException.class;
+        Class<SDOException> expectedExceptionClass = SDOException.class;
         Class caughtExceptionClass = null;
         try {
             do1.set("activity.99/what", new String("Test"));
@@ -163,7 +162,7 @@
         List types = xsdHelper.define(is, null);
         DataObject do1 = dataFactory.create(testObjectUri, testObjectName);
 
-        Class expectedExceptionClass = SDOException.class;
+        Class<SDOException> expectedExceptionClass = SDOException.class;
         Class caughtExceptionClass = null;
         try {
             do1.set("activity/what", new String("Test"));
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/property/SDOPropertyEqualityTests.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/property/SDOPropertyEqualityTests.java
index 3136c71..a7795a6 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/property/SDOPropertyEqualityTests.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/property/SDOPropertyEqualityTests.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 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
@@ -95,7 +95,7 @@
     }
 
     private List<DataObject> queryDO() {
-        List result = new ArrayList<DataObject>();
+        List<DataObject> result = new ArrayList<>();
 
         DataObject item1DO = DataFactory.INSTANCE.create("org.example", "Item");
         item1DO.set("name", "Telephone");
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/sequence/SDOSequenceTestCS.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/sequence/SDOSequenceTestCS.java
index b07e3d6..2d5d08d 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/sequence/SDOSequenceTestCS.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/sequence/SDOSequenceTestCS.java
@@ -32,13 +32,11 @@
 import org.eclipse.persistence.sdo.SDODataObject;
 import org.eclipse.persistence.sdo.SDOProperty;
 import org.eclipse.persistence.sdo.SDOSequence;
-import org.eclipse.persistence.sdo.SDOSetting;
 import org.eclipse.persistence.sdo.SDOType;
 import org.eclipse.persistence.sdo.helper.DefaultSchemaLocationResolver;
 import org.eclipse.persistence.sdo.helper.ListWrapper;
 import org.eclipse.persistence.sdo.helper.SDOXSDHelper;
 import org.eclipse.persistence.exceptions.SDOException;
-import org.eclipse.persistence.oxm.XMLConstants;
 
 public class SDOSequenceTestCS extends SDOSequenceTestCases {
 
@@ -2466,7 +2464,7 @@
         List<DataObject> aListToAdd = new ArrayList<DataObject>();
         aListToAdd.add(item3);
         aListToAdd.add(item3);
-        for(Iterator i = aListToAdd.iterator(); i.hasNext();) {
+        for(Iterator<DataObject> i = aListToAdd.iterator(); i.hasNext();) {
             // add to the end of the list
             existingList.add(i.next());
         }
diff --git a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/sequence/SDOSequenceTestXSD.java b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/sequence/SDOSequenceTestXSD.java
index 025423f..556d877 100644
--- a/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/sequence/SDOSequenceTestXSD.java
+++ b/sdo/org.eclipse.persistence.sdo/src/test/java/org/eclipse/persistence/testing/sdo/model/sequence/SDOSequenceTestXSD.java
@@ -26,18 +26,15 @@
 import java.util.List;
 
 import junit.textui.TestRunner;
-import org.eclipse.persistence.sdo.SDOChangeSummary;
 import org.eclipse.persistence.sdo.SDOConstants;
 import org.eclipse.persistence.sdo.SDODataObject;
 import org.eclipse.persistence.sdo.SDOProperty;
 import org.eclipse.persistence.sdo.SDOSequence;
-import org.eclipse.persistence.sdo.SDOSetting;
 import org.eclipse.persistence.sdo.SDOType;
 import org.eclipse.persistence.sdo.helper.DefaultSchemaLocationResolver;
 import org.eclipse.persistence.sdo.helper.ListWrapper;
 import org.eclipse.persistence.sdo.helper.SDOXSDHelper;
 import org.eclipse.persistence.exceptions.SDOException;
-import org.eclipse.persistence.oxm.XMLConstants;
 
 public class SDOSequenceTestXSD extends SDOSequenceTestCases {
 
@@ -2783,7 +2780,7 @@
         List<DataObject> aListToAdd = new ArrayList<DataObject>();
         aListToAdd.add(item3);
         aListToAdd.add(item3);
-        for(Iterator i = aListToAdd.iterator(); i.hasNext();) {
+        for(Iterator<DataObject> i = aListToAdd.iterator(); i.hasNext();) {
             // add to the end of the list
             existingList.add(i.next());
         }
@@ -3368,7 +3365,7 @@
         aListToAdd.add(item4);
         aListToAdd.add(item5);
         // add each to the end of the list
-        for(Iterator i = aListToAdd.iterator(); i.hasNext();) {
+        for(Iterator<DataObject> i = aListToAdd.iterator(); i.hasNext();) {
             existingList.add(i.next());
         }
 
diff --git a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/DBWSBuilder.java b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/DBWSBuilder.java
index a38656d..726ded0 100644
--- a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/DBWSBuilder.java
+++ b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/DBWSBuilder.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
@@ -605,7 +605,7 @@
                 Class<?> driverClass = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     driverClass = AccessController.doPrivileged(
-                        new PrivilegedClassForName(driverClassName));
+                        new PrivilegedClassForName<>(driverClassName));
                 }
                 else {
                     driverClass = PrivilegedAccessHelper.getClassForName(driverClassName);
@@ -696,7 +696,7 @@
                 Class<?> platformClass = null;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     platformClass = AccessController.doPrivileged(
-                        new PrivilegedClassForName(platformClassname));
+                        new PrivilegedClassForName<>(platformClassname));
                 }
                 else {
                     platformClass =
diff --git a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/Util.java b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/Util.java
index 899e3c5..554c21c 100644
--- a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/Util.java
+++ b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/Util.java
@@ -41,8 +41,6 @@
 import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
 import static org.eclipse.persistence.internal.helper.ClassConstants.BIGDECIMAL;
 import static org.eclipse.persistence.internal.helper.ClassConstants.BOOLEAN;
-import static org.eclipse.persistence.internal.helper.ClassConstants.JavaSqlDate_Class;
-import static org.eclipse.persistence.internal.helper.ClassConstants.JavaSqlTimestamp_Class;
 import static org.eclipse.persistence.internal.helper.ClassConstants.STRING;
 import static org.eclipse.persistence.internal.oxm.Constants.BASE_64_BINARY_QNAME;
 import static org.eclipse.persistence.internal.oxm.Constants.COLON;
@@ -74,6 +72,7 @@
 
 //EclipseLink imports
 import org.eclipse.persistence.descriptors.RelationalDescriptor;
+import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.internal.oxm.schema.model.Any;
 import org.eclipse.persistence.internal.oxm.schema.model.ComplexType;
@@ -674,10 +673,10 @@
                 return BOOLEAN;
             }
             if (DATE_STR.equals(typeName)) {
-                return JavaSqlDate_Class;
+                return CoreClassConstants.SQLDATE;
             }
             if (TIMESTAMP_STR.equals(typeName)) {
-                return JavaSqlTimestamp_Class;
+                return CoreClassConstants.TIMESTAMP;
             }
         }
         return STRING;
diff --git a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/oracle/OracleHelper.java b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/oracle/OracleHelper.java
index 4382386..78a5f6b 100644
--- a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/oracle/OracleHelper.java
+++ b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/dbws/oracle/OracleHelper.java
@@ -19,7 +19,6 @@
 import static java.sql.Types.STRUCT;
 import static java.util.logging.Level.FINEST;
 // EclipseLink imports
-import static org.eclipse.persistence.internal.helper.ClassConstants.Object_Class;
 import static org.eclipse.persistence.internal.oxm.Constants.ANY_QNAME;
 import static org.eclipse.persistence.internal.oxm.Constants.COLON;
 import static org.eclipse.persistence.internal.oxm.Constants.DATE_QNAME;
@@ -80,6 +79,7 @@
 import javax.xml.namespace.QName;
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.internal.helper.ComplexDatabaseType;
 import org.eclipse.persistence.internal.helper.DatabaseField;
@@ -1556,9 +1556,9 @@
             xField.addJavaConversion(java.sql.Date.class, DATE_QNAME);
             xdesc.getNamespaceResolver().put(SCHEMA_PREFIX, SCHEMA_URL);
         } else {
-            Class<?> attributeClass = (Class<?>)XMLConversionManager.getDefaultXMLTypes().get(qnameFromDatabaseType);
+            Class<?> attributeClass = XMLConversionManager.getDefaultXMLTypes().get(qnameFromDatabaseType);
             if (attributeClass == null) {
-                attributeClass =  Object_Class;
+                attributeClass =  CoreClassConstants.OBJECT;
             }
             fieldMapping.setAttributeClassification(attributeClass);
         }
diff --git a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/metadata/generation/JPAMetadataGenerator.java b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/metadata/generation/JPAMetadataGenerator.java
index 00f5973..15c46fa 100644
--- a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/metadata/generation/JPAMetadataGenerator.java
+++ b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/metadata/generation/JPAMetadataGenerator.java
@@ -1107,7 +1107,7 @@
         Class<?> platformClass = null;
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                platformClass = AccessController.doPrivileged(new PrivilegedClassForName(platformClassName));
+                platformClass = AccessController.doPrivileged(new PrivilegedClassForName<>(platformClassName));
             } else {
                 platformClass = PrivilegedAccessHelper.getClassForName(platformClassName);
             }
@@ -1115,7 +1115,7 @@
         } catch (PrivilegedActionException | ClassNotFoundException | NullPointerException e) {
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
-                    platformClass = AccessController.doPrivileged(new PrivilegedClassForName(DEFAULT_PLATFORM));
+                    platformClass = AccessController.doPrivileged(new PrivilegedClassForName<>(DEFAULT_PLATFORM));
                 } else {
                     platformClass = PrivilegedAccessHelper.getClassForName(DEFAULT_PLATFORM);
                 }
diff --git a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/metadata/generation/Util.java b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/metadata/generation/Util.java
index 540adcf..2aafc43 100644
--- a/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/metadata/generation/Util.java
+++ b/utils/org.eclipse.persistence.dbws.builder/src/main/java/org/eclipse/persistence/tools/metadata/generation/Util.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -14,7 +14,6 @@
 //     David McCann - 2.6.0 - July 09, 2013 - Initial Implementation
 package org.eclipse.persistence.tools.metadata.generation;
 
-import static org.eclipse.persistence.internal.helper.ClassConstants.Object_Class;
 import static org.eclipse.persistence.platform.database.oracle.plsql.OraclePLSQLTypes.XMLType;
 
 import java.sql.Types;
@@ -23,6 +22,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.databaseaccess.DatabasePlatform;
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.tools.oracleddl.metadata.DatabaseType;
@@ -360,7 +360,7 @@
     public static Class<?> getClassFromJDBCTypeName(String typeName, DatabasePlatform databasePlatform) {
         Class<?> clz = databasePlatform.getClassTypes().get(typeName);
         if (clz == null) {
-            return Object_Class;
+            return CoreClassConstants.OBJECT;
         }
         return clz;
     }
