diff --git a/dbws/eclipselink.dbws.test.oracle/src/it/java/dbws/testing/plsqlcollection/PLSQLcollectionTestSuite.java b/dbws/eclipselink.dbws.test.oracle/src/it/java/dbws/testing/plsqlcollection/PLSQLcollectionTestSuite.java
index fb1c20a..d9f435b 100644
--- a/dbws/eclipselink.dbws.test.oracle/src/it/java/dbws/testing/plsqlcollection/PLSQLcollectionTestSuite.java
+++ b/dbws/eclipselink.dbws.test.oracle/src/it/java/dbws/testing/plsqlcollection/PLSQLcollectionTestSuite.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
@@ -268,16 +268,16 @@
             new XRDynamicClassLoader(PLSQLcollectionTestSuite.class.getClassLoader());
         Project projectFromXML = XMLProjectReader.read(new StringReader(TEST_PROJECT_CONTROL_DOC),
             xrdecl);
-        DatasourceLogin login = new DatabaseLogin();
+        DatabaseLogin login = new DatabaseLogin();
         login.setUserName(username);
         login.setPassword(password);
-        ((DatabaseLogin)login).setConnectionString(url);
-        ((DatabaseLogin)login).setDriverClassName("oracle.jdbc.OracleDriver");
+        login.setConnectionString(url);
+        login.setDriverClassName("oracle.jdbc.OracleDriver");
         Platform platform = new Oracle10Platform();
         ConversionManager cm = platform.getConversionManager();
         cm.setLoader(xrdecl);
         login.setDatasourcePlatform(platform);
-        ((DatabaseLogin)login).bindAllParameters();
+        login.bindAllParameters();
         projectFromXML.setDatasourceLogin(login);
         ProjectHelper.fixOROXAccessors(projectFromXML, null);
         xrdecl.dontGenerateSubclasses();
diff --git a/dbws/org.eclipse.persistence.dbws/src/it/java/dbws/testing/relationships/RelationshipsTestSuite.java b/dbws/org.eclipse.persistence.dbws/src/it/java/dbws/testing/relationships/RelationshipsTestSuite.java
index 1913f8e..f558504 100644
--- a/dbws/org.eclipse.persistence.dbws/src/it/java/dbws/testing/relationships/RelationshipsTestSuite.java
+++ b/dbws/org.eclipse.persistence.dbws/src/it/java/dbws/testing/relationships/RelationshipsTestSuite.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) 2020 Payara Services Ltd.
  *
  * This program and the accompanying materials are made available under the
@@ -803,14 +803,14 @@
                 XMLUnmarshaller unmarshaller = context.createUnmarshaller();
                 Project orProject = (Project)unmarshaller.unmarshal(
                         new StringReader(RELATIONSHIPS_OR_PROJECT));
-                DatasourceLogin login = new DatabaseLogin();
+                DatabaseLogin login = new DatabaseLogin();
                 login.setUserName(username);
                 login.setPassword(password);
-                ((DatabaseLogin)login).setConnectionString(url);
-                ((DatabaseLogin)login).setDriverClassName(driver);
+                login.setConnectionString(url);
+                login.setDriverClassName(driver);
                 Platform platform = new MySQLPlatform();
                 login.setDatasourcePlatform(platform);
-                ((DatabaseLogin)login).bindAllParameters();
+                login.bindAllParameters();
                 orProject.setDatasourceLogin(login);
                 Project oxProject = (Project)unmarshaller.unmarshal(
                     new StringReader(RELATIONSHIPS_OX_PROJECT));
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/QueryHandler.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/QueryHandler.java
index 6479481..3290e7d 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/QueryHandler.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/QueryHandler.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
@@ -143,9 +143,9 @@
     public void initializeArguments(XRServiceAdapter xrService, QueryOperation queryOperation,
         DatabaseQuery databaseQuery) {
         for (int i = 0; i < queryOperation.getParameters().size(); i++) {
-            Object o = queryOperation.getParameters().get(i);
+            Parameter o = queryOperation.getParameters().get(i);
             if (o instanceof Parameter) {
-                Parameter p = (Parameter)o;
+                Parameter p = o;
                 String name = p.getName();
                 if (name != null && name.length() > 0 ) {
                     databaseQuery.addArgument(name);
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/StoredProcedureQueryHandler.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/StoredProcedureQueryHandler.java
index e66cf48..139f22c 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/StoredProcedureQueryHandler.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/xr/StoredProcedureQueryHandler.java
@@ -245,11 +245,11 @@
 
     protected void setSingleResult(XRServiceAdapter xrService, StoredProcedureCall spCall, QName resultType) {
         if (getOutArguments().size() == 1) {
-            ProcedureArgument arg = getOutArguments().get(0);
+            ProcedureOutputArgument arg = getOutArguments().get(0);
             // check query's returnType or arg's returnType
             if (isCursorType(xrService, resultType) ||
                 ( arg instanceof ProcedureOutputArgument && isCursorType(xrService,
-                    ((ProcedureOutputArgument)arg).getResultType())))  {
+                    arg.getResultType())))  {
                 spCall.useNamedCursorOutputAsResultSet(arg.getName());
             } else {
                 spCall.addNamedOutputArgument(arg.getName());
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/employee/domain/EmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/employee/domain/EmployeePopulator.java
index 31e67c5..fdb5162 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/employee/domain/EmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/employee/domain/EmployeePopulator.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
@@ -1047,11 +1047,11 @@
         return employmentPeriod;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/forceupdate/FUVLPopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/forceupdate/FUVLPopulator.java
index 030b109..a61111f 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/forceupdate/FUVLPopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/forceupdate/FUVLPopulator.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
@@ -1845,11 +1845,11 @@
     return employeeVLIO;
 }
 
-protected Vector getAllObjects()
+protected Vector<Object> getAllObjects()
 {
     return populationManager.getAllObjects();
 }
-public Vector getAllObjectsForClass(Class domainClass)
+public Vector<Object> getAllObjectsForClass(Class domainClass)
 {
     return populationManager.getAllObjectsForClass(domainClass);
 }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/Company.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/Company.java
index b9720a7..67fa257 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/Company.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/Company.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,7 +21,7 @@
 public class Company implements Serializable {
     public Number id;
     public String name;
-    public ValueHolderInterface<Vector<? extends Vehicle>> vehicles;
+    public ValueHolderInterface<Vector<Vehicle>> vehicles;
     public ValueHolderInterface<Vector<CompanyWorker>> workers;
 
     public Company() {
@@ -73,7 +73,7 @@
 
     public static Company example3() {
         Company company = new Company();
-        Vector<NonFueledVehicle> vehicle = new Vector<>();
+        Vector<Vehicle> vehicle = new Vector<>();
 
         vehicle.addElement(Boat.example1(company));
         vehicle.addElement(Bicycle.example3(company));
@@ -95,7 +95,7 @@
         return workers;
     }
 
-    public ValueHolderInterface<Vector<? extends Vehicle>> getVehicles() {
+    public ValueHolderInterface<Vector<Vehicle>> getVehicles() {
         return vehicles;
     }
 
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 9addf16..50752a8 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -35,7 +35,7 @@
         // tests rely on the ammendment method.
         Enumeration<DatabaseMapping> mappings = descriptor.getMappings().elements();
         while (mappings.hasMoreElements()) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
             if (mapping.isTransformationMapping()) {
                 Object ctype = ((TransformationMapping)mapping).getFieldNameToMethodNames().get("CTYPE");
                 if (ctype != null) {
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 b104f6d..2922e22 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
@@ -33,7 +33,7 @@
         // tests rely on the ammendment method.
         Enumeration<DatabaseMapping> mappings = descriptor.getMappings().elements();
         while (mappings.hasMoreElements()) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
             if (mapping.isTransformationMapping()) {
                 Object pctype = ((TransformationMapping)mapping).getFieldNameToMethodNames().get("PCTYPE");
                 if (pctype != null) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/STI_EmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/STI_EmployeePopulator.java
index 2c292e0..4d43e97 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/STI_EmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/inheritance/STI_EmployeePopulator.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
@@ -662,11 +662,11 @@
         return employee;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/onetoonejointable/EmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/onetoonejointable/EmployeePopulator.java
index c9bfca1..9be62c5 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/onetoonejointable/EmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/onetoonejointable/EmployeePopulator.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
@@ -895,11 +895,11 @@
         return employee;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/orderedlist/EmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/orderedlist/EmployeePopulator.java
index dc37c1c..eeffdef 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/orderedlist/EmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/orderedlist/EmployeePopulator.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
@@ -413,11 +413,11 @@
         return employee;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/performance/EmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/performance/EmployeePopulator.java
index 7eecb7f..f32b399 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/performance/EmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/performance/EmployeePopulator.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
@@ -1021,11 +1021,11 @@
         return employmentPeriod;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/performance/toplink/EmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/performance/toplink/EmployeePopulator.java
index cd506ac..ec037af 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/performance/toplink/EmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/performance/toplink/EmployeePopulator.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
@@ -1023,11 +1023,11 @@
         return employmentPeriod;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/unidirectional/EmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/unidirectional/EmployeePopulator.java
index 7b77dd5..7676a82 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/unidirectional/EmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/models/unidirectional/EmployeePopulator.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
@@ -412,11 +412,11 @@
         return employee;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/DeadLockEmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/DeadLockEmployeePopulator.java
index e509b45..aeb8bd5 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/DeadLockEmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/clientserver/DeadLockEmployeePopulator.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
@@ -178,11 +178,11 @@
         return employee;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
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 e5afa63..cd96c85 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
@@ -44,7 +44,7 @@
             this.session = new SessionBroker();
             Iterator<String> enumtr = ((SessionBroker)testSssion).getSessionsByName().keySet().iterator();
             while (enumtr.hasNext()) {
-                String name = (String)enumtr.next();
+                String name = enumtr.next();
                 DatabaseSession newMemberSession = ((SessionBroker)testSssion).getSessionForName(name).getProject().createDatabaseSession();
                 ((SessionBroker)this.session).registerSession(name, newMemberSession);
             }
@@ -56,11 +56,11 @@
         if (testSssion.isSessionBroker()) {
             Iterator<String> enumtr = ((SessionBroker)testSssion).getSessionsByName().keySet().iterator();
             while (enumtr.hasNext()) {
-                String name = (String)enumtr.next();
-                Session oldMemberSession = ((SessionBroker)testSssion).getSessionForName(name);
-                Session newMemberSession = ((SessionBroker)this.session).getSessionForName(name);
-                ((AbstractSession)newMemberSession).getAccessor().closeConnection();
-                ((AbstractSession)newMemberSession).setAccessor(((AbstractSession)oldMemberSession).getAccessor());
+                String name = enumtr.next();
+                AbstractSession oldMemberSession = ((SessionBroker)testSssion).getSessionForName(name);
+                AbstractSession newMemberSession = ((SessionBroker)this.session).getSessionForName(name);
+                newMemberSession.getAccessor().closeConnection();
+                newMemberSession.setAccessor(oldMemberSession.getAccessor());
             }
         } else {
             ((AbstractSession)this.session).getAccessor().closeConnection();
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 bf64362..178f06c 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
@@ -52,7 +52,7 @@
 
         Customer customerx = (Customer)customers.get(0);
         Vector<Dependant> dependants = customerx.getDependants();
-        customerx.removeDependant((Dependant)dependants.lastElement());
+        customerx.removeDependant(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 4c1afdf..d854872 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
@@ -78,7 +78,7 @@
         boolean found = false;
         Iterator<ListItem> i = holder.getItems().iterator();
         while (i.hasNext()){
-            ListItem item = (ListItem)i.next();
+            ListItem item = i.next();
             if (item.getDescription() != null && item.getDescription().equals("test2")){
                 found = true;
             }
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 95665d8..62f8cd8 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
@@ -41,7 +41,7 @@
             // then add all EmployeeSystem descriptors again
             Iterator<Class<?>> iterator = getSession().getDescriptors().keySet().iterator();
             while (iterator.hasNext()) {
-                Class cls = (Class)iterator.next();
+                Class<?> cls = iterator.next();
                 String packageName = Helper.getPackageName(cls);
                 if (packageName.equals("org.eclipse.persistence.testing.models.employee.interfaces")) {
                     getSession().getDescriptors().remove(cls);
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 e4d5403..1c136f4 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
@@ -42,7 +42,7 @@
             // then add all EmployeeSystem descriptors again
             Iterator<Class<?>> iterator = getSession().getDescriptors().keySet().iterator();
             while (iterator.hasNext()) {
-                Class cls = (Class)iterator.next();
+                Class<?> cls = iterator.next();
                 String packageName = Helper.getPackageName(cls);
                 if (packageName.equals("org.eclipse.persistence.testing.models.employee.interfaces")) {
                     getSession().getDescriptors().remove(cls);
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 7b61139..120bd39 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
@@ -68,7 +68,7 @@
         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);
+        ClassDescriptor descriptor = descriptors.get(org.eclipse.persistence.testing.models.employee.domain.Employee.class);
 
         //add a non existent mapping so loggin will throw an integrity exception
         DirectToFieldMapping NonExistentFieldMapping = new DirectToFieldMapping();
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 f3d911f..ae96905 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
@@ -55,14 +55,14 @@
 
         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);
+            String oldName = targetRelationKeyFields.get(i).getTable().getName();
+            targetRelationKeyFields.get(i).setTableName(user + "." + oldName);
         }
 
         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);
+            String oldName = sourceRelationKeyFields.get(i).getTable().getName();
+            sourceRelationKeyFields.get(i).setTableName(user + "." + oldName);
         }
 
         DirectCollectionMapping dcmapping = (DirectCollectionMapping)empDescriptor.getMappingForAttributeName("responsibilitiesList");
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 0569a42..37d447b 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
@@ -60,7 +60,7 @@
         int mappings = v.size();
         int i = 0;
         while (i < mappings) {
-            m = (DatabaseMapping)v.get(i);
+            m = v.get(i);
             m.setWeight(Integer.MAX_VALUE - 1);
             i++;
         }
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 68dec72..dc22c42 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
@@ -94,7 +94,7 @@
         // they all should have been garbage collected.
         Map<Object, CacheKey> cache = getIdentityMap().getCacheKeys();
         for (Iterator<CacheKey> iterator = cache.values().iterator(); iterator.hasNext(); ) {
-            CacheKey key = (CacheKey)iterator.next();
+            CacheKey key = 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 6567bfb..6a99989 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
@@ -65,7 +65,7 @@
         Map<Object, CacheKey> cache = getIdentityMap().getCacheKeys();
         int numObjects = 0;
         for (Iterator<CacheKey> iterator = cache.values().iterator(); iterator.hasNext();) {
-            CacheKey key = (CacheKey)iterator.next();
+            CacheKey key = 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 e3b43bb..18f1cb2 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
@@ -82,7 +82,7 @@
             Map<Object, CacheKey> cache = getIdentityMap().getCacheKeys();
             numObjects = 0;
             for (Iterator<CacheKey> iterator = cache.values().iterator(); iterator.hasNext();) {
-                CacheKey key = (CacheKey)iterator.next();
+                CacheKey key = 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 58f8564..5aa54b8 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
@@ -60,7 +60,7 @@
         int mappings = v.size();
         int i =0;
         while (i<mappings){
-            m = (DatabaseMapping)v.get(i);
+            m = v.get(i);
             m.setWeight(Integer.MAX_VALUE - 1);
             i++;
         }
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 831b59a..8c91241 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
@@ -58,7 +58,7 @@
         // Changed the names of all the employees in the cache
         Enumeration<CacheKey> employeeMap = ((AbstractSession)getSession()).getIdentityMapAccessorInstance().getIdentityMap(Employee.class).keys();
         while (employeeMap.hasMoreElements()) {
-            Employee employee = (Employee)((CacheKey)employeeMap.nextElement()).getObject();
+            Employee employee = (Employee) 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 669755a..37c5da1 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
@@ -79,7 +79,7 @@
         List<String> statements = this.sqlTracker.getSqlStatements();
         Vector errors = new Vector();
         for (int i = 0; i < statements.size(); i++) {
-            String statement = (String)statements.get(i);
+            String statement = statements.get(i);
             // the statements collection should not contain any duplicates
             int occurrences = Helper.countOccurrencesOf(statement, statements);
             if (occurrences > 1) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/UnitOfWorkCommitResumeTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/UnitOfWorkCommitResumeTest.java
index ff073b2..4a3d7f9 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/UnitOfWorkCommitResumeTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/UnitOfWorkCommitResumeTest.java
@@ -81,13 +81,13 @@
     */
     protected void changeUnitOfWorkWorkingCopy() {
         Company company = (Company)this.unitOfWorkWorkingCopy;
-        Vector vehicles = company.getVehicles().getValue();
+        Vector<Vehicle> vehicles = company.getVehicles().getValue();
 
         // Delete a vehicle
         vehicles.removeElement(vehicles.firstElement());
 
         // Change a vehicle
-        Vehicle aVehicle = (Vehicle)vehicles.lastElement();
+        Vehicle aVehicle = vehicles.lastElement();
         aVehicle.setPassengerCapacity(15);
 
         // Add some vehicles
@@ -104,7 +104,7 @@
     */
     protected void changeUnitOfWorkWorkingCopyAgain() {
         Company company = (Company)this.unitOfWorkWorkingCopy;
-        Vector vehicles = company.getVehicles().getValue();
+        Vector<Vehicle> vehicles = company.getVehicles().getValue();
 
         // Adjust Company name
         company.setName(company.name + "0");
@@ -113,7 +113,7 @@
         vehicles.removeElement(vehicles.firstElement());
 
         // Change a vehicle
-        Vehicle aVehicle = (Vehicle)vehicles.firstElement();
+        Vehicle aVehicle = vehicles.firstElement();
         aVehicle.setPassengerCapacity(15);
 
         // Add some vehicles
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/UnitOfWorkTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/UnitOfWorkTest.java
index 3ddc56c..fec4f3c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/UnitOfWorkTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/inheritance/UnitOfWorkTest.java
@@ -67,15 +67,15 @@
 
     protected void changeUnitOfWorkWorkingCopy() {
         Company company = (Company)this.unitOfWorkWorkingCopy;
-        Vector vehicles = company.getVehicles().getValue();
+        Vector<Vehicle> vehicles = company.getVehicles().getValue();
 
         //delete a vehicle
         //    vehicles.removeElement(vehicles.firstElement());
         Car car = Car.example2();
         car.setOwner(company);
 
-        for (Enumeration enumtr = vehicles.elements(); enumtr.hasMoreElements();) {
-            ((Vehicle)enumtr.nextElement()).change();
+        for (Enumeration<Vehicle> enumtr = vehicles.elements(); enumtr.hasMoreElements();) {
+            enumtr.nextElement().change();
 
         }
 
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 6c488f2..16f812f 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
@@ -51,7 +51,7 @@
     @Override
     public void test() {
         for (Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
-            ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
+            ClassDescriptor descriptor = iterator.next();
             String className = descriptor.getJavaClass().toString();
 
             String part1;
@@ -84,7 +84,7 @@
     public void verify() {
         //Make sure all Descriptors have been initialized.
         for (Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
-            ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
+            ClassDescriptor descriptor = 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 2d821f8..44114e1 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
@@ -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
@@ -58,7 +58,7 @@
         Vector descriptors = new Vector();
 
         for (Iterator<ClassDescriptor> iterator = session.getDescriptors().values().iterator(); iterator.hasNext(); ) {
-            ClassDescriptor desc = (ClassDescriptor)iterator.next();
+            ClassDescriptor desc = iterator.next();
             descriptors.addElement(desc);
             // it's an isolated descriptor, but the test requires no isolation.
             // switch isolation off, cache the descriptor to restore isolation after the test is complete.
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployeePopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployeePopulator.java
index 51e94e8..b0f474c 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployeePopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/nls/japanese/NLSEmployeePopulator.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
@@ -1042,11 +1042,11 @@
         return employmentPeriod;
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/optimisticlocking/cascaded/BarPopulator.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/optimisticlocking/cascaded/BarPopulator.java
index 575bda4..b2e6358 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/optimisticlocking/cascaded/BarPopulator.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/optimisticlocking/cascaded/BarPopulator.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
@@ -264,11 +264,11 @@
         return populationManager.containsObject(domainClass, identifier);
     }
 
-    protected Vector getAllObjects() {
+    protected Vector<Object> getAllObjects() {
         return populationManager.getAllObjects();
     }
 
-    public Vector getAllObjectsForClass(Class domainClass) {
+    public Vector<Object> getAllObjectsForClass(Class domainClass) {
         return populationManager.getAllObjectsForClass(domainClass);
     }
 
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 2119fc3..4a381e8 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
@@ -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
@@ -35,7 +35,7 @@
         super.setup();
         for (Iterator<ClassDescriptor> descriptors = getServerSession().getDescriptors().values().iterator();
              descriptors.hasNext();) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.ISOLATED);
         }
         getServerSession().getProject().setHasIsolatedClasses(true);
@@ -49,7 +49,7 @@
         super.reset();
         for (Iterator<ClassDescriptor> descriptors = getServerSession().getDescriptors().values().iterator();
              descriptors.hasNext();) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.SHARED);
         }
         getServerSession().getProject().setHasIsolatedClasses(false);
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 efe760d..f22dcad 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
@@ -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
@@ -35,7 +35,7 @@
         super.setup();
         for (Iterator<ClassDescriptor> descriptors = getServerSession().getDescriptors().values().iterator();
              descriptors.hasNext();) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.ISOLATED);
         }
         getServerSession().getProject().setHasIsolatedClasses(true);
@@ -49,7 +49,7 @@
         super.reset();
         for (Iterator<ClassDescriptor> descriptors = getServerSession().getDescriptors().values().iterator();
              descriptors.hasNext();) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.SHARED);
         }
         getServerSession().getProject().setHasIsolatedClasses(false);
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 df60c66..ba9a67a 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
@@ -79,7 +79,7 @@
             DatabaseRecord record = (DatabaseRecord)this.result;
             DatabaseRecord queryRecord = (DatabaseRecord)queryResult;
             for (Iterator<DatabaseField> iterator = record.getFields().iterator(); iterator.hasNext(); ) {
-                DatabaseField field = (DatabaseField)iterator.next();
+                DatabaseField field = iterator.next();
                 Object value = record.get(field);
                 Object queryValue = queryRecord.get(field);
                 if (value instanceof Number) {
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/optimization/BatchReadingTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/optimization/BatchReadingTest.java
index ff3c784..fd91bb1 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/optimization/BatchReadingTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/queries/optimization/BatchReadingTest.java
@@ -51,10 +51,10 @@
     @Override
     public void verify() {
         PopulationManager manager = PopulationManager.getDefaultManager();
-        Vector v = manager.getAllObjectsForClass(Restaurant.class);
+        Vector<Object> v = manager.getAllObjectsForClass(Restaurant.class);
         for (Enumeration enumtr = result.elements(); enumtr.hasMoreElements(); ) {
             Restaurant resDatabase = (Restaurant)enumtr.nextElement();
-            for (Enumeration enum1 = v.elements(); enum1.hasMoreElements(); ) {
+            for (Enumeration<Object> enum1 = v.elements(); enum1.hasMoreElements(); ) {
                 Restaurant resPop = (Restaurant)enum1.nextElement();
                 if (resDatabase.getName().equals(resPop.getName())) {
                     if (!((AbstractSession)getSession()).compareObjects(resDatabase, resPop)) {
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 190f6c8..a56bedb 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
@@ -72,7 +72,7 @@
         int removed = 0;
         Iterator<ClassDescriptor> descriptors = project.getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor desc = (ClassDescriptor)descriptors.next();
+            ClassDescriptor desc = descriptors.next();
             if (desc.getOptimisticLockingPolicy() != null) {
                 desc.setOptimisticLockingPolicy(null);
                 removed++;
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 2f5a42c..536e992 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
@@ -33,14 +33,14 @@
 
     public StoredProcedureGeneratorForAdapter(SchemaManager schemaMngr) {
         super(schemaMngr);
-        insertStoredProcedures = new Hashtable();
-        updateStoredProcedures = new Hashtable();
-        substituteName = new Hashtable();
+        insertStoredProcedures = new Hashtable<>();
+        updateStoredProcedures = new Hashtable<>();
+        substituteName = new Hashtable<>();
     }
 
-    protected Hashtable insertStoredProcedures;
-    protected Hashtable updateStoredProcedures;
-    protected Hashtable substituteName;
+    protected Map<ClassDescriptor, StoredProcedureDefinition> insertStoredProcedures;
+    protected Map<ClassDescriptor, StoredProcedureDefinition> updateStoredProcedures;
+    protected Map<StoredProcedureDefinition, Map<String, String>> substituteName;
     protected boolean useTableNames;
 
     public boolean usesTableNames() {
@@ -62,7 +62,7 @@
         Iterator<Class<?>> iterator = descrpts.keySet().iterator();
         ClassDescriptor desc;
         while (iterator.hasNext()) {
-            desc = (ClassDescriptor)descrpts.get(iterator.next());
+            desc = descrpts.get(iterator.next());
             if (desc.isDescriptorForInterface() || desc.isAggregateDescriptor()) {
                 continue;
             }
@@ -82,7 +82,7 @@
         Iterator<Class<?>> iterator = descrpts.keySet().iterator();
         ClassDescriptor desc;
         while (iterator.hasNext()) {
-            desc = (ClassDescriptor)descrpts.get(iterator.next());
+            desc = descrpts.get(iterator.next());
             if (desc.isDescriptorForInterface() || desc.isAggregateDescriptor()) {
                 continue;
             }
@@ -101,10 +101,10 @@
     }
 
     protected StoredProcedureDefinition generateStoredProcedureDefinition(ClassDescriptor desc, DatabaseQuery query, String namePrefix) {
-        Vector<DatabaseField> fields = desc.getFields();
-        Hashtable namesNewToNames = null;
+        List<DatabaseField> fields = desc.getFields();
+        Map<String, String> namesNewToNames = null;
         if (shouldCapitalizeNames()) {
-            namesNewToNames = new Hashtable();
+            namesNewToNames = new Hashtable<>();
             fields = capitalize(fields, namesNewToNames);
         }
         StoredProcedureDefinition definition = generateObjectStoredProcedure(query, fields, namePrefix);
@@ -123,19 +123,13 @@
      * PUBLIC:
      */
     public void writeInsertStoredProcedures() {
-        Enumeration descriptorEnum = insertStoredProcedures.keys();
-        while (descriptorEnum.hasMoreElements()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptorEnum.nextElement();
-            StoredProcedureDefinition definition = (StoredProcedureDefinition)insertStoredProcedures.get(descriptor);
+        for (StoredProcedureDefinition definition : insertStoredProcedures.values()) {
             writeDefinition(definition);
         }
     }
 
     public void writeUpdateStoredProcedures() {
-        Enumeration descriptorEnum = updateStoredProcedures.keys();
-        while (descriptorEnum.hasMoreElements()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptorEnum.nextElement();
-            StoredProcedureDefinition definition = (StoredProcedureDefinition)updateStoredProcedures.get(descriptor);
+        for (StoredProcedureDefinition definition : updateStoredProcedures.values()) {
             writeDefinition(definition);
         }
     }
@@ -169,23 +163,18 @@
      * Amends descriptors with stored procedures
      */
     public void amendDescriptorsInsertQuery() {
-        Enumeration descriptorEnum = insertStoredProcedures.keys();
-        while (descriptorEnum.hasMoreElements()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptorEnum.nextElement();
-            StoredProcedureDefinition definition = (StoredProcedureDefinition)insertStoredProcedures.get(descriptor);
+        for (Map.Entry<ClassDescriptor, StoredProcedureDefinition> entry : insertStoredProcedures.entrySet()) {
             InsertObjectQuery insertQuery = new InsertObjectQuery();
-            defineQuery(insertQuery, definition);
-            descriptor.getQueryManager().setInsertQuery(insertQuery);
+            defineQuery(insertQuery, entry.getValue());
+            entry.getKey().getQueryManager().setInsertQuery(insertQuery);
         }
     }
 
     public void amendDescriptorsUpdateQuery() {
-        Enumeration descriptorEnum = updateStoredProcedures.keys();
-        while (descriptorEnum.hasMoreElements()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptorEnum.nextElement();
-            StoredProcedureDefinition definition = (StoredProcedureDefinition)updateStoredProcedures.get(descriptor);
+        for (Map.Entry<ClassDescriptor, StoredProcedureDefinition> entry : updateStoredProcedures.entrySet()) {
             UpdateObjectQuery updateQuery = new UpdateObjectQuery();
-            descriptor.getQueryManager().setUpdateQuery(updateQuery);
+            defineQuery(updateQuery, entry.getValue());
+            entry.getKey().getQueryManager().setUpdateQuery(updateQuery);
         }
     }
 
@@ -195,7 +184,7 @@
         StoredProcedureCall call = new StoredProcedureCall();
         call.setProcedureName(definition.getName());
         for (int i = 0; i < definition.getArguments().size(); i++) {
-            FieldDefinition fieldDefinition = ((FieldDefinition)definition.getArguments().elementAt(i));
+            FieldDefinition fieldDefinition = definition.getArguments().get(i);
             String procedureParameterName = fieldDefinition.getName();
             String fieldName = getFieldName(fieldDefinition.getName());
             String argumentFieldName = fieldName;
@@ -221,19 +210,19 @@
     // However namesCapitalizedToNames still will be needed, because the DatabaseField's
     // name to be used as a parameter for StoredProcedureCall is extracted from
     // storedProcedureDefinition - and there it is always the same as in database.
-
-    protected Vector capitalize(Vector fields, Hashtable namesCapitalizedToNames) {
+    @SuppressWarnings({"unchecked"})
+    protected List<DatabaseField> capitalize(List<DatabaseField> fields, Map<String, String> namesCapitalizedToNames) {
         // Can't change names of descriptor's fields, create a new Vector.
-        Vector newFields = null;
+        List<DatabaseField> newFields = null;
         for (int i = 0; i < fields.size(); i++) {
-            DatabaseField field = (DatabaseField)fields.elementAt(i);
+            DatabaseField field = fields.get(i);
             String fieldNameUpper = field.getName().toUpperCase();
             String tableNameUpper = field.getTableName().toUpperCase();
             if (!fieldNameUpper.equals(field.getName()) || !tableNameUpper.equals(field.getTableName())) {
                 DatabaseField newField = new DatabaseField(fieldNameUpper, tableNameUpper);
                 newField.setType(field.getType());
                 if (newFields == null) {
-                    newFields = (Vector)fields.clone();
+                    newFields = (List<DatabaseField>) ((Vector<DatabaseField>)fields).clone();
                 }
                 newFields.set(i, newField);
                 namesCapitalizedToNames.put(fieldNameUpper, field.getName());
@@ -262,7 +251,7 @@
         }
     }
 
-    protected StoredProcedureDefinition generateObjectStoredProcedure(DatabaseQuery query, Vector fields, String namePrefix) {
+    protected StoredProcedureDefinition generateObjectStoredProcedure(DatabaseQuery query, List<DatabaseField> fields, String namePrefix) {
         String namePrefixToUse = namePrefix;
         String className = Helper.getShortClassName(query.getDescriptor().getJavaClass());
         if (useTableNames) {
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 4893340..08165ff 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
@@ -76,7 +76,7 @@
     public void updateProject(Project project, Session session) {
         Iterator<ClassDescriptor> it = project.getDescriptors().values().iterator();
         while (it.hasNext()) {
-            ClassDescriptor desc = (ClassDescriptor)it.next();
+            ClassDescriptor desc = it.next();
             if (desc.isAggregateDescriptor()) {
                 continue;
             }
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 4aabca2..412efc8 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
@@ -74,7 +74,7 @@
 
     public void getChange(org.eclipse.persistence.sessions.Record row, Session session, Object object1, Object object2, ClassDescriptor desc, boolean useUOW, WriteType writeType) {
         for (Enumeration<DatabaseMapping> mappings = desc.getMappings().elements(); mappings.hasMoreElements(); ) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
             if (!mapping.isReadOnly()) {
                 getChange(row, mapping, session, object1, object2, useUOW, writeType);
             }
@@ -96,14 +96,14 @@
                 mapping.writeFromObjectIntoRow(object2, (DatabaseRecord)row, (AbstractSession)session, writeType);
             }
         } else {
-            org.eclipse.persistence.sessions.Record row1 = new DatabaseRecord();
-            org.eclipse.persistence.sessions.Record row2 = new DatabaseRecord();
-            mapping.writeFromObjectIntoRow(object1, (DatabaseRecord)row1, (AbstractSession)session, writeType);
-            mapping.writeFromObjectIntoRow(object2, (DatabaseRecord)row2, (AbstractSession)session, writeType);
+            DatabaseRecord row1 = new DatabaseRecord();
+            DatabaseRecord row2 = new DatabaseRecord();
+            mapping.writeFromObjectIntoRow(object1, row1, (AbstractSession)session, writeType);
+            mapping.writeFromObjectIntoRow(object2, row2, (AbstractSession)session, writeType);
 
             for (int i = 0; i < row1.size(); i++) {
-                DatabaseField field = ((DatabaseRecord)row1).getFields().elementAt(i);
-                Object valueBefore = ((DatabaseRecord)row1).getValues().elementAt(i);
+                DatabaseField field = row1.getFields().elementAt(i);
+                Object valueBefore = row1.getValues().elementAt(i);
                 Object valueAfter = row2.get(field);
                 boolean changed;
                 if (valueAfter == null) {
@@ -127,7 +127,7 @@
         ReadObjectQuery query = new ReadObjectQuery();
         query.setSession((AbstractSession)session);
         for (Enumeration<DatabaseMapping> mappings = desc.getMappings().elements(); mappings.hasMoreElements(); ) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
             mapping.readFromRowIntoObject((DatabaseRecord)row, query.getJoinedAttributeManager(), object, null, query, query.getSession(), true);
         }
         return object;
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 41f1fdf..6eca72b 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
@@ -104,7 +104,7 @@
         }
         Iterator<String> i = serverBroker.getSessionsByName().keySet().iterator();
         while (i.hasNext()){
-            String key = (String)i.next();
+            String key = i.next();
             if (clientBroker.getSessionForName(key) == null) {
                 throw new TestErrorException("Session " + key + " exists in server broker but not client broker.");
             }
diff --git a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/stress/StressLoginTest.java b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/stress/StressLoginTest.java
index b3fb01a..6fc4a01 100644
--- a/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/stress/StressLoginTest.java
+++ b/foundation/eclipselink.core.test/src/it/java/org/eclipse/persistence/testing/tests/stress/StressLoginTest.java
@@ -41,8 +41,8 @@
 
     try {
         for (int i = 0; i < stressLevel; i++) {
-            Session session = new Project(getSession().getDatasourceLogin().clone()).createDatabaseSession();
-            ((DatabaseSession) session).login();
+            DatabaseSession session = new Project(getSession().getDatasourceLogin().clone()).createDatabaseSession();
+            session.login();
             sessions.addElement(session);
         }
         getSession().readObject(Address.class);
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 698e787..24b0995 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
@@ -15,6 +15,8 @@
 package org.eclipse.persistence.testing.tests.transactions;
 
 import java.util.*;
+
+import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
 import org.eclipse.persistence.sessions.*;
 import org.eclipse.persistence.sessions.server.*;
 import org.eclipse.persistence.internal.databaseaccess.*;
@@ -313,7 +315,7 @@
             // Let's close these connections here.
             try {
                 for (Iterator<ConnectionPool> poolsEnum = ((ServerSession)getServerSession()).getConnectionPools().values().iterator(); poolsEnum.hasNext();) {
-                    ((ConnectionPool)poolsEnum.next()).shutDown();
+                    poolsEnum.next().shutDown();
                 }
             } catch (Exception ex) {
                 // ignore
@@ -380,7 +382,7 @@
     @Override
     public void test() {
         ClientSession client = getServerSession().acquireClientSession();
-        UnitOfWork uow = null;
+        UnitOfWorkImpl uow = null;
         UnitOfWork uow2 = null;
         Session session = null;
 
@@ -441,7 +443,7 @@
 
             // Now do some post transaction testing.
             if (shouldUseUnitOfWork()) {
-                ((org.eclipse.persistence.internal.sessions.UnitOfWorkImpl)uow).rollbackTransaction();
+                uow.rollbackTransaction();
             } else {
                 client.rollbackTransaction();
             }
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 524e011..165c455 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
@@ -68,7 +68,7 @@
         this.identityMapTypes = new Hashtable(10);
         Iterator<ClassDescriptor> iterator = getSession().getProject().getDescriptors().values().iterator();
         while (iterator.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)iterator.next();
+            ClassDescriptor descriptor = iterator.next();
             checkCacheState.put(descriptor,
                     descriptor.getQueryManager().getDoesExistQuery().getExistencePolicy());
             if(descriptor.requiresInitialization((AbstractSession) getSession())) {
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 407a9a2..4b3fbc2 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
@@ -35,7 +35,7 @@
     @Override
     public void setup() {
         for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setUnitOfWorkCacheIsolationLevel(ClassDescriptor.ISOLATE_CACHE_ALWAYS);
         }
         super.setup();
@@ -44,7 +44,7 @@
     @Override
     public void reset() {
         for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setUnitOfWorkCacheIsolationLevel(ClassDescriptor.ISOLATE_NEW_DATA_AFTER_TRANSACTION);
         }
         super.reset();
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 60a6a66..d69a959 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
@@ -36,7 +36,7 @@
     @Override
     public void setup() {
         for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.ISOLATED);
         }
         getSession().getProject().setHasIsolatedClasses(true);
@@ -46,7 +46,7 @@
     @Override
     public void reset() {
         for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setCacheIsolation(CacheIsolationType.SHARED);
         }
         getSession().getProject().setHasIsolatedClasses(false);
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 e1fe75f..340cf71 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
@@ -28,7 +28,7 @@
     @Override
     public void setup() {
         for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setCacheSynchronizationType(ClassDescriptor.SEND_NEW_OBJECTS_WITH_CHANGES);
         }
         super.setup();
@@ -37,7 +37,7 @@
     @Override
     public void reset() {
         for (Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator(); descriptors.hasNext(); ) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             descriptor.setCacheSynchronizationType(ClassDescriptor.SEND_OBJECT_CHANGES);
         }
         super.reset();
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 7114c1d..40ec8e0 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
@@ -80,7 +80,7 @@
         List<String> statements = sqlTracker.getSqlStatements();
         Vector errors = new Vector();
         for (int i = 0; i < statements.size(); i++) {
-            String statement = (String)statements.get(i);
+            String statement = statements.get(i);
             // the statements collection should not contain any duplicates
             int occurrences = Helper.countOccurrencesOf(statement, statements);
             if (occurrences > 1) {
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 0251df6..0f7c102 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
@@ -120,7 +120,7 @@
             ConnectionPool pool = server.serverSession.getConnectionPools().get("default");
             List<Accessor> connections = pool.getConnectionsAvailable();
             for (Iterator<Accessor> iterator = connections.iterator(); iterator.hasNext(); ) {
-                if (((DatabaseAccessor)iterator.next()).isConnected()) {
+                if (iterator.next().isConnected()) {
                     counter = counter + 1;
                 }
             }
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 423a845..0f9709f 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
@@ -38,7 +38,7 @@
             org.eclipse.persistence.testing.models.employee.relational.EmployeeProject project = new org.eclipse.persistence.testing.models.employee.relational.EmployeeProject();
             Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator();
             while (iterator.hasNext()) {
-                ((ClassDescriptor)iterator.next()).getTableName();
+                iterator.next().getTableName();
             }
         } catch (EclipseLinkException exception) {
             caughtException = exception;
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 f20d802..819d3be 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
@@ -47,7 +47,7 @@
         policy = new MapContainerPolicy();
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = mappingsEnum.nextElement();
 
             if (mappingToModify.isForeignReferenceMapping()) {
                 if (mappingToModify.isCollectionMapping()) {
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 227d570..68c90e4 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
@@ -43,7 +43,7 @@
         descriptorToModify = project.getDescriptors().get(Employee.class);
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = mappingsEnum.nextElement();
 
             if (mappingToModify.isForeignReferenceMapping()) {
                 ((ForeignReferenceMapping)mappingToModify).setRelationshipPartnerAttributeName("TestGetRelationShipAttributeName");
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 c9892b3..ba0dd0c 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -33,7 +33,7 @@
         // Must clear 1-way transformation added in amendment, otherwise will be added twice.
         ClassDescriptor descriptor = project.getDescriptor(Animal.class);
         for (Iterator<DatabaseMapping> mappings = descriptor.getMappings().iterator(); mappings.hasNext(); ) {
-            DatabaseMapping mapping = (DatabaseMapping) mappings.next();
+            DatabaseMapping mapping = mappings.next();
             if (mapping.isWriteOnly()) {
                 descriptor.getMappings().remove(mapping);
                 break;
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 bb76ef0..e0361eb 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
@@ -40,7 +40,7 @@
         descriptorToModify = project.getDescriptors().get(Employee.class);
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = 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 c93c970..6daa740 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
@@ -41,7 +41,7 @@
         descriptorToModify = project.getDescriptors().get(Employee.class);
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = mappingsEnum.nextElement();
 
             if (mappingToModify.isOneToOneMapping()) {
                 ((OneToOneMapping)mappingToModify).useInnerJoinFetch();
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 131d22e..76ad87a 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
@@ -43,7 +43,7 @@
         descriptorToModify = project.getDescriptors().get(Employee.class);
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = mappingsEnum.nextElement();
 
             if (mappingToModify.isOneToOneMapping()) {
                 ((OneToOneMapping)mappingToModify).setShouldVerifyDelete(false);
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 32331f6..187d83f 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
@@ -42,7 +42,7 @@
         descriptorToModify = project.getDescriptors().get(Employee.class);
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = mappingsEnum.nextElement();
 
             if (mappingToModify.isForeignReferenceMapping()) {
                 ((ForeignReferenceMapping)mappingToModify).useBatchReading();
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 e710be1..cced976 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
@@ -37,7 +37,7 @@
         getSession().getIdentityMapAccessor().initializeAllIdentityMaps();
 
         for (Iterator<ClassDescriptor> iterator = project.getDescriptors().values().iterator(); iterator.hasNext(); ) {
-            descriptorToModify = (ClassDescriptor)iterator.next();
+            descriptorToModify = 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 41fa1e7..74aa9dd 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
@@ -42,7 +42,7 @@
         descriptorToModify = project.getDescriptors().get(Employee.class);
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = mappingsEnum.nextElement();
 
             if (mappingToModify.isTransformationMapping()) {
                 ((TransformationMapping)mappingToModify).useBasicIndirection();
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 4da49af..c00c255 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
@@ -44,7 +44,7 @@
         descriptorToModify = project.getDescriptors().get(Employee.class);
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = mappingsEnum.nextElement();
 
             if (mappingToModify.isForeignReferenceMapping()) {
                 ((ForeignReferenceMapping)mappingToModify).setIndirectionPolicy(new TransparentIndirectionPolicy());
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 316dd60..6a0eded 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
@@ -51,7 +51,7 @@
         mapPolicy = new MapContainerPolicy();
         for (Enumeration<DatabaseMapping> mappingsEnum = (descriptorToModify.getMappings()).elements();
              mappingsEnum.hasMoreElements(); ) {
-            mappingToModify = (DatabaseMapping)mappingsEnum.nextElement();
+            mappingToModify = mappingsEnum.nextElement();
 
             if (mappingToModify.isForeignReferenceMapping()) {
                 if (mappingToModify.isCollectionMapping()) {
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 b26aa60..3d376a6 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
@@ -56,7 +56,7 @@
             try {
                 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/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 ec833f8..6808265 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
@@ -49,7 +49,7 @@
             try {
                 Class<?> cls = Class.forName(controllerClassName);
                 Class[] parameterTypes = { org.eclipse.persistence.sessions.Session.class };
-                Constructor constructor = cls.getConstructor(parameterTypes);
+                Constructor<?> constructor = cls.getConstructor(parameterTypes);
                 java.lang.Object[] params = { getSession() };
                 controller = (CORBARemoteSessionController)constructor.newInstance(params);
             } catch (Exception exception) {
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 c65b2da..b327301 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
@@ -44,7 +44,7 @@
     @Override
     public org.omg.CORBA.portable.OutputStream _invoke(String $method, InputStream in, ResponseHandler $rh) {
         OutputStream out = null;
-        Integer __method = (Integer) _methods.get($method);
+        Integer __method = _methods.get($method);
         if (__method == null) {
             throw new BAD_OPERATION(0, CompletionStatus.COMPLETED_MAYBE);
         }
diff --git a/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/coordination/corba/CORBATransportManager.java b/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/coordination/corba/CORBATransportManager.java
index 554464b..ba840f9 100644
--- a/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/coordination/corba/CORBATransportManager.java
+++ b/foundation/org.eclipse.persistence.corba/src/main/java/org/eclipse/persistence/sessions/coordination/corba/CORBATransportManager.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
@@ -175,7 +175,7 @@
     @Override
     public void createLocalConnection() {
         // Register the remote connection in JNDI naming service
-        Object connectionImpl = buildCORBAConnection();
+        CORBAConnection connectionImpl = buildCORBAConnection();
 
         Object[] args = { rcm.getServiceId().getId() };
         rcm.logDebug("register_local_connection_in_jndi", args);
@@ -187,7 +187,7 @@
             return;
         }
 
-        localConnection = new CORBARemoteCommandConnection((CORBAConnection)connectionImpl);
+        localConnection = new CORBARemoteCommandConnection(connectionImpl);
         localConnection.setServiceId(rcm.getServiceId());
     }
 }
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 28d36d8..f15f439 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
@@ -80,11 +80,11 @@
         // first delete using the original TopLink approach - one by one.
         UnitOfWork uow = mainSession.acquireUnitOfWork();
         // mainSession could be a ServerSession
-        Session session = uow.getParent();
+        AbstractSession session = uow.getParent();
 
         // Will need to bring the db back to its original state
         // so that comparison of the deletion result would be possible.
-        ((AbstractSession)session).beginTransaction();
+        session.beginTransaction();
 
         Vector objectsToDelete = uow.readAllObjects(referenceClass, selectionExpression);
 
@@ -96,7 +96,7 @@
 
         Vector objectsLeftAfterOriginalDeletion = session.readAllObjects(rootClass);
 
-        ((AbstractSession)session).rollbackTransaction();
+        session.rollbackTransaction();
 
         // now delete using DeleteAllQuery.
         clearCache(mainSession);
@@ -111,7 +111,7 @@
         // Will need to bring the db back to its original state
         // so that the in case thre are children descriptors
         // they would still have objects to work with.
-        ((AbstractSession)session).beginTransaction();
+        session.beginTransaction();
 
         DeleteAllQuery query = new DeleteAllQuery(referenceClass, selectionExpression);
         query.setShouldDeferExecutionInUOW(shouldDeferExecutionInUOW);
@@ -157,7 +157,7 @@
             }
         }
 
-        ((AbstractSession)session).rollbackTransaction();
+        session.rollbackTransaction();
 
         if(classErrorMsg.length() > 0) {
             String className = referenceClass.getName();
@@ -169,7 +169,7 @@
             if(descriptor.hasInheritance() && descriptor.getInheritancePolicy().hasChildren()) {
                 Iterator<ClassDescriptor> it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
                 while(it.hasNext()) {
-                    ClassDescriptor childDescriptor = (ClassDescriptor)it.next();
+                    ClassDescriptor childDescriptor = it.next();
                     Class childReferenceClass = childDescriptor.getJavaClass();
                     errorMsg += execute(mainSession, childReferenceClass, selectionExpression, shouldDeferExecutionInUOW, handleChildren, rootClass);
                 }
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 5060f02..0e313f1 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
@@ -99,7 +99,7 @@
             Object object = iterator.next();
             boolean remove = false;
             for (Iterator<Expression> joinsIterator = queryWithJoins.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinsIterator.hasNext(); ) {
-                Expression joinExpression = (Expression)joinsIterator.next();
+                Expression joinExpression = joinsIterator.next();
                 joinExpression.getBuilder().setSession(session);
                 joinExpression.getBuilder().setQueryClass(queryWithJoins.getReferenceClass());
                 // Instantiate value holders that should be instantiated.
@@ -156,7 +156,7 @@
                 iterator.remove();
             } else {
                 for (Iterator<Expression> joinsIterator = queryWithJoins.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinsIterator.hasNext(); ) {
-                    Expression joinExpression = (Expression)joinsIterator.next();
+                    Expression joinExpression = joinsIterator.next();
                     // Instantiate value holders that should be instantiated.
                     joinExpression.valueFromObject(object, session, null, valueHolderPolicy, false);
                 }
@@ -345,7 +345,7 @@
 
         Vector<DatabaseMapping> mappings = desc.getMappings();
         for (int index = 0; index < mappings.size(); index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
             String mappingErrorMsg = compareAttributes(obj1, obj2, mapping, session, processed);
             errorMsg += mappingErrorMsg;
         }
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 3826da5..322ede9 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
@@ -174,7 +174,7 @@
         while (summaries.hasNext()) {
             LoadBuildSummary summary = (LoadBuildSummary)summaries.next();
             for (Iterator<TestResultsSummary> iterator = summary.getSummaries().iterator(); iterator.hasNext(); ) {
-                ((TestResultsSummary)iterator.next()).getResults();
+                iterator.next().getResults();
             }
             //for (int index = 0; index < 10; index++) {
                 CopyGroup group = new CopyGroup();
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 a4fc796..37094ab 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
@@ -557,7 +557,7 @@
                 log.write(indent + "Failures:");
                 log.write(CR);
                 for (Enumeration<TestFailure> failures = result.failures(); failures.hasMoreElements();) {
-                    junit.framework.TestFailure failure = (junit.framework.TestFailure)failures.nextElement();
+                    junit.framework.TestFailure failure = failures.nextElement();
                     String testString = failure.failedTest().toString();
                     int startIndex = testString.indexOf("(");
                     if (startIndex != -1) {
@@ -578,7 +578,7 @@
                 log.write(indent + "Errors:");
                 log.write(CR);
                 for (Enumeration<TestFailure> errors = result.errors(); errors.hasMoreElements();) {
-                    junit.framework.TestFailure error = (junit.framework.TestFailure)errors.nextElement();
+                    junit.framework.TestFailure error = errors.nextElement();
                     String testString = error.failedTest().toString();
                     int startIndex = testString.indexOf("(");
                     if (startIndex != -1) {
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 dfa43c6..58b8a8d 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
@@ -133,12 +133,12 @@
 
         UnitOfWork uow = mainSession.acquireUnitOfWork();
         // mainSession could be a ServerSession
-        Session session = uow.getParent();
+        AbstractSession session = uow.getParent();
 
         // report query results contain the values to be assigned for each object to be updated.
         Vector result = (Vector)session.executeQuery(rq);
         Vector objectsAfterOneByOneUpdate = new Vector(objects.size());
-        ((org.eclipse.persistence.internal.sessions.AbstractSession)session).beginTransaction();
+        session.beginTransaction();
         try {
             for (int i = 0; i < result.size(); i++) {
                 // read through uow the object(clone) to be updated
@@ -172,7 +172,7 @@
             }
         } finally {
             // transaction rolled back - objects back to the original state in the db.
-            ((org.eclipse.persistence.internal.sessions.AbstractSession)session).rollbackTransaction();
+            session.rollbackTransaction();
         }
         clearCache(mainSession);
 
@@ -181,7 +181,7 @@
         // mainSession could be a ServerSession
         session = uow.getParent();
         Vector objectsAfterUpdateAll = new Vector(objects.size());
-        ((org.eclipse.persistence.internal.sessions.AbstractSession)session).beginTransaction();
+        session.beginTransaction();
         try {
             uow.executeQuery(uq);
             // uow committed - objects updated.
@@ -196,7 +196,7 @@
             }
         } finally {
             // transaction rolled back - objects back to the original state in the db.
-            ((org.eclipse.persistence.internal.sessions.AbstractSession)session).rollbackTransaction();
+            session.rollbackTransaction();
         }
         clearCache(mainSession);
 
@@ -206,7 +206,7 @@
             Object obj = objects.elementAt(i);
             Object obj1 = objectsAfterOneByOneUpdate.elementAt(i);
             Object obj2 = objectsAfterUpdateAll.elementAt(i);
-            boolean equal = rq.getDescriptor().getObjectBuilder().compareObjects(obj, obj2, (org.eclipse.persistence.internal.sessions.AbstractSession)session);
+            boolean equal = rq.getDescriptor().getObjectBuilder().compareObjects(obj, obj2, session);
             if(!equal) {
                 classErrorMsg = classErrorMsg + "Difference: original = " + obj.toString() + "; afterOneByOneUpdate = " + obj1.toString() +"; afterUpdateAll = " + obj2.toString() + ";";
             }
@@ -219,7 +219,7 @@
             if(descriptor.hasInheritance() && descriptor.getInheritancePolicy().hasChildren()) {
                 Iterator<ClassDescriptor> it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
                 while(it.hasNext()) {
-                    ClassDescriptor childDescriptor = (ClassDescriptor)it.next();
+                    ClassDescriptor childDescriptor = it.next();
                     Class childReferenceClass = childDescriptor.getJavaClass();
                     UpdateAllQuery childUq = (UpdateAllQuery)uq.clone();
                     childUq.setReferenceClass(childReferenceClass);
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 ceab547..32f9679 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,7 @@
 import org.eclipse.persistence.mappings.*;
 import org.eclipse.persistence.mappings.foundation.*;
 
+import java.util.Enumeration;
 import java.util.Vector;
 
 /**
@@ -113,7 +114,7 @@
             mutationString += "U";
         }
 
-        java.util.Enumeration en = mappings.elements();
+        Enumeration<DatabaseMapping> en = mappings.elements();
 
         /**
          * Parse the mappings for the object's descriptor to find a suitable
@@ -126,7 +127,7 @@
          * mappings has been fully parsed (whichever occurs first)
          */
         while (en.hasMoreElements ()) {
-            dbMapping = (DatabaseMapping) en.nextElement();
+            dbMapping = en.nextElement();
 
             if (!dbMapping.isPrimaryKeyMapping()
                     && dbMapping.isDirectToFieldMapping()
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 8148596..2ca544e 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
@@ -201,7 +201,7 @@
         Map compositeMap = new HashMap();
         properties.put(PersistenceUnitProperties.COMPOSITE_UNIT_PROPERTIES, compositeMap);
         Map<String, String> defaultProperties = getDatabaseProperties();
-        String logLevel = (String)defaultProperties.get(PersistenceUnitProperties.LOGGING_LEVEL);
+        String logLevel = defaultProperties.get(PersistenceUnitProperties.LOGGING_LEVEL);
         if (logLevel != null) {
             properties.put(PersistenceUnitProperties.LOGGING_LEVEL, logLevel);
         }
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 d20ee1c..0fc3543 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
@@ -133,7 +133,7 @@
             Vector summariesHasResult = new Vector();
             for (Enumeration<TestResultsSummary> enumtr = selectedSummary.getLoadBuildSummary().getSummaries().elements();
                  enumtr.hasMoreElements();) {
-                TestResultsSummary summary = (TestResultsSummary)enumtr.nextElement();
+                TestResultsSummary summary = enumtr.nextElement();
                 if ((summary.getResults() != null) && (summary.getResults().size() != 0)) {
                     summariesHasResult.addElement(summary);
                 }
@@ -761,7 +761,7 @@
         Vector rootSummaries = new Vector();
 
         for (Enumeration<TestResultsSummary> enumtr = loadBuild.getSummaries().elements(); enumtr.hasMoreElements();) {
-            TestResultsSummary summary = (TestResultsSummary)enumtr.nextElement();
+            TestResultsSummary summary = enumtr.nextElement();
             if (summary.getParent() == null) {
                 rootSummaries.addElement(summary);
             }
@@ -780,7 +780,7 @@
 
         for (Enumeration<TestResultsSummary> enumtr = theSummary.getLoadBuildSummary().getSummaries().elements();
              enumtr.hasMoreElements();) {
-            TestResultsSummary summary = (TestResultsSummary)enumtr.nextElement();
+            TestResultsSummary summary = 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/tools/beans/ExpressionPanel.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/beans/ExpressionPanel.java
index 5e82a40..4127add 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
@@ -705,7 +705,7 @@
                  getDescriptor().getMappings().elements();
                  mappingsEnum.hasMoreElements(); ) {
                 DatabaseMapping mapping =
-                    (DatabaseMapping)mappingsEnum.nextElement();
+                        mappingsEnum.nextElement();
                 if (mapping.isDirectToFieldMapping()) {
                     getAttributeCombo().addItem(mapping.getAttributeName());
                 }
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 a88a031..03f679a 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
@@ -219,7 +219,7 @@
             for (Enumeration<DatabaseMapping> mappings = descriptor.getMappings().elements();
                  mappings.hasMoreElements(); ) {
                 DatabaseMapping mapping =
-                    (DatabaseMapping)mappings.nextElement();
+                        mappings.nextElement();
                 if (mapping instanceof ManyToManyMapping) {
                     ManyToManyMapping m2mMapping = (ManyToManyMapping)mapping;
                     policy = (HistoryPolicy)basePolicy.clone();
diff --git a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/ProfileBrowserPanel.java b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/ProfileBrowserPanel.java
index 2406935..dd3dedf 100644
--- a/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/ProfileBrowserPanel.java
+++ b/foundation/org.eclipse.persistence.core.test.framework/src/main/java/org/eclipse/persistence/tools/sessionconsole/ProfileBrowserPanel.java
@@ -28,10 +28,10 @@
  * This panel allows for the browsing of performance profiles.
  */
 public class ProfileBrowserPanel extends JPanel {
-    private List<Profile> fieldProfiles = new ArrayList();
+    private List<Profile> fieldProfiles = new ArrayList<>();
     private JScrollPane ivjProfileScrollPane = null;
     private JTable ivjProfilesTable = null;
-    private JComboBox ivjGroupByChoice = null;
+    private JComboBox<String> ivjGroupByChoice = null;
     private JLabel ivjGroupByLabel = null;
     private JCheckBox ivjQualifyClassNameCheckbox = null;
     IvjEventHandler ivjEventHandler = new IvjEventHandler();
@@ -70,7 +70,7 @@
         super(isDoubleBuffered);
     }
 
-    public static void browseProfiles(Vector profiles) {
+    public static void browseProfiles(List<Profile> profiles) {
         try {
             UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
             JFrame frame = new JFrame();
@@ -90,16 +90,16 @@
      * INTERNAL:
      * Return a map of summary profiles reporting on the profile contained.
      */
-    public Vector buildProfileSummaryByClass() {
-        Hashtable summaries = new Hashtable();
+    public List<Profile> buildProfileSummaryByClass() {
+        Hashtable<Class<?>, Profile> summaries = new Hashtable<>();
 
         for (Profile profile : getProfiles()) {
-            Class domainClass = profile.getDomainClass();
+            Class<?> domainClass = profile.getDomainClass();
             if (domainClass == null) {
                 domainClass = Void.class;
             }
 
-            Profile summary = (Profile)summaries.get(domainClass);
+            Profile summary = summaries.get(domainClass);
             if (summary == null) {
                 summary = new Profile();
                 summary.setDomainClass(domainClass);
@@ -111,13 +111,10 @@
                                  profile.getLocalTime());
             summary.setNumberOfInstancesEffected(summary.getNumberOfInstancesEffected() +
                                                  profile.getNumberOfInstancesEffected());
-            for (Enumeration operationNames =
-                 profile.getOperationTimings().keys();
-                 operationNames.hasMoreElements(); ) {
-                String name = (String)operationNames.nextElement();
-                Long oldTime = (Long)summary.getOperationTimings().get(name);
-                long profileTime =
-                        (Long) profile.getOperationTimings().get(name);
+            for (Map.Entry<String, Long> entry: profile.getOperationTimings().entrySet()) {
+                String name = entry.getKey();
+                Long oldTime = summary.getOperationTimings().get(name);
+                long profileTime = entry.getValue();
                 long newTime;
                 if (oldTime == null) {
                     newTime = profileTime;
@@ -128,10 +125,10 @@
             }
         }
 
-        Vector summary = new Vector();
-        for (Enumeration profilesEnum = summaries.elements();
+        List<Profile> summary = new Vector<>();
+        for (Enumeration<Profile> profilesEnum = summaries.elements();
              profilesEnum.hasMoreElements(); ) {
-            summary.addElement(profilesEnum.nextElement());
+            summary.add(profilesEnum.nextElement());
         }
         return summary;
     }
@@ -140,17 +137,17 @@
      * INTERNAL:
      * Return a map of summary profiles reporting on the profile contained.
      */
-    public Vector buildProfileSummaryByQuery() {
-        Hashtable summaries = new Hashtable();
+    public List<Profile> buildProfileSummaryByQuery() {
+        Hashtable<Class<?>, Profile> summaries = new Hashtable<>();
 
         for (Profile profile : getProfiles()) {
-            Class queryType = profile.getQueryClass();
+            Class<?> queryType = profile.getQueryClass();
             //CR 3050 PWK - If we don't know the query class, we need to use void.
             //This avoids a null pointer exception when adding to the hashtable.
             if (queryType == null) {
                 queryType = Void.class;
             }
-            Profile summary = (Profile)summaries.get(queryType);
+            Profile summary = summaries.get(queryType);
             if (summary == null) {
                 summary = new Profile();
                 summary.setQueryClass(queryType);
@@ -162,13 +159,10 @@
                                  profile.getLocalTime());
             summary.setNumberOfInstancesEffected(summary.getNumberOfInstancesEffected() +
                                                  profile.getNumberOfInstancesEffected());
-            for (Enumeration operationNames =
-                 profile.getOperationTimings().keys();
-                 operationNames.hasMoreElements(); ) {
-                String name = (String)operationNames.nextElement();
-                Long oldTime = (Long)summary.getOperationTimings().get(name);
-                long profileTime =
-                        (Long) profile.getOperationTimings().get(name);
+            for (Map.Entry<String, Long> entry: profile.getOperationTimings().entrySet()) {
+                String name = entry.getKey();
+                Long oldTime = summary.getOperationTimings().get(name);
+                long profileTime = entry.getValue();
                 long newTime;
                 if (oldTime == null) {
                     newTime = profileTime;
@@ -179,10 +173,10 @@
             }
         }
 
-        Vector summary = new Vector();
-        for (Enumeration profilesEnum = summaries.elements();
+        Vector<Profile> summary = new Vector<>();
+        for (Enumeration<Profile> profilesEnum = summaries.elements();
              profilesEnum.hasMoreElements(); ) {
-            summary.addElement(profilesEnum.nextElement());
+            summary.add(profilesEnum.nextElement());
         }
         return summary;
     }
@@ -191,12 +185,12 @@
      * INTERNAL:
      * Return a map of summary profiles reporting on the profile contained.
      */
-    public Vector buildProfileSummaryByQueryAndClass() {
-        Hashtable summaries = new Hashtable();
+    public List<Profile> buildProfileSummaryByQueryAndClass() {
+        Map<Class<?>, Map<Class<?>, Profile>> summaries = new Hashtable<>();
 
         for (Profile profile : getProfiles()) {
-            Class queryType = profile.getQueryClass();
-            Class queryClass = profile.getDomainClass();
+            Class<?> queryType = profile.getQueryClass();
+            Class<?> queryClass = profile.getDomainClass();
             if (queryClass == null) {
                 queryClass = Void.class;
             }
@@ -207,12 +201,12 @@
             }
 
 
-            Hashtable summaryByQuery = (Hashtable)summaries.get(queryType);
+            Map<Class<?>, Profile> summaryByQuery = summaries.get(queryType);
             if (summaryByQuery == null) {
-                summaryByQuery = new Hashtable();
+                summaryByQuery = new Hashtable<>();
                 summaries.put(queryType, summaryByQuery);
             }
-            Profile summary = (Profile)summaryByQuery.get(queryClass);
+            Profile summary = summaryByQuery.get(queryClass);
             if (summary == null) {
                 summary = new Profile();
                 summary.setQueryClass(queryType);
@@ -225,13 +219,10 @@
                                  profile.getLocalTime());
             summary.setNumberOfInstancesEffected(summary.getNumberOfInstancesEffected() +
                                                  profile.getNumberOfInstancesEffected());
-            for (Enumeration operationNames =
-                 profile.getOperationTimings().keys();
-                 operationNames.hasMoreElements(); ) {
-                String name = (String)operationNames.nextElement();
-                Long oldTime = (Long)summary.getOperationTimings().get(name);
-                long profileTime =
-                        (Long) profile.getOperationTimings().get(name);
+            for (Map.Entry<String, Long> entry: profile.getOperationTimings().entrySet()) {
+                String name = entry.getKey();
+                Long oldTime = summary.getOperationTimings().get(name);
+                long profileTime = entry.getValue();
                 long newTime;
                 if (oldTime == null) {
                     newTime = profileTime;
@@ -242,14 +233,9 @@
             }
         }
 
-        Vector summary = new Vector();
-        for (Enumeration profilesEnum = summaries.elements();
-             profilesEnum.hasMoreElements(); ) {
-            for (Enumeration byQueryEnum =
-                 ((Hashtable)profilesEnum.nextElement()).elements();
-                 byQueryEnum.hasMoreElements(); ) {
-                summary.addElement(byQueryEnum.nextElement());
-            }
+        List<Profile> summary = new Vector<>();
+        for (Map<Class<?>, Profile> m: summaries.values()) {
+            summary.addAll(m.values());
         }
         return summary;
     }
@@ -294,10 +280,10 @@
      * Return the GroupByChoice property value.
      * @return javax.swing.JComboBox
      */
-    private javax.swing.JComboBox getGroupByChoice() {
+    private javax.swing.JComboBox<String> getGroupByChoice() {
         if (ivjGroupByChoice == null) {
             try {
-                ivjGroupByChoice = new javax.swing.JComboBox();
+                ivjGroupByChoice = new javax.swing.JComboBox<>();
                 ivjGroupByChoice.setName("GroupByChoice");
                 ivjGroupByChoice.setBackground(java.awt.SystemColor.window);
                 // user code begin {1}
@@ -479,20 +465,20 @@
 
     public void resetProfiles() {
         DefaultTableModel model = new DefaultTableModel();
-        Vector columns = new Vector();
-        columns.addElement("Query");
-        columns.addElement("Class");
-        columns.addElement("Total Time");
-        columns.addElement("Local Time");
-        columns.addElement("# of Objects");
-        columns.addElement("Object/Second");
-        columns.addElement("SQL Prepare");
-        columns.addElement("SQL Execute");
-        columns.addElement("Row Fetch");
-        columns.addElement("Cache");
-        columns.addElement("Object Building");
-        columns.addElement("Query Prepare");
-        columns.addElement("SQL Generation");
+        Vector<String> columns = new Vector<>();
+        columns.add("Query");
+        columns.add("Class");
+        columns.add("Total Time");
+        columns.add("Local Time");
+        columns.add("# of Objects");
+        columns.add("Object/Second");
+        columns.add("SQL Prepare");
+        columns.add("SQL Execute");
+        columns.add("Row Fetch");
+        columns.add("Cache");
+        columns.add("Object Building");
+        columns.add("Query Prepare");
+        columns.add("SQL Generation");
         model.setColumnIdentifiers(columns);
 
         List<Profile> profiles = getProfiles();
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 1e4c9c0..d36f455 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
@@ -14,6 +14,7 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.tools.sessionconsole;
 
+import java.lang.reflect.Constructor;
 import java.net.URL;
 
 import javax.swing.*;
@@ -2101,7 +2102,7 @@
                     Class.forName("com.ibm.uvm.abt.edit.WindowCloser");
                 Class[] parmTypes = { java.awt.Window.class };
                 Object[] parms = { aSessionInspectorFrame };
-                java.lang.reflect.Constructor aCtor =
+                Constructor<?> aCtor =
                     aCloserClass.getConstructor(parmTypes);
                 aCtor.newInstance(parms);
             } catch (java.lang.Throwable exc) {
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 ec99171..5500189 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
@@ -3242,7 +3242,7 @@
             // Also update all sessions in session manager.
             Iterator<Session> iterator = SessionManager.getManager().getSessions().values().iterator();
             while (iterator.hasNext()) {
-                ((Session)iterator.next()).setSessionLog(getSession().getSessionLog());
+                iterator.next().setSessionLog(getSession().getSessionLog());
             }
         }
     }
@@ -3410,7 +3410,7 @@
                 .getIdentityMapAccessorInstance().getIdentityMap(
                         info.descriptor.getJavaClass());
         for (Enumeration<CacheKey> cacheEnum = map.keys(); cacheEnum.hasMoreElements();) {
-            CacheKey key = (CacheKey) cacheEnum.nextElement();
+            CacheKey key = cacheEnum.nextElement();
             if (info.descriptor.getJavaClass().isInstance(key.getObject())) {
                 cacheResults.addElement(key);
             }
@@ -3449,7 +3449,7 @@
         int index = 0;
         for (Iterator<ClassDescriptor> iterator = (getSession()).getDescriptors().values()
                 .iterator(); iterator.hasNext();) {
-            classes[index] = new ClassInfo((ClassDescriptor) iterator.next(),
+            classes[index] = new ClassInfo(iterator.next(),
                     useFullNames);
             index = index + 1;
         }
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 e35c277..843409e 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
@@ -258,7 +258,7 @@
         if (hasItems()) {
             clone.items = new HashMap<>();
             for (ATTRIBUTE_ITEM item : this.items.values()){
-                clone.items.put(item.getAttributeName(), (ATTRIBUTE_ITEM) item.clone((Map<CoreAttributeGroup<ATTRIBUTE_ITEM, DESCRIPTOR>, CoreAttributeGroup<ATTRIBUTE_ITEM, DESCRIPTOR>>)cloneMap, clone));
+                clone.items.put(item.getAttributeName(), (ATTRIBUTE_ITEM) item.clone(cloneMap, clone));
             }
         }
         return clone;
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 22d8757..b7632b7 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
@@ -1010,7 +1010,7 @@
     protected void checkDatabase(AbstractSession session) {
         if (session.getIntegrityChecker().shouldCheckDatabase()) {
             for (Iterator<DatabaseTable> iterator = getTables().iterator(); iterator.hasNext();) {
-                DatabaseTable table = (DatabaseTable)iterator.next();
+                DatabaseTable table = iterator.next();
                 if (session.getIntegrityChecker().checkTable(table, session)) {
                     // To load the fields of database into a vector
                     List databaseFields = new ArrayList();
@@ -1341,7 +1341,7 @@
         for (Enumeration<DatabaseMapping> mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
             DatabaseMapping mapping;
 
-            mapping = (DatabaseMapping)((DatabaseMapping)mappingsEnum.nextElement()).clone();
+            mapping = (DatabaseMapping) mappingsEnum.nextElement().clone();
             mapping.setDescriptor(clonedDescriptor);
             mappingsVector.addElement(mapping);
         }
@@ -1361,7 +1361,7 @@
         List primaryKeyVector = new ArrayList(getPrimaryKeyFields().size());
         List<DatabaseField> primaryKeyFields = getPrimaryKeyFields();
         for (int index = 0; index < primaryKeyFields.size(); index++) {
-            DatabaseField primaryKey = ((DatabaseField)primaryKeyFields.get(index)).clone();
+            DatabaseField primaryKey = primaryKeyFields.get(index).clone();
             primaryKeyVector.add(primaryKey);
         }
         clonedDescriptor.setPrimaryKeyFields(primaryKeyVector);
@@ -1752,7 +1752,7 @@
         }
         Iterator<DatabaseMapping> mappings = getMappings().iterator();
         while (mappings.hasNext()){
-            ((DatabaseMapping)mappings.next()).convertClassNamesToClasses(classLoader);
+            mappings.next().convertClassNamesToClasses(classLoader);
         }
         if (this.inheritancePolicy != null){
             this.inheritancePolicy.convertClassNamesToClasses(classLoader);
@@ -2550,7 +2550,7 @@
     public DatabaseMapping getMappingForAttributeName(String attributeName) {
         // ** Don't use this internally, just for amendments, see getMappingForAttributeName on ObjectBuilder.
         for (Enumeration<DatabaseMapping> mappingsNum = mappings.elements(); mappingsNum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsNum.nextElement();
+            DatabaseMapping mapping = mappingsNum.nextElement();
             if ((mapping.getAttributeName() != null) && mapping.getAttributeName().equals(attributeName)) {
                 return mapping;
             }
@@ -2588,14 +2588,14 @@
         Vector associations = new Vector(getAdditionalTablePrimaryKeyFields().size() * 2);
         Iterator<Map<DatabaseField, DatabaseField>> tablesHashtable = getAdditionalTablePrimaryKeyFields().values().iterator();
         while (tablesHashtable.hasNext()) {
-            Map tableHash = (Map)tablesHashtable.next();
-            Iterator fieldEnumeration = tableHash.keySet().iterator();
+            Map<DatabaseField, DatabaseField> tableHash = tablesHashtable.next();
+            Iterator<DatabaseField> fieldEnumeration = tableHash.keySet().iterator();
             while (fieldEnumeration.hasNext()) {
-                DatabaseField keyField = (DatabaseField)fieldEnumeration.next();
+                DatabaseField keyField = fieldEnumeration.next();
 
                 //PRS#36802(CR#2057) contains() is changed to containsKey()
                 if (getMultipleTableForeignKeys().containsKey(keyField.getTable())) {
-                    Association association = new Association(keyField.getQualifiedName(), ((DatabaseField)tableHash.get(keyField)).getQualifiedName());
+                    Association association = new Association(keyField.getQualifiedName(), tableHash.get(keyField).getQualifiedName());
                     associations.addElement(association);
                 }
             }
@@ -2638,14 +2638,14 @@
         Vector associations = new Vector(getAdditionalTablePrimaryKeyFields().size() * 2);
         Iterator<Map<DatabaseField, DatabaseField>> tablesHashtable = getAdditionalTablePrimaryKeyFields().values().iterator();
         while (tablesHashtable.hasNext()) {
-            Map tableHash = (Map)tablesHashtable.next();
-            Iterator fieldEnumeration = tableHash.keySet().iterator();
+            Map<DatabaseField, DatabaseField> tableHash = tablesHashtable.next();
+            Iterator<DatabaseField> fieldEnumeration = tableHash.keySet().iterator();
             while (fieldEnumeration.hasNext()) {
-                DatabaseField keyField = (DatabaseField)fieldEnumeration.next();
+                DatabaseField keyField = fieldEnumeration.next();
 
                 //PRS#36802(CR#2057) contains() is changed to containsKey()
                 if (!getMultipleTableForeignKeys().containsKey(keyField.getTable())) {
-                    Association association = new Association(keyField.getQualifiedName(), ((DatabaseField)tableHash.get(keyField)).getQualifiedName());
+                    Association association = new Association(keyField.getQualifiedName(), tableHash.get(keyField).getQualifiedName());
                     associations.addElement(association);
                 }
             }
@@ -2708,7 +2708,7 @@
         Vector<String> result = new Vector(getPrimaryKeyFields().size());
         List<DatabaseField> primaryKeyFields = getPrimaryKeyFields();
         for (int index = 0; index < primaryKeyFields.size(); index++) {
-            result.addElement(((DatabaseField)primaryKeyFields.get(index)).getQualifiedName());
+            result.addElement(primaryKeyFields.get(index).getQualifiedName());
         }
 
         return result;
@@ -2881,7 +2881,7 @@
         }
 
         for (Enumeration<DatabaseTable> tables = getTables().elements(); tables.hasMoreElements();) {
-            DatabaseTable table = (DatabaseTable)tables.nextElement();
+            DatabaseTable table = tables.nextElement();
 
             if(tableName.indexOf(' ') != -1) {
                 //if looking for a table with a ' ' character, the name will have
@@ -2922,7 +2922,7 @@
     public Vector getTableNames() {
         Vector tableNames = new Vector(getTables().size());
         for (Enumeration<DatabaseTable> fieldsEnum = getTables().elements(); fieldsEnum.hasMoreElements();) {
-            tableNames.addElement(((DatabaseTable)fieldsEnum.nextElement()).getQualifiedName());
+            tableNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return tableNames;
@@ -3097,7 +3097,7 @@
      */
     public boolean hasPrivatelyOwnedParts() {
         for (Enumeration<DatabaseMapping> mappings = getMappings().elements(); mappings.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
             if (mapping.isPrivateOwned()) {
                 return true;
             }
@@ -3310,7 +3310,7 @@
 
         // All the query keys should be initialized.
         for (Iterator<QueryKey> queryKeys = getQueryKeys().values().iterator(); queryKeys.hasNext();) {
-            QueryKey queryKey = (QueryKey)queryKeys.next();
+            QueryKey queryKey = queryKeys.next();
             queryKey.initialize(this);
         }
 
@@ -3656,7 +3656,7 @@
                     //ClassDescriptor is a class, not an interface
                     for (Iterator<String> parentKeys = parentDescriptor.getQueryKeys().keySet().iterator();
                          parentKeys.hasNext();) {
-                        String queryKeyName = (String)parentKeys.next();
+                        String queryKeyName = parentKeys.next();
                         if (!hasQueryKeyOrMapping(queryKeyName)) {
                             //the parent descriptor has a query key not defined in the child
                             session.getIntegrityChecker().handleError(DescriptorException.childDoesNotDefineAbstractQueryKeyOfParent(this, parentDescriptor, queryKeyName));
@@ -4159,7 +4159,7 @@
             // may not have simple fields, same with empty new and reflection get/set.
             boolean isMethodAccess = false;
             for (Iterator<DatabaseMapping> iterator = getMappings().iterator(); iterator.hasNext(); ) {
-                DatabaseMapping mapping = (DatabaseMapping)iterator.next();
+                DatabaseMapping mapping = iterator.next();
                 if (mapping.isUsingMethodAccess()) {
                     // Ok for lazy 1-1s
                     if (!mapping.isOneToOneMapping() || !((ForeignReferenceMapping)mapping).usesIndirection()) {
@@ -4187,7 +4187,7 @@
         // 4924665 Check for spaces in table names, and add the appropriate quote character
         Iterator<DatabaseTable> tables = this.getTables().iterator();
         while(tables.hasNext()) {
-            DatabaseTable next = (DatabaseTable)tables.next();
+            DatabaseTable next = tables.next();
             if(next.getName().indexOf(' ') != -1) {
                 // EL Bug 382420 - set use delimiters to true if table name contains a space
                 next.setUseDelimiters(true);
@@ -4320,7 +4320,7 @@
         getObjectBuilder().rehashFieldDependancies(session);
 
         for (Enumeration<DatabaseMapping> enumtr = getMappings().elements(); enumtr.hasMoreElements();) {
-            ((DatabaseMapping)enumtr.nextElement()).rehashFieldDependancies(session);
+            enumtr.nextElement().rehashFieldDependancies(session);
         }
     }
 
@@ -5093,7 +5093,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<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+            DatabaseMapping mapping = mappingsEnum.nextElement();
 
             // For CR#2646, if the mapping already points to the parent descriptor then leave it.
             if (mapping.getDescriptor() == null) {
@@ -5514,7 +5514,7 @@
      */
     public void setTableQualifier(String tableQualifier) {
         for (Enumeration<DatabaseTable> enumtr = getTables().elements(); enumtr.hasMoreElements();) {
-            DatabaseTable table = (DatabaseTable)enumtr.nextElement();
+            DatabaseTable table = enumtr.nextElement();
             table.setTableQualifier(tableQualifier);
         }
     }
@@ -5826,7 +5826,7 @@
         }
         Vector<DatabaseMapping> mappings = getMappings();
         for (Iterator<DatabaseMapping> iterator = mappings.iterator(); iterator.hasNext();) {
-            DatabaseMapping mapping = (DatabaseMapping)iterator.next();
+            DatabaseMapping mapping = iterator.next();
             if (!mapping.isChangeTrackingSupported(project) ) {
                 return false;
             }
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 1eac3bd..f935994 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
@@ -667,7 +667,7 @@
             List<DescriptorEventListener> entityListenerEventListeners = entityListenerEventManagers.get(index).getEntityListenerEventListeners();
 
             for (int i = 0; i < entityListenerEventListeners.size(); i++) {
-                DescriptorEventListener listener = (DescriptorEventListener) entityListenerEventListeners.get(i);
+                DescriptorEventListener listener = entityListenerEventListeners.get(i);
                 notifyListener(listener, event);
             }
         }
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 df31775..d984eb6 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
@@ -499,7 +499,7 @@
     public Vector getAllQueries() {
         Vector allQueries = new Vector();
         for (Iterator<List<DatabaseQuery>> vectors = getQueries().values().iterator(); vectors.hasNext();) {
-            allQueries.addAll((Vector)vectors.next());
+            allQueries.addAll(vectors.next());
         }
         return allQueries;
     }
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 8080751..da02bfe 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
@@ -542,7 +542,7 @@
         Set fetchedAttributes = isObjectPartial ? fetchGroupInObject.getAttributeNames() : null;
         int size = mappings.size();
         for (int index = 0; index < size; index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
             if ((!isObjectPartial) || ((fetchedAttributes != null) && fetchedAttributes.contains(mapping.getAttributeName()))) {
                 // Only refresh the fetched attributes into clones.
                 mapping.buildClone(cachedObject, null, workingClone, null, uow);
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 e3b637f..834e849 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
@@ -868,7 +868,7 @@
     public ClassDescriptor getSubclassDescriptor(Class theClass) {
         if (hasChildren()) {
             for (Iterator<ClassDescriptor> enumtr = getChildDescriptors().iterator(); enumtr.hasNext();) {
-                ClassDescriptor childDescriptor = (ClassDescriptor)enumtr.next();
+                ClassDescriptor childDescriptor = enumtr.next();
                 if (childDescriptor.getJavaClass().equals(theClass)) {
                     return childDescriptor;
                 } else {
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 9c6de47..58237f5 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
@@ -75,7 +75,7 @@
                 if (changes.hasDeferredAttributes()){
                     //need to calculate the changes for these attributes.
                     for (Iterator<String> iterator = changes.getDeferredSet().iterator(); iterator.hasNext();){
-                        DatabaseMapping mapping = descriptor.getObjectBuilder().getMappingForAttributeName((String)iterator.next());
+                        DatabaseMapping mapping = descriptor.getObjectBuilder().getMappingForAttributeName(iterator.next());
                         mapping.calculateDeferredChanges((ChangeRecord)changes.getChangesForAttributeNamed(mapping.getAttributeName()), session);
                     }
                     changes.getDeferredSet().clear();
@@ -94,7 +94,7 @@
                 List<DatabaseMapping> mappings = descriptor.getMappings();
                 int size = mappings.size();
                 for (int index = 0; index < size; index++) {
-                    DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+                    DatabaseMapping mapping = mappings.get(index);
                     if ((fetchGroup == null) || fetchGroup.containsAttributeInternal(mapping.getAttributeName())) {
                         changes.addChange(mapping.compareForChange(clone, null, changes, session));
                     }
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 2151ee6..dd24e4a 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
@@ -192,7 +192,7 @@
                 fetchGroup = descriptor.getFetchGroupManager().getObjectFetchGroup(clone);
             }
             for (int index = 0; index < mappingsSize; index++) {
-                DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+                DatabaseMapping mapping = mappings.get(index);
                 if ((fetchGroup == null) || fetchGroup.containsAttributeInternal(mapping.getAttributeName())) {
                     changes.addChange(mapping.compareForChange(clone, backUp, changes, session));
                 }
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 1eb7b83..bb64517 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
@@ -151,7 +151,7 @@
             int size = mappings.size();
             // Only cascade fetched mappings.
             for (int index = 0; index < size; index++) {
-                DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+                DatabaseMapping mapping = mappings.get(index);
                 if (!isPartialObject || fetchGroupManager.isAttributeFetched(clone, mapping.getAttributeName())) {
                     mapping.setChangeListener(clone, listener, uow);
                 }
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 5565c7e..dc90641 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
@@ -180,7 +180,7 @@
                     XMLInteraction interaction = (XMLInteraction)object;
                     Vector argumentNames = interaction.getArgumentNames();
                     Vector arguments = interaction.getArguments();
-                    Vector interactionArguments = new Vector(arguments.size());
+                    Vector<InteractionArgument> interactionArguments = new Vector<>(arguments.size());
                     for (int index = 0; index < arguments.size(); index++) {
                         InteractionArgument interactionArgument = new InteractionArgument();
                         interactionArgument.setArgumentName((String)argumentNames.get(index));
@@ -238,7 +238,7 @@
                     XMLInteraction interaction = (XMLInteraction)object;
                     Vector arguments = interaction.getOutputArguments();
                     Vector argumentNames = interaction.getOutputArgumentNames();
-                    Vector interactionArguments = new Vector(arguments.size());
+                    Vector<InteractionArgument> interactionArguments = new Vector<>(arguments.size());
                     for (int index = 0; index < arguments.size(); index++) {
                         InteractionArgument interactionArgument = new InteractionArgument();
                         interactionArgument.setKey(((DatabaseField)arguments.get(index)).getName());
@@ -252,8 +252,8 @@
                 public void setAttributeValueInObject(Object object, Object value) {
                     XMLInteraction interaction = (XMLInteraction)object;
                     Vector interactionArguments = (Vector)value;
-                    Vector arguments = new Vector(interactionArguments.size());
-                    Vector argumentNames = new Vector(interactionArguments.size());
+                    Vector<DatabaseField> arguments = new Vector<>(interactionArguments.size());
+                    Vector<String> argumentNames = new Vector<>(interactionArguments.size());
                     for (int index = 0; index < interactionArguments.size(); index++) {
                         InteractionArgument interactionArgument = (InteractionArgument)interactionArguments.get(index);
                         arguments.add(new DatabaseField((String)interactionArgument.getKey()));
@@ -377,10 +377,10 @@
                 @Override
                 public Object getAttributeValueFromObject(Object object) {
                     Map<DatabaseField, DatabaseField> sourceToTargetKeyFields = ((EISOneToOneMapping)object).getSourceToTargetKeyFields();
-                    List associations = new ArrayList(sourceToTargetKeyFields.size());
+                    List<Association> associations = new ArrayList<>(sourceToTargetKeyFields.size());
                     Iterator<Map.Entry<DatabaseField, DatabaseField>> iterator = sourceToTargetKeyFields.entrySet().iterator();
                     while (iterator.hasNext()) {
-                        Map.Entry entry = (Map.Entry)iterator.next();
+                        Map.Entry<DatabaseField, DatabaseField> entry = iterator.next();
                         associations.add(new Association(entry.getKey(), entry.getValue()));
                     }
                     return associations;
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 2ef92b4..d576aac 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
@@ -243,7 +243,7 @@
                 MappedRecord record = accessor.getRecordFactory().createMappedRecord(recordName);
                 for (Iterator<DatabaseField> keysIterator = valuesRow.getFields().iterator();
                      keysIterator.hasNext();) {
-                    DatabaseField field = (DatabaseField)keysIterator.next();
+                    DatabaseField field = 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 5ae81b8..4301620 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
@@ -344,7 +344,7 @@
         Expression builder = new ExpressionBuilder();
         Iterator<DatabaseField> keyIterator = getSourceForeignKeysToTargetKeys().keySet().iterator();
         while (keyIterator.hasNext()) {
-            DatabaseField foreignKey = (DatabaseField)keyIterator.next();
+            DatabaseField foreignKey = keyIterator.next();
             DatabaseField targetKey = getSourceForeignKeysToTargetKeys().get(foreignKey);
 
             Expression expression = builder.getField(targetKey).equal(builder.getParameter(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 76e7c14..48a9b73 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
@@ -154,7 +154,7 @@
         Map setOfFields = new HashMap(getTargetToSourceKeyFields().size());
 
         for (Enumeration<DatabaseField> enumtr = getForeignKeyFields().elements(); enumtr.hasMoreElements();) {
-            DatabaseField field = (DatabaseField)enumtr.nextElement();
+            DatabaseField field = enumtr.nextElement();
 
             DatabaseField fieldClone = field.clone();
             setOfFields.put(field, fieldClone);
@@ -164,7 +164,7 @@
         //get clones from set for source hashtable.  If they do not exist, create a new one.
         Iterator<DatabaseField> sourceKeyIterator = getSourceToTargetKeyFields().keySet().iterator();
         while (sourceKeyIterator.hasNext()) {
-            DatabaseField sourceField = (DatabaseField)sourceKeyIterator.next();
+            DatabaseField sourceField = sourceKeyIterator.next();
             DatabaseField targetField = getSourceToTargetKeyFields().get(sourceField);
 
             DatabaseField targetClone = (DatabaseField)setOfFields.get(targetField);
@@ -184,7 +184,7 @@
         //get clones from set for target hashtable.  If they do not exist, create a new one.
         Iterator<DatabaseField> targetKeyIterator = getTargetToSourceKeyFields().keySet().iterator();
         while (targetKeyIterator.hasNext()) {
-            DatabaseField targetField = (DatabaseField)targetKeyIterator.next();
+            DatabaseField targetField = targetKeyIterator.next();
             DatabaseField sourceField = getTargetToSourceKeyFields().get(targetField);
 
             DatabaseField targetClone = (DatabaseField)setOfFields.get(targetField);
@@ -215,7 +215,7 @@
         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);
+            DatabaseField targetKeyField = primaryKeyFields.get(index);
             DatabaseField sourceKeyField = getTargetToSourceKeyFields().get(targetKeyField);
             if (sourceKeyField == null) {
                 return null;
@@ -240,7 +240,7 @@
         List<DatabaseField> foreignKeyFields = getForeignKeyFields();
         int size = foreignKeyFields.size();
         for (int index = 0; index < size; index++) {
-            DatabaseField foreignKeyField = (DatabaseField)foreignKeyFields.get(index);
+            DatabaseField foreignKeyField = foreignKeyFields.get(index);
             foreignKeyField = getDescriptor().buildField(foreignKeyField);
             foreignKeyFields.set(index, foreignKeyField);
         }
@@ -264,9 +264,9 @@
         HashMap newTargetToSourceKeyFields = new HashMap(getTargetToSourceKeyFields().size());
         Iterator<Map.Entry<DatabaseField, DatabaseField>> iterator = getSourceToTargetKeyFields().entrySet().iterator();
         while (iterator.hasNext()) {
-            Map.Entry entry = (Map.Entry)iterator.next();
-            DatabaseField sourceField = (DatabaseField)entry.getKey();
-            DatabaseField targetField = (DatabaseField)entry.getValue();
+            Map.Entry<DatabaseField, DatabaseField> entry = iterator.next();
+            DatabaseField sourceField = entry.getKey();
+            DatabaseField targetField = entry.getValue();
 
             sourceField = getDescriptor().buildField(sourceField);
             targetField = getReferenceDescriptor().buildField(targetField);
@@ -294,7 +294,7 @@
         Expression builder = new ExpressionBuilder();
         Iterator<DatabaseField> keyIterator = getSourceToTargetKeyFields().keySet().iterator();
         while (keyIterator.hasNext()) {
-            DatabaseField foreignKey = (DatabaseField)keyIterator.next();
+            DatabaseField foreignKey = keyIterator.next();
             DatabaseField targetKey = getSourceToTargetKeyFields().get(foreignKey);
 
             Expression expression = builder.getField(targetKey).equal(builder.getParameter(foreignKey));
@@ -377,7 +377,7 @@
         // Skip for partial objects as fk may not be present.
         if (!query.hasPartialAttributeExpressions()) {
             for (Enumeration<DatabaseField> enumeration = getFields().elements(); enumeration.hasMoreElements();) {
-                DatabaseField field = (DatabaseField)enumeration.nextElement();
+                DatabaseField field = enumeration.nextElement();
                 if (row.get(field) == null) {
                     return getIndirectionPolicy().nullValueFromRow();
                 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/i18n/ExceptionMessageGenerator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/i18n/ExceptionMessageGenerator.java
index adce894..d4b5408 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/i18n/ExceptionMessageGenerator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/exceptions/i18n/ExceptionMessageGenerator.java
@@ -94,7 +94,7 @@
             ResourceBundle bundle = null;
             bundle = ResourceBundle.getBundle("org.eclipse.persistence.exceptions.i18n.ExceptionResource", Locale.getDefault(), getLoader());
             String errorMessage = bundle.getString("ErrorFormattingMessage");
-            Vector vec = new Vector();
+            Vector<Object> vec = new Vector<>();
             if (arguments != null) {
                 for (int index = 0; index < arguments.length; index++) {
                     try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/expressions/spatial/SpatialExpressionFactory.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/expressions/spatial/SpatialExpressionFactory.java
index 02f752a..7306373 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/expressions/spatial/SpatialExpressionFactory.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/expressions/spatial/SpatialExpressionFactory.java
@@ -14,6 +14,7 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.expressions.spatial;
 
+import java.util.List;
 import java.util.Vector;
 
 import org.eclipse.persistence.expressions.Expression;
@@ -133,7 +134,7 @@
      * @param operator the ordinal of the operator
      */
     public static Expression getSpatialExpression(int operator, Expression geom1, Object geom2, String params) {
-        Vector vParameters = new Vector(2);
+        List<Object> vParameters = new Vector<>(2);
         vParameters.add(geom2);
         //Bug 5885276, the empty string either like " " or "" needs to be substituted
         //by null prior to passing to Geometry call.
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 a99a20d..e1aeef5 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
@@ -30,7 +30,7 @@
      * add it to the tree.
      */
     public static HierarchyNode getNodeForClass(String className, Hashtable<String, HierarchyNode> hierarchyTree) {
-        HierarchyNode node = (HierarchyNode)hierarchyTree.get(className);
+        HierarchyNode node = hierarchyTree.get(className);
         if (node == null) {
             node = new HierarchyNode(className);
             hierarchyTree.put(className, node);
@@ -43,7 +43,7 @@
         Hashtable<String, HierarchyNode> hierarchyTree = new Hashtable<>(descriptors.size());
         for (Iterator<ClassDescriptor> descriptorIterator = descriptors.values().iterator();
                  descriptorIterator.hasNext();) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptorIterator.next();
+            ClassDescriptor descriptor = descriptorIterator.next();
             String className = descriptor.getJavaClassName();
             if (className == null) {
                 className = descriptor.getJavaClass().getName();
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 07e2487..412d7da 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
@@ -1559,7 +1559,7 @@
             // Check the cache by sql string, must synchronize check and removal.
             Map<String, Statement> statementCache = getStatementCache();
             synchronized (statementCache) {
-                statement = (PreparedStatement)statementCache.get(call.getSQLString());
+                statement = statementCache.get(call.getSQLString());
                 if (statement != null) {
                     // Need to remove to allow concurrent statement execution.
                     statementCache.remove(call.getSQLString());
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 05d6edb..1a3ddb7 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
@@ -3309,7 +3309,7 @@
         DatabaseField field = new DatabaseField(qualifiedFieldName, getStartDelimiter(), getEndDelimiter());
         Iterator<ClassDescriptor> descriptors = session.getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             if (!descriptor.usesSequenceNumbers()) {
                 continue;
             }
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 c604ac3..2af63c5 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
@@ -72,7 +72,7 @@
             ExpressionBuilder builder = new ExpressionBuilder();
 
             while (keys.hasNext()) {
-                String keyField = ((DatabaseField) keys.next()).getQualifiedName();
+                String keyField = keys.next().getQualifiedName();
 
                 if (selectionCriteria == null) {
                     selectionCriteria = builder.getField(keyField).equal(builder.getParameter(keyField));
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 c6784b7..4e63728 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
@@ -265,8 +265,8 @@
                 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();
+                    DatabaseField primaryKeyField = primaryKeyFieldEnum.next();
+                    DatabaseField secondaryKeyField = secondaryKeyFieldEnum.next();
                     Object primaryValue = databaseRow.getIndicatingNoEntry(primaryKeyField);
 
                     // normally the primary key has a value, however if the multiple tables were joined by a foreign
@@ -319,7 +319,7 @@
         }
         List<DatabaseField> fields = row.getFields();
         for (int index = 0; index < size; index++) {
-            DatabaseField field = (DatabaseField)fields.get(index);
+            DatabaseField field = fields.get(index);
             assignReturnValueForField(object, query, row, field, handledMappings, changeSet);
         }
     }
@@ -337,7 +337,7 @@
         if (readOnlyMappings != null) {
             int size = readOnlyMappings.size();
             for (int index = 0; index < size; index++) {
-                mapping = (DatabaseMapping)readOnlyMappings.get(index);
+                mapping = readOnlyMappings.get(index);
                 assignReturnValueToMapping(object, query, row, field, mapping, handledMappings, changeSet);
             }
         }
@@ -529,7 +529,7 @@
         boolean isTargetProtected = targetSession.isProtectedSession();
         int size = mappings.size();
         for (int index = 0; index < size; index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
             if (readAllMappings || query.shouldReadMapping(mapping, executionFetchGroup)) {
                 mapping.readFromRowIntoObject(databaseRow, joinManager, domainObject, cacheKey, query, targetSession, isTargetProtected);
             }
@@ -669,14 +669,14 @@
         if (descriptor.hasFetchGroupManager() && descriptor.getFetchGroupManager().isPartialObject(clone)) {
             FetchGroupManager fetchGroupManager = descriptor.getFetchGroupManager();
             for (int index = 0; index < size; index++) {
-                DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+                DatabaseMapping mapping = mappings.get(index);
                 if (fetchGroupManager.isAttributeFetched(clone, mapping.getAttributeName())) {
                     mapping.buildBackupClone(clone, backup, unitOfWork);
                 }
             }
         } else {
             for (int index = 0; index < size; index++) {
-                ((DatabaseMapping)mappings.get(index)).buildBackupClone(clone, backup, unitOfWork);
+                mappings.get(index).buildBackupClone(clone, backup, unitOfWork);
             }
         }
 
@@ -714,7 +714,7 @@
         // PERF: Avoid synchronized enumerator as is concurrency bottleneck.
         List<DatabaseMapping> mappings = this.descriptor.getMappings();
         for (int index = 0; index < mappings.size(); index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
             if (expression == null) {
                 expression = mapping.buildExpression(queryObject, policy, expressionBuilder, processedObjects, session);
             } else {
@@ -1603,7 +1603,7 @@
         ExpressionBuilder builder = new ExpressionBuilder();
         Expression expression = null;
         for (Iterator<DatabaseField> primaryKeyEnum = keyMapping.values().iterator(); primaryKeyEnum.hasNext();) {
-            DatabaseField field = (DatabaseField)primaryKeyEnum.next();
+            DatabaseField field = primaryKeyEnum.next();
             expression = (builder.getField(field).equal(builder.getParameter(field))).and(expression);
         }
 
@@ -1662,7 +1662,7 @@
         List<DatabaseMapping> mappings = this.descriptor.getMappings();
         int mappingsSize = mappings.size();
         for (int index = 0; index < mappingsSize; index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
             mapping.writeFromObjectIntoRow(object, databaseRow, session, writeType);
         }
 
@@ -1701,7 +1701,7 @@
         List<DatabaseMapping> mappings = this.descriptor.getMappings();
         int mappingsSize = mappings.size();
         for (int index = 0; index < mappingsSize; index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
             mapping.writeFromObjectIntoRowForShallowInsert(object, databaseRow, session);
         }
 
@@ -1824,7 +1824,7 @@
      */
     public AbstractRecord buildRowForUpdate(AbstractRecord databaseRow, WriteObjectQuery query) {
         for (Iterator<DatabaseMapping> mappings = getNonPrimaryKeyMappings().iterator(); mappings.hasNext();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.next();
+            DatabaseMapping mapping = mappings.next();
             mapping.writeFromObjectIntoRowForUpdate(query, databaseRow);
         }
 
@@ -1884,7 +1884,7 @@
 
         for (Iterator<DatabaseMapping> mappings = this.descriptor.getMappings().iterator();
              mappings.hasNext();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.next();
+            DatabaseMapping mapping = mappings.next();
             mapping.writeFromObjectIntoRowForWhereClause(query, databaseRow);
         }
 
@@ -1941,7 +1941,7 @@
     public void buildTemplateInsertRow(AbstractSession session, AbstractRecord databaseRow) {
         for (Iterator<DatabaseMapping> mappings = this.descriptor.getMappings().iterator();
              mappings.hasNext();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.next();
+            DatabaseMapping mapping = mappings.next();
             mapping.writeInsertFieldsIntoRow(databaseRow, session);
         }
 
@@ -1996,7 +1996,7 @@
 
         for (Iterator<DatabaseMapping> mappings = getNonPrimaryKeyMappings().iterator();
              mappings.hasNext();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.next();
+            DatabaseMapping mapping = mappings.next();
             mapping.writeUpdateFieldsIntoRow(databaseRow, session);
         }
 
@@ -2034,7 +2034,7 @@
         List<DatabaseMapping> mappings = this.primaryKeyMappings;
         int mappingsSize = mappings.size();
         for (int i = 0; i < mappingsSize; i++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(i);
+            DatabaseMapping mapping = mappings.get(i);
             mapping.buildShallowOriginalFromRow(databaseRow, original, null, query, session);
         }
     }
@@ -2055,7 +2055,7 @@
         List<DatabaseMapping> pkMappings = getPrimaryKeyMappings();
         int mappingsSize = pkMappings.size();
         for (int i = 0; i < mappingsSize; i++) {
-            DatabaseMapping mapping = (DatabaseMapping)pkMappings.get(i);
+            DatabaseMapping mapping = pkMappings.get(i);
 
             //if (query.shouldReadMapping(mapping)) {
             if (!mapping.isAbstractColumnMapping()) {
@@ -2065,7 +2065,7 @@
         List<DatabaseMapping> mappings = this.descriptor.getMappings();
         mappingsSize = mappings.size();
         for (int i = 0; i < mappingsSize; i++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(i);
+            DatabaseMapping mapping = mappings.get(i);
 
             //if (query.shouldReadMapping(mapping)) {
             if (mapping.isAbstractColumnMapping()) {
@@ -2091,7 +2091,7 @@
         int size = mappings.size();
         FetchGroup executionFetchGroup = query.getExecutionFetchGroup(this.descriptor);
         for (int index = 0; index < size; index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
             if (readAllMappings || query.shouldReadMapping(mapping, executionFetchGroup)) {
                 mapping.buildCloneFromRow(databaseRow, joinManager, clone, sharedCacheKey, query, unitOfWork, unitOfWork);
             }
@@ -2473,20 +2473,20 @@
                         // composite primary key - set pk using pkRow
                         boolean isTargetProtected = session.isProtectedSession();
                         for (int index = 0; index < pkFieldsSize; index++) {
-                            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+                            DatabaseMapping mapping = mappings.get(index);
                             mapping.readFromRowIntoObject(row, joinManager, object, cacheKeyToUse, query, session, isTargetProtected);
                         }
                     }
                     // set the rest using mappings directly
                     for (int index = pkFieldsSize; index < size; index++) {
-                        DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+                        DatabaseMapping mapping = mappings.get(index);
                         mapping.readFromResultSetIntoObject(resultSet, object, query, session, accessor, metaData, index + shift, platform);
                     }
                 } else {
                     boolean isTargetProtected = session.isProtectedSession();
                     accessor.populateRow(fieldsArray, values, resultSet, metaData, session, pkFieldsSize, fieldsArray.length);
                     for (int index = 0; index < size; index++) {
-                        DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+                        DatabaseMapping mapping = mappings.get(index);
                         mapping.readFromRowIntoObject(row, joinManager, object, cacheKeyToUse, query, session, isTargetProtected);
                     }
                 }
@@ -2695,7 +2695,7 @@
         // PERF: Avoid iterator.
         List<DatabaseMapping> mappings = this.descriptor.getMappings();
         for (int index = 0; index < mappings.size(); index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
 
             if (!mapping.compareObjects(firstObject, secondObject, session)) {
                 Object firstValue = mapping.getAttributeValueFromObject(firstObject);
@@ -2715,7 +2715,7 @@
         // PERF: Avoid iterator.
         List<DatabaseMapping> mappings = this.descriptor.getMappings();
         for (int index = 0; index < mappings.size(); index++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+            DatabaseMapping mapping = mappings.get(index);
             Object value = null;
             if (cloneOneToOneValueHolders && mapping.isForeignReferenceMapping()){
                 value = ((ForeignReferenceMapping)mapping).getAttributeValueWithClonedValueHolders(source);
@@ -2917,7 +2917,7 @@
             List<DatabaseMapping> mappings = getCloningMappings();
             int size = mappings.size();
             for (int index = 0; index < size; index++) {
-                ((DatabaseMapping)mappings.get(index)).buildCopy(copy, original, copyGroup);
+                mappings.get(index).buildCopy(copy, original, copyGroup);
             }
 
             if (copyGroup.shouldResetPrimaryKey() && (!(this.descriptor.isDescriptorTypeAggregate()))) {
@@ -2926,13 +2926,13 @@
                 List<DatabaseMapping> primaryKeyMappings = getPrimaryKeyMappings();
                 size = primaryKeyMappings.size();
                 for (int index = 0; index < size; index++) {
-                    if (((DatabaseMapping)primaryKeyMappings.get(index)).isOneToOneMapping()) {
+                    if (primaryKeyMappings.get(index).isOneToOneMapping()) {
                         hasOneToOne = true;
                     }
                 }
                 if (!hasOneToOne) {
                     for (int index = 0; index < size; index++) {
-                        DatabaseMapping mapping = (DatabaseMapping)primaryKeyMappings.get(index);
+                        DatabaseMapping mapping = primaryKeyMappings.get(index);
 
                         // Only null out direct mappings, as others will be nulled in the respective objects.
                         if (mapping.isAbstractColumnMapping()) {
@@ -3033,7 +3033,7 @@
 
         if(null != primaryKeyFields) {
             for (int index = 0; index < primaryKeyFields.size(); index++) {
-                DatabaseField primaryKeyField = (DatabaseField)primaryKeyFields.get(index);
+                DatabaseField primaryKeyField = primaryKeyFields.get(index);
                 subExpression = ((DatasourcePlatform)session.getDatasourcePlatform()).createExpressionFor(primaryKeyField, builder);
 
                 if (expression == null) {
@@ -3311,7 +3311,7 @@
             // 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.
             Class classification = getPrimaryKeyClassifications().get(index);
-            DatabaseField field = (DatabaseField)primaryKeyFields.get(index);
+            DatabaseField field = primaryKeyFields.get(index);
             Object value = databaseRow.get(field);
             primaryKeyRow.put(field, session.getPlatform(domainObject.getClass()).convertObject(value, classification));
         }
@@ -3684,7 +3684,7 @@
                     classifications.add(null);
                 } else {
                     DatabaseMapping mapping = getPrimaryKeyMappings().get(index);
-                    DatabaseField field = (DatabaseField)primaryKeyFields.get(index);
+                    DatabaseField field = primaryKeyFields.get(index);
                     if (mapping != null) {
                         classifications.add(Helper.getObjectClass(mapping.getFieldClassification(field)));
                     } else {
@@ -3747,7 +3747,7 @@
 
         for (Enumeration<DatabaseMapping> mappings = this.descriptor.getMappings().elements();
              mappings.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
 
             // Add attribute to mapping association
             if (!mapping.isWriteOnly()) {
@@ -3918,7 +3918,7 @@
         List<DatabaseMapping> joinedAttributes = null;
         List<DatabaseMapping> mappings = this.descriptor.getMappings();
         for (int i = 0; i < mappings.size(); i++) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.get(i);
+            DatabaseMapping mapping = mappings.get(i);
             if (mapping.isForeignReferenceMapping() && ((ForeignReferenceMapping)mapping).isJoinFetched()) {
                 if (joinedAttributes == null) {
                     joinedAttributes = new ArrayList();
@@ -4016,7 +4016,7 @@
         if (nonPrimaryKeyMappings != null) {
             nonPrimaryKeyMappings.clear();
             for (Iterator<DatabaseField> fields = getMappingsByField().keySet().iterator(); fields.hasNext();) {
-                DatabaseField field = (DatabaseField)fields.next();
+                DatabaseField field = fields.next();
                 if (null ==primaryKeyFields || !primaryKeyFields.contains(field)) {
                     DatabaseMapping mapping = getMappingForField(field);
                     if (!getNonPrimaryKeyMappings().contains(mapping)) {
@@ -4028,7 +4028,7 @@
 
         if(null != primaryKeyFields) {
             for (int index = 0; index < primaryKeyFields.size(); index++) {
-                DatabaseField primaryKeyField = (DatabaseField)primaryKeyFields.get(index);
+                DatabaseField primaryKeyField = primaryKeyFields.get(index);
                 DatabaseMapping mapping = getMappingForField(primaryKeyField);
 
                 if (mapping == null) {
@@ -4284,14 +4284,14 @@
         if (this.descriptor.hasFetchGroupManager() && this.descriptor.getFetchGroupManager().isPartialObject(original)) {
             FetchGroupManager fetchGroupManager = this.descriptor.getFetchGroupManager();
             for (int index = 0; index < size; index++) {
-                DatabaseMapping mapping = (DatabaseMapping)mappings.get(index);
+                DatabaseMapping mapping = mappings.get(index);
                 if (fetchGroupManager.isAttributeFetched(original, mapping.getAttributeName())) {
                     mapping.buildClone(original, cacheKey, clone, refreshCascade, cloningSession);
                 }
             }
         } else {
             for (int index = 0; index < size; index++) {
-                ((DatabaseMapping)mappings.get(index)).buildClone(original, cacheKey, clone, refreshCascade, cloningSession);
+                mappings.get(index).buildClone(original, cacheKey, clone, refreshCascade, cloningSession);
             }
         }
 
@@ -4594,7 +4594,7 @@
         } else {
             for (Enumeration<DatabaseTable> tables = this.descriptor.getTables().elements();
                  tables.hasMoreElements();) {
-                DatabaseTable table = (DatabaseTable)tables.nextElement();
+                DatabaseTable table = tables.nextElement();
 
                 SQLSelectStatement sqlStatement = new SQLSelectStatement();
                 sqlStatement.addTable(table);
@@ -4623,7 +4623,7 @@
         // now ask each of the mappings to verify that the object has been deleted.
         for (Enumeration<DatabaseMapping> mappings = this.descriptor.getMappings().elements();
              mappings.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
 
             if (!mapping.verifyDelete(object, session)) {
                 return false;
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 3913904..da60d77 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
@@ -943,7 +943,7 @@
     protected DatabaseMapping getMappingOfFirstPrimaryKey(ClassDescriptor descriptor) {
         if (descriptor != null) {
             for (Iterator<DatabaseMapping> i = descriptor.getMappings().iterator(); i.hasNext(); ) {
-                DatabaseMapping m = (DatabaseMapping)i.next();
+                DatabaseMapping m = 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 9126d02..3c61281 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
@@ -163,7 +163,7 @@
             tablesJoinExpressions = new HashMap();
             List<DatabaseTable> childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
             for( int i=0; i < childrenTables.size(); i++) {
-                DatabaseTable table = (DatabaseTable)childrenTables.get(i);
+                DatabaseTable table = childrenTables.get(i);
                 Expression joinExpression = getDescriptor().getInheritancePolicy().getChildrenTablesJoinExpressions().get(table);
                 if (getBaseExpression() != null){
                     joinExpression = getBaseExpression().twist(joinExpression, this);
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 9e43e47..7cabbd6 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
@@ -145,7 +145,7 @@
             int tablesSize = targetTables.size();
             // skip main table - start with i=1
             for(int i=1; i < tablesSize; i++) {
-                DatabaseTable table = (DatabaseTable)targetTables.get(i);
+                DatabaseTable table = targetTables.get(i);
                 Expression onExpression = outerJoinedAdditionalJoinCriteria.get(table);
                 if (onExpression != null) {
                     DatabaseTable alias = onExpression.aliasForTable(table);
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 816b3da..437b7ac 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
@@ -193,7 +193,7 @@
         int tablesSize = tables.size();
         if (shouldUseOuterJoin() || (!getSession().getPlatform().shouldPrintInnerJoinInWhereClause())) {
             for (int i=1; i < tablesSize; i++) {
-                DatabaseTable table = (DatabaseTable)tables.elementAt(i);
+                DatabaseTable table = tables.elementAt(i);
                 Expression joinExpression = getDescriptor().getQueryManager().getTablesJoinExpressions().get(table);
                 joinExpression = this.baseExpression.twist(joinExpression, this);
                 if (getDescriptor().getHistoryPolicy() != null) {
@@ -206,7 +206,7 @@
             List<DatabaseTable> childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
             tablesSize = childrenTables.size();
             for (int i=0; i < tablesSize; i++) {
-                DatabaseTable table = (DatabaseTable)childrenTables.get(i);
+                DatabaseTable table = childrenTables.get(i);
                 Expression joinExpression = getDescriptor().getInheritancePolicy().getChildrenTablesJoinExpressions().get(table);
                 joinExpression = this.baseExpression.twist(joinExpression, this);
                 tablesJoinExpressions.put(table, joinExpression);
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 62b56bb..742262d 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
@@ -271,7 +271,7 @@
                 } else {// do normal outer stuff for Informix
                     for (Enumeration<DatabaseTable> target = outerExpression.getMapping().getReferenceDescriptor().getTables().elements();
                          target.hasMoreElements();) {
-                        DatabaseTable newTarget = (DatabaseTable)target.nextElement();
+                        DatabaseTable newTarget = target.nextElement();
                         DatabaseTable newAlias = outerExpression.aliasForTable(newTarget);
                         writer.write(", OUTER ");
                         writer.write(newTarget.getQualifiedNameDelimited(printer.getPlatform()));
@@ -761,7 +761,7 @@
         printer.getWriter().write(" ORDER BY ");
 
         for (Iterator<Expression> expressionsEnum = getOrderByExpressions().iterator(); expressionsEnum.hasNext();) {
-            Expression expression = (Expression)expressionsEnum.next();
+            Expression expression = expressionsEnum.next();
             expression.printSQL(printer);
 
             if (expressionsEnum.hasNext()) {
@@ -780,7 +780,7 @@
         }
 
         for (Iterator<Expression> expressionsEnum = getUnionExpressions().iterator(); expressionsEnum.hasNext();) {
-            Expression expression = (Expression)expressionsEnum.next();
+            Expression expression = expressionsEnum.next();
             printer.getWriter().write(" ");
             expression.printSQL(printer);
             printer.printString(")");
@@ -1581,7 +1581,7 @@
                 if (map != null) {
                     Iterator<Expression> it = map.values().iterator();
                     while(it.hasNext()) {
-                        criteria = (Expression)it.next();
+                        criteria = it.next();
                         if(criteria != null) {
                             allExpressions.add(criteria);
                         }
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 9f7949f..7e52517 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
@@ -455,7 +455,7 @@
             tableSize = tables.size();
             //look up the joins from the parent descriptor to our tables.
             for (int i=0; i < tableSize; i++) {
-                DatabaseTable table = (DatabaseTable)tables.elementAt(i);
+                DatabaseTable table = tables.elementAt(i);
                 Expression joinExpression = parentDescriptor.getInheritancePolicy().getChildrenTablesJoinExpressions().get(table);
                 //Some of our tables might be the in our parent as well, so ignore the lack of a joinExpression
                 if (joinExpression != null) {
@@ -469,7 +469,7 @@
             List<DatabaseTable> childrenTables = getDescriptor().getInheritancePolicy().getChildrenTables();
             tableSize = childrenTables.size();
             for (int i=0; i < tableSize; i++) {
-                DatabaseTable table = (DatabaseTable)childrenTables.get(i);
+                DatabaseTable table = childrenTables.get(i);
                 Expression joinExpression = getDescriptor().getInheritancePolicy().getChildrenTablesJoinExpressions().get(table);
                 joinExpression = this.baseExpression.twist(joinExpression, this);
                 tablesJoinExpressions.put(table, joinExpression);
@@ -499,7 +499,7 @@
                     parentDescriptor.getInheritancePolicy().hasMultipleTableChild() ) {
                 //look up the joins from the parent descriptor to our tables.
                 for (int i=0; i < tablesSize; i++) {
-                    DatabaseTable table = (DatabaseTable)tables.elementAt(i);
+                    DatabaseTable table = tables.elementAt(i);
                     Expression joinExpression = parentDescriptor.getInheritancePolicy().getChildrenTablesJoinExpressions().get(table);
                     //Some of our tables might be the in our parent as well, so ignore the lack of a joinExpression
                     if (joinExpression != null) {
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 f91f59a..97042fc 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
@@ -199,7 +199,7 @@
                 DatabaseRecord newOutputRow, List<DatabaseField> outputRowFields, List outputRowValues) {
             DatabaseField field = null;
             for (Iterator<DatabaseField> i = outputRowFields.iterator(); i.hasNext(); ) {
-                DatabaseField f = (DatabaseField)i.next();
+                DatabaseField f = i.next();
                 if (f.getName().equals(outArg.name)) {
                     field = f;
                     break;
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 5988521..2be49ea 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
@@ -96,7 +96,7 @@
         Enumeration enumValues = dbCall.getContexts().getValues().elements();
         AbstractSession executionSession = dbCall.getQuery().getSession().getExecutionSession(dbCall.getQuery());
         while (enumFields.hasMoreElements()) {
-            DatabaseField field = (DatabaseField)enumFields.nextElement();
+            DatabaseField field = enumFields.nextElement();
             Object value = enumValues.nextElement();
 
             //write the value through the locator
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 9941f68..629c532 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
@@ -280,7 +280,7 @@
             boolean isPartialObject = (fetchGroupManager != null) && fetchGroupManager.isPartialObject(objectForClone);
             for (Iterator<DatabaseMapping> mappings = descriptor.getLockableMappings().iterator();
                  mappings.hasNext();) {
-                DatabaseMapping mapping = (DatabaseMapping)mappings.next();
+                DatabaseMapping mapping = mappings.next();
                 // Only cascade fetched mappings.
                 if (!isPartialObject || (fetchGroupManager.isAttributeFetched(objectForClone, mapping.getAttributeName()))) {
                     // any mapping in this list must not have indirection.
@@ -599,7 +599,7 @@
         RuntimeException exception = null;
         while (locks.hasNext()) {
             try {
-                CacheKey cacheKeyToRemove = (CacheKey) locks.next();
+                CacheKey cacheKeyToRemove = locks.next();
                 if (cacheKeyToRemove.getObject() == null) {
                     cacheKeyToRemove.removeFromOwningMap();
                 }
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 3df359c..3a5b0a4 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
@@ -59,7 +59,7 @@
         clone.setCacheKeys(new ConcurrentHashMap(this.cacheKeys.size()));
 
         for (Iterator<CacheKey> cacheKeysIterator = this.cacheKeys.values().iterator(); cacheKeysIterator.hasNext();) {
-            CacheKey key = (CacheKey)((CacheKey)cacheKeysIterator.next()).clone();
+            CacheKey key = (CacheKey) cacheKeysIterator.next().clone();
             clone.getCacheKeys().put(key.getKey(), key);
         }
 
@@ -74,7 +74,7 @@
     public void collectLocks(HashMap threadList) {
         Iterator<CacheKey> cacheKeyIterator = this.cacheKeys.values().iterator();
         while (cacheKeyIterator.hasNext()) {
-            CacheKey cacheKey = (CacheKey)cacheKeyIterator.next();
+            CacheKey cacheKey = cacheKeyIterator.next();
             if (cacheKey.isAcquired()) {
                 Thread activeThread = cacheKey.getActiveThread();
                 Set set = (Set)threadList.get(activeThread);
@@ -143,7 +143,7 @@
         Iterator<CacheKey> keys = this.cacheKeys.values().iterator();
 
         while (keys.hasNext()) {
-            CacheKey key = (CacheKey)keys.next();
+            CacheKey key = keys.next();
             Object object = key.getObject();
 
             if (object != null) {
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 97ee793..9c3ee20 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
@@ -439,8 +439,8 @@
             manager = (IdentityMapManager)super.clone();
             manager.setIdentityMaps(new ConcurrentHashMap());
             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());
+                Map.Entry<Class, IdentityMap> entry = iterator.next();
+                manager.identityMaps.put(entry.getKey(), (IdentityMap) entry.getValue().clone());
             }
         } catch (CloneNotSupportedException exception) {
             throw new InternalError(exception.toString());
@@ -555,7 +555,7 @@
             // cache the current time to avoid calculating it every time through the loop
             long currentTimeInMillis = System.currentTimeMillis();
             while (cacheEnum.hasMoreElements()) {
-                CacheKey key = (CacheKey)cacheEnum.nextElement();
+                CacheKey key = cacheEnum.nextElement();
                 if ((key.getObject() == null) || (!shouldReturnInvalidatedObjects && descriptor.getCacheInvalidationPolicy().isInvalidated(key, currentTimeInMillis))) {
                     continue;
                 }
@@ -649,7 +649,7 @@
                 long currentTimeInMillis = System.currentTimeMillis();
                 //Enumeration doesn't checkReadLocks
                 for (Enumeration<CacheKey> cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
-                    CacheKey key = (CacheKey)cacheEnum.nextElement();
+                    CacheKey key = cacheEnum.nextElement();
                     Object object = key.getObject();
                     if (object == null || cacheInvalidationPolicy.isInvalidated(key, currentTimeInMillis)) {
                         continue;
@@ -687,7 +687,7 @@
                 if(isChildDescriptor) {
                     // Must check for inheritance.
                     for (Enumeration<CacheKey> cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
-                        CacheKey key = (CacheKey)cacheEnum.nextElement();
+                        CacheKey key = cacheEnum.nextElement();
                         Object object = key.getObject();
                         if (object == null) {
                             continue;
@@ -700,7 +700,7 @@
                 } else {
                     // if it's either a root class or there is no inheritance just invalidate the whole identity map
                     for (Enumeration<CacheKey> cacheEnum = map.keys(false); cacheEnum.hasMoreElements();) {
-                        CacheKey key = (CacheKey)cacheEnum.nextElement();
+                        CacheKey key = cacheEnum.nextElement();
                         key.setInvalidationState(CacheKey.CACHE_KEY_INVALID);
                     }
                 }
@@ -780,7 +780,7 @@
         Iterator<Class> classes = getIdentityMaps().keySet().iterator();
         Vector results = new Vector(getIdentityMaps().size());
         while (classes.hasNext()) {
-            results.add(((Class)classes.next()).getName());
+            results.add(classes.next().getName());
         }
         return results;
     }
@@ -867,7 +867,7 @@
             // cache the current time to avoid calculating it every time through the loop
             long currentTimeInMillis = System.currentTimeMillis();
             while (cacheEnum.hasMoreElements()) {
-                CacheKey key = (CacheKey)cacheEnum.nextElement();
+                CacheKey key = cacheEnum.nextElement();
                 if (!shouldReturnInvalidatedObjects && descriptor.getCacheInvalidationPolicy().isInvalidated(key, currentTimeInMillis)) {
                     continue;
                 }
@@ -1235,7 +1235,7 @@
         }
 
         for (Enumeration<CacheKey> enumtr = map.keys(); enumtr.hasMoreElements();) {
-            org.eclipse.persistence.internal.identitymaps.CacheKey cacheKey = (org.eclipse.persistence.internal.identitymaps.CacheKey)enumtr.nextElement();
+            org.eclipse.persistence.internal.identitymaps.CacheKey cacheKey = enumtr.nextElement();
             Object object = cacheKey.getObject();
             if (businessClass.isInstance(object)) {
                 cacheCounter++;
@@ -1266,7 +1266,7 @@
     public void printIdentityMaps() {
         for (Iterator<Class<?>> iterator = this.session.getDescriptors().keySet().iterator();
              iterator.hasNext();) {
-            Class businessClass = (Class)iterator.next();
+            Class<?> businessClass = iterator.next();
             ClassDescriptor descriptor = this.session.getDescriptor(businessClass);
             if (descriptor.hasInheritance()) {
                 if (descriptor.getInheritancePolicy().isRootParentDescriptor()) {
@@ -1288,7 +1288,7 @@
         writer.write(TraceLocalization.buildMessage("lock_writer_header", null) + Helper.cr());
         Iterator<IdentityMap> idenityMapsIterator = this.session.getIdentityMapAccessorInstance().getIdentityMapManager().getIdentityMaps().values().iterator();
         while (idenityMapsIterator.hasNext()) {
-            IdentityMap idenityMap = (IdentityMap)idenityMapsIterator.next();
+            IdentityMap idenityMap = idenityMapsIterator.next();
             idenityMap.collectLocks(threadCollection);
         }
         Object[] parameters = new Object[1];
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 8c26a70..ff9cd3c 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
@@ -52,7 +52,7 @@
      */
     protected void cleanupDeadCacheKeys() {
         for (Iterator<CacheKey> iterator = getCacheKeys().values().iterator(); iterator.hasNext();) {
-            CacheKey key = (CacheKey)iterator.next();
+            CacheKey key = iterator.next();
             if (key.getObject() == null) {
                 // Check lock first.
                 // Change for CR 2317
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 ebf1dd9..947639e 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
@@ -75,7 +75,7 @@
         // get generated.
         List<ReportItem> items = reportQuery.getItems();
         for (Iterator<ReportItem> i = items.iterator(); i.hasNext();) {
-            ReportItem item = (ReportItem)i.next();
+            ReportItem item = i.next();
             Expression expr = item.getAttributeExpression();
             reportQuery.addNonFetchJoinedAttribute(expr);
         }
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 4be31b2..b2fae52 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
@@ -104,7 +104,7 @@
 
     public void setNamespaces(Vector<Namespace> namespaces) {
         super.clear();
-        for (Namespace namespace : (Vector<Namespace>) namespaces) {
+        for (Namespace namespace : namespaces) {
             if ((namespace.getPrefix() != null) && (namespace.getNamespaceURI() != null)) {
                 super.put(namespace.getPrefix(), namespace.getNamespaceURI());
             }
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 ecfa002..fc98922 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
@@ -193,7 +193,7 @@
         try {
             Iterator<ImageWriter> itr = ImageIO.getImageWritersByMIMEType(mimeType);
             if (itr.hasNext()) {
-                ImageWriter w = (ImageWriter) itr.next();
+                ImageWriter w = itr.next();
                 w.setOutput(ImageIO.createImageOutputStream(outputStream));
                 w.write(convertToBufferedImage(image));
                 w.dispose();
@@ -327,7 +327,7 @@
             String mimeType = "image/png";
             Iterator<ImageWriter> itr = ImageIO.getImageWritersByMIMEType(mimeType);
             if (itr.hasNext()) {
-                ImageWriter w = (ImageWriter) itr.next();
+                ImageWriter w = itr.next();
                 w.setOutput(ImageIO.createImageOutputStream(outputStream));
                 w.write(convertToBufferedImage(image));
                 w.dispose();
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 fb1a368..b5ff9c0 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
@@ -549,7 +549,7 @@
 
         for (Enumeration<DatabaseMapping> mappings = this.descriptor.getMappings().elements();
              mappings.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
 
             // Add attribute to mapping association
             if (!mapping.isWriteOnly()) {
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 8b85972..0d25879 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
@@ -185,7 +185,7 @@
                     declaredNs = new ArrayList<>();
                 }
                 while(namespaces.hasNext()) {
-                    Namespace next = (Namespace)namespaces.next();
+                    Namespace next = namespaces.next();
                     contentHandler.startPrefixMapping(next.getPrefix(), next.getNamespaceURI());
                     declaredNs.add(next);
                 }
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 521a6ff..c19f2fa 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
@@ -1118,7 +1118,7 @@
         // Step 1 - iterate over the removed changes and remove them from the container.
         Iterator<ObjectChangeSet> removeObjects = changeRecord.getRemoveObjectList().keySet().iterator();
         while (removeObjects.hasNext()) {
-            objectChanges = (ObjectChangeSet) removeObjects.next();
+            objectChanges = removeObjects.next();
             removeFrom(objectChanges.getOldKey(), objectChanges.getTargetVersionOfSourceObject(mergeManager, targetSession), valueOfTarget, targetSession);
             if (!mergeManager.shouldMergeChangesIntoDistributedCache()) {
                 mergeManager.registerRemovedNewObjectIfRequired(objectChanges.getUnitOfWorkClone());
@@ -1128,7 +1128,7 @@
         // Step 2 - iterate over the added changes and add them to the container.
         Iterator<ObjectChangeSet> addObjects = changeRecord.getAddObjectList().keySet().iterator();
         while (addObjects.hasNext()) {
-            objectChanges = (ObjectChangeSet) addObjects.next();
+            objectChanges = addObjects.next();
             Object object = null;
             if (shouldMergeCascadeParts) {
                 object = mergeCascadeParts(objectChanges, mergeManager, targetSession);
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 d6f8910..811f875 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
@@ -844,7 +844,7 @@
             AbstractRecord pkToModify = new DatabaseRecord();
             List<DatabaseField> primaryKeyFields = getDescriptor().getPrimaryKeyFields();
             for (int i = 0; i < primaryKeyFields.size(); i++) {
-                DatabaseField field = (DatabaseField)primaryKeyFields.get(i);
+                DatabaseField field = primaryKeyFields.get(i);
                 if (row.containsKey(field)) {
                     pkToModify.put(field, row.get(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 5fcd4a2..d7f618a 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
@@ -476,9 +476,9 @@
         Iterator<Map.Entry<DatabaseTable, DatabaseTable>> itEntries = selectStatement.getTableAliases().entrySet().iterator();
         DatabaseTable aliasTable = null;
         while(itEntries.hasNext()) {
-            Map.Entry entry = (Map.Entry)itEntries.next();
+            Map.Entry<DatabaseTable, DatabaseTable> entry = itEntries.next();
             if(table.equals(entry.getValue())) {
-                aliasTable = (DatabaseTable)entry.getKey();
+                aliasTable = entry.getKey();
                 aliasTables.add(aliasTable);
             }
         }
@@ -1510,7 +1510,7 @@
             Iterator<ClassDescriptor> it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
             while (it.hasNext()) {
                 // Define the same query for the child
-                ClassDescriptor childDescriptor = (ClassDescriptor)it.next();
+                ClassDescriptor childDescriptor = it.next();
 
                 // Most databases support delete cascade constraints by specifying a ON DELETE CASCADE option when defining foreign key constraints.
                 // However some databases which don't support foreign key constraints cannot use delete cascade constraints.
@@ -2534,7 +2534,7 @@
         Vector allFields = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
         Iterator<DatabaseField> it = rootDescriptor.getFields().iterator();
         while(it.hasNext()) {
-            DatabaseField field = (DatabaseField)it.next();
+            DatabaseField field = it.next();
             if(rootTable.equals(field.getTable())) {
                 allFields.add(field);
             }
@@ -2653,7 +2653,7 @@
 
             Iterator<ClassDescriptor> it = descriptor.getInheritancePolicy().getChildDescriptors().iterator();
             while (it.hasNext()) {
-                ClassDescriptor childDescriptor = (ClassDescriptor)it.next();
+                ClassDescriptor childDescriptor = it.next();
 
                 // Need to process only "multiple tables" child descriptors
                 if ((childDescriptor.getTables().size() > descriptor.getTables().size()) ||
@@ -2689,7 +2689,7 @@
         Vector allFields = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
         Iterator<DatabaseField> it = getDescriptor().getFields().iterator();
         while(it.hasNext()) {
-            DatabaseField field = (DatabaseField)it.next();
+            DatabaseField field = it.next();
             if(table.equals(field.getTable())) {
                 allFields.add(field);
             }
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 9f1a94d..ccd0d8e 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
@@ -255,7 +255,7 @@
             //next check for any partial attributes that are not joined attributes
             Iterator<Expression> partialAttributes = ((ObjectLevelReadQuery)getBaseQuery()).getPartialAttributeExpressions().iterator();
             while(partialAttributes.hasNext()){
-                Expression expression = (Expression)partialAttributes.next();
+                Expression expression = partialAttributes.next();
                 if (expression.isQueryKeyExpression()){
                     if (!getJoinedMappingExpressions().contains(expression) && ! getJoinedAttributeExpressions().contains(expression)){
                         fieldIndex += ((QueryKeyExpression)expression).getFields().size();
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 bb934e6..2fde388 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
@@ -479,7 +479,7 @@
         if (!changeRecord.getOrderedChangeObjectList().isEmpty()) {
             Iterator<OrderedChangeObject> objects =changeRecord.getOrderedChangeObjectList().iterator();
             while (objects.hasNext()){
-                OrderedChangeObject changeObject = (OrderedChangeObject)objects.next();
+                OrderedChangeObject changeObject = objects.next();
                 objectChanges = changeObject.getChangeSet();
                 if (changeObject.getChangeType() == CollectionChangeEvent.REMOVE){
                     boolean objectRemoved = changeRecord.getRemoveObjectList().containsKey(objectChanges);
@@ -550,7 +550,7 @@
                 Iterator<ObjectChangeSet> removedObjects = changeRecord.getRemoveObjectList().keySet().iterator();
 
                 while (removedObjects.hasNext()) {
-                    objectChanges = (ObjectChangeSet) removedObjects.next();
+                    objectChanges = removedObjects.next();
                     removeFrom(objectChanges.getOldKey(), objectChanges.getTargetVersionOfSourceObject(mergeManager, targetSession), valueOfTarget, targetSession);
                     registerRemoveNewObjectIfRequired(objectChanges, mergeManager);
                 }
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 67be2da..f08bca8 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
@@ -27,7 +27,7 @@
         boolean hasSequencing = false;
         Iterator<AbstractSession> sessionEnum = br.getSessionsByName().values().iterator();
         while (sessionEnum.hasNext() && !hasSequencing) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             hasSequencing = session.getSequencing() != null;
         }
         return hasSequencing;
@@ -43,7 +43,7 @@
         boolean first = true;
         Iterator<AbstractSession> sessionEnum = broker.getSessionsByName().values().iterator();
         while ((first || (whenShouldAcquireValueForAll != UNDEFINED)) && sessionEnum.hasNext()) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             Sequencing sequencing = session.getSequencing();
             if (sequencing != null) {
                 if (first) {
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 f80509a..e05fa01 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
@@ -457,15 +457,15 @@
         String validation = (String)getProperty(PersistenceUnitProperties.JPQL_VALIDATION);
         JPAQueryBuilder builder = null;
         try {
-            Class parserClass = null;
+            Class<? extends JPAQueryBuilder> parserClass = null;
             // 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));
-                builder = (JPAQueryBuilder)AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(parserClass));
+                builder = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(parserClass));
             } else {
                 parserClass = PrivilegedAccessHelper.getClassForName(queryBuilderClassName);
-                builder = (JPAQueryBuilder)PrivilegedAccessHelper.newInstanceFromClass(parserClass);
+                builder = PrivilegedAccessHelper.newInstanceFromClass(parserClass);
             }
         } catch (Exception e) {
             throw new IllegalStateException("Could not load the JPQL parser class." /* TODO: Localize string */, e);
@@ -627,10 +627,10 @@
      * Add the query to the session queries.
      */
     protected synchronized void addQuery(DatabaseQuery query, boolean nameMustBeUnique) {
-        Vector queriesByName = (Vector)getQueries().get(query.getName());
+        List<DatabaseQuery> queriesByName = getQueries().get(query.getName());
         if (queriesByName == null) {
             // lazily create Vector in Hashtable.
-            queriesByName = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
+            queriesByName = new ArrayList<>();
             getQueries().put(query.getName(), queriesByName);
         }
 
@@ -642,8 +642,8 @@
             }
         }else{
             // Check that we do not already have a query that matched it
-            for (Iterator enumtr = queriesByName.iterator(); enumtr.hasNext();) {
-                DatabaseQuery existingQuery = (DatabaseQuery)enumtr.next();
+            for (Iterator<DatabaseQuery> enumtr = queriesByName.iterator(); enumtr.hasNext();) {
+                DatabaseQuery existingQuery = enumtr.next();
                 if (Helper.areTypesAssignable(query.getArgumentTypes(), existingQuery.getArgumentTypes())) {
                     throw ValidationException.existingQueryTypeConflict(query, existingQuery);
                 }
@@ -1603,7 +1603,7 @@
      */
     @Override
     public Object executeQuery(String queryName, Class domainClass, Object arg1) throws DatabaseException {
-        Vector argumentValues = new Vector();
+        Vector<Object> argumentValues = new Vector<>();
         argumentValues.addElement(arg1);
         return executeQuery(queryName, domainClass, argumentValues);
     }
@@ -1618,7 +1618,7 @@
      */
     @Override
     public Object executeQuery(String queryName, Class domainClass, Object arg1, Object arg2) throws DatabaseException {
-        Vector argumentValues = new Vector();
+        Vector<Object> argumentValues = new Vector<>();
         argumentValues.addElement(arg1);
         argumentValues.addElement(arg2);
         return executeQuery(queryName, domainClass, argumentValues);
@@ -1634,7 +1634,7 @@
      */
     @Override
     public Object executeQuery(String queryName, Class domainClass, Object arg1, Object arg2, Object arg3) throws DatabaseException {
-        Vector argumentValues = new Vector();
+        Vector<Object> argumentValues = new Vector<>();
         argumentValues.addElement(arg1);
         argumentValues.addElement(arg2);
         argumentValues.addElement(arg3);
@@ -1691,7 +1691,7 @@
      */
     @Override
     public Object executeQuery(String queryName, Object arg1) throws DatabaseException {
-        Vector argumentValues = new Vector();
+        Vector<Object> argumentValues = new Vector<>();
         argumentValues.addElement(arg1);
         return executeQuery(queryName, argumentValues);
     }
@@ -1705,7 +1705,7 @@
      */
     @Override
     public Object executeQuery(String queryName, Object arg1, Object arg2) throws DatabaseException {
-        Vector argumentValues = new Vector();
+        Vector<Object> argumentValues = new Vector<>();
         argumentValues.addElement(arg1);
         argumentValues.addElement(arg2);
         return executeQuery(queryName, argumentValues);
@@ -1720,7 +1720,7 @@
      */
     @Override
     public Object executeQuery(String queryName, Object arg1, Object arg2, Object arg3) throws DatabaseException {
-        Vector argumentValues = new Vector();
+        Vector<Object> argumentValues = new Vector<>();
         argumentValues.addElement(arg1);
         argumentValues.addElement(arg2);
         argumentValues.addElement(arg3);
@@ -1995,7 +1995,7 @@
             synchronized (this) {
                 if ((this.accessors == null) && (this.project != null) && (this.project.getDatasourceLogin() != null)) {
                     // PERF: lazy init, not always required.
-                    List<Accessor> newAccessors = new ArrayList(1);
+                    List<Accessor> newAccessors = new ArrayList<>(1);
                     newAccessors.add(this.project.getDatasourceLogin().buildAccessor());
                     this.accessors = newAccessors;
                 }
@@ -2916,7 +2916,7 @@
     @Override
     public Map<String, Object> getProperties() {
         if (properties == null) {
-            properties = new HashMap(5);
+            properties = new HashMap<>(5);
         }
         return properties;
     }
@@ -2965,7 +2965,7 @@
     public Map<String, List<DatabaseQuery>> getQueries() {
         // PERF: lazy init, not normally required.
         if (queries == null) {
-            queries = new HashMap(5);
+            queries = new HashMap<>(5);
         }
         return queries;
     }
@@ -2994,9 +2994,9 @@
      * @see #getQueries()
      */
     public List<DatabaseQuery> getAllQueries() {
-        Vector allQueries = new Vector();
+        List<DatabaseQuery> allQueries = new Vector<>();
         for (Iterator<List<DatabaseQuery>> vectors = getQueries().values().iterator(); vectors.hasNext();) {
-            allQueries.addAll((Vector)vectors.next());
+            allQueries.addAll(vectors.next());
         }
         return allQueries;
     }
@@ -3053,11 +3053,11 @@
      * @see #getQuery(String, List)
      */
     public DatabaseQuery getQuery(String name, Vector arguments, boolean shouldSearchParent) {
-        Vector queries = (Vector)getQueries().get(name);
+        List<DatabaseQuery> queries = getQueries().get(name);
         if ((queries != null) && !queries.isEmpty()) {
             // Short circuit the simple, most common case of only one query.
             if (queries.size() == 1) {
-                return (DatabaseQuery)queries.firstElement();
+                return queries.get(0);
             }
 
             // CR#3754; Predrag; mar 19/2002;
@@ -3075,8 +3075,7 @@
             for (int i = 0; i < argumentTypesSize; i++) {
                 argumentTypes.addElement(arguments.elementAt(i).getClass());
             }
-            for (Enumeration queriesEnum = queries.elements(); queriesEnum.hasMoreElements();) {
-                DatabaseQuery query = (DatabaseQuery)queriesEnum.nextElement();
+            for (DatabaseQuery query: queries) {
                 if (Helper.areTypesAssignable(argumentTypes, query.getArgumentTypes())) {
                     return query;
                 }
@@ -3853,14 +3852,14 @@
      * Remove the specific query with the given queryName and argumentTypes.
      */
     public void removeQuery(String queryName, Vector argumentTypes) {
-        Vector queries = (Vector)getQueries().get(queryName);
+        List<DatabaseQuery> queries = getQueries().get(queryName);
         if (queries == null) {
             return;
         } else {
             DatabaseQuery query = null;
-            for (Enumeration enumtr = queries.elements(); enumtr.hasMoreElements();) {
-                query = (DatabaseQuery)enumtr.nextElement();
+            for (DatabaseQuery q: queries) {
                 if (Helper.areTypesAssignable(argumentTypes, query.getArgumentTypes())) {
+                    query = q;
                     break;
                 }
             }
@@ -3935,7 +3934,7 @@
      * Set the accessor.
      */
     public void setAccessor(Accessor accessor) {
-        this.accessors = new ArrayList(1);
+        this.accessors = new ArrayList<>(1);
         this.accessors.add(accessor);
     }
 
@@ -4137,7 +4136,7 @@
              * the key:value type values at design time. putAll() is not
              * synchronized. We clone all maps whether immutable or not.
              */
-            properties = new HashMap();
+            properties = new HashMap<>();
             // Shallow copy all internal key:value pairs - a null propertiesMap will throw a NPE
             properties.putAll(propertiesMap);
         }
@@ -4967,11 +4966,11 @@
             Map<String, List<DatabaseQuery>> queries  = descriptor.getQueryManager().getQueries();
             if ((queries != null) && (queries.size() > 0)) {
                 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();
+                    Map.Entry<String, List<DatabaseQuery>> entry = keyValueItr.next();
+                    List<DatabaseQuery> thisQueries = entry.getValue();
                     if ((thisQueries != null) && (thisQueries.size() > 0)){
-                        for( Iterator thisQueriesItr=thisQueries.iterator();thisQueriesItr.hasNext();){
-                            DatabaseQuery queryToBeAdded = (DatabaseQuery)thisQueriesItr.next();
+                        for( Iterator<DatabaseQuery> thisQueriesItr=thisQueries.iterator();thisQueriesItr.hasNext();){
+                            DatabaseQuery queryToBeAdded = thisQueriesItr.next();
                             if (allowSameQueryNameDiffArgsCopyToSession){
                                 addQuery(queryToBeAdded, false);
                             } else {
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 bc64f06..88a869e 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
@@ -265,7 +265,7 @@
         Map<ObjectChangeSet, ObjectChangeSet> changeSets = new HashMap<>();
         Iterator<ObjectChangeSet> addEnum = ((CollectionChangeRecord)mergeFromRecord).getAddObjectList().keySet().iterator();
         while (addEnum.hasNext()) {
-            ObjectChangeSet mergingObject = (ObjectChangeSet)addEnum.next();
+            ObjectChangeSet mergingObject = addEnum.next();
             ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet(mergingObject, mergeFromChangeSet);
             if (getRemoveObjectList().containsKey(localChangeSet)) {
                 getRemoveObjectList().remove(localChangeSet);
@@ -277,7 +277,7 @@
         changeSets = new HashMap<>();
         Iterator<ObjectChangeSet> removeEnum = ((CollectionChangeRecord)mergeFromRecord).getRemoveObjectList().keySet().iterator();
         while (removeEnum.hasNext()) {
-            ObjectChangeSet mergingObject = (ObjectChangeSet)removeEnum.next();
+            ObjectChangeSet mergingObject = removeEnum.next();
             ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet(mergingObject, mergeFromChangeSet);
             if (getAddObjectList().containsKey(localChangeSet)) {
                 getAddObjectList().remove(localChangeSet);
@@ -290,7 +290,7 @@
         List<OrderedChangeObject> orderedChangeSets = new ArrayList<>();
         Iterator<OrderedChangeObject> orderedChangeObjectEnum = ((CollectionChangeRecord)mergeFromRecord).getOrderedChangeObjectList().iterator();
         while (orderedChangeObjectEnum.hasNext()) {
-            OrderedChangeObject changeObject = (OrderedChangeObject)orderedChangeObjectEnum.next();
+            OrderedChangeObject changeObject = orderedChangeObjectEnum.next();
             ObjectChangeSet mergingObject = changeObject.getChangeSet();
             ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet(mergingObject, mergeFromChangeSet);
 
@@ -362,13 +362,13 @@
         } else {
             Iterator<ObjectChangeSet> changes = getAddObjectList().values().iterator();
             while (changes.hasNext()) {
-                ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet((ObjectChangeSet)changes.next(), mergeFromChangeSet);
+                ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet(changes.next(), mergeFromChangeSet);
                 addList.put(localChangeSet, localChangeSet);
             }
 
             changes = getRemoveObjectList().values().iterator();
             while (changes.hasNext()) {
-                ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet((ObjectChangeSet)changes.next(), mergeFromChangeSet);
+                ObjectChangeSet localChangeSet = mergeToChangeSet.findOrIntegrateObjectChangeSet(changes.next(), mergeFromChangeSet);
                 removeList.put(localChangeSet, localChangeSet);
             }
         }
@@ -530,14 +530,14 @@
            if(this.removeObjectList != null) {
                Iterator<ObjectChangeSet> it = this.removeObjectList.keySet().iterator();
                while(it.hasNext()) {
-                   ObjectChangeSet changeSet = (ObjectChangeSet)it.next();
+                   ObjectChangeSet changeSet = it.next();
                    cp.addInto(changeSet.getUnitOfWorkClone(), currentCollection, session);
                }
            }
            if(this.addObjectList != null) {
                Iterator<ObjectChangeSet> it = this.addObjectList.keySet().iterator();
                while(it.hasNext()) {
-                   ObjectChangeSet changeSet = (ObjectChangeSet)it.next();
+                   ObjectChangeSet changeSet = 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 3663924..c0910c1 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
@@ -156,7 +156,7 @@
                 List<Class> commitOrder = getCommitOrder();
                 int size = commitOrder.size();
                 for (int index = 0; index < size; index++) {
-                    Class theClass = (Class)commitOrder.get(index);
+                    Class theClass = commitOrder.get(index);
                     commitAllObjectsForClassWithChangeSet(uowChangeSet, theClass);
                 }
             }
@@ -313,7 +313,7 @@
             } else {
                 List<Class> commitOrder = getCommitOrder();
                 for (int orderIndex = commitOrder.size() - 1; orderIndex >= 0; orderIndex--) {
-                    Class theClass = (Class)commitOrder.get(orderIndex);
+                    Class theClass = 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 9f2ef3f..70e3e8e 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
@@ -102,7 +102,7 @@
     public void recordMappingDependencies() {
         for (Enumeration<DatabaseMapping> mappings = getDescriptor().getMappings().elements();
              mappings.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
             if (mapping.isForeignReferenceMapping()) {
                 if (mapping.hasConstraintDependency()) {
                     Class ownedClass;
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 7884a8c..ee67e99 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
@@ -857,7 +857,7 @@
         //bug 275724: IdentityMapAccessor.invalidateClass() should not check ReadLock when invalidating
         Enumeration<CacheKey> keys = identityMap.keys(false); // do not check readlock
         while (keys.hasMoreElements()) {
-            CacheKey key = (CacheKey)keys.nextElement();
+            CacheKey key = keys.nextElement();
             Object obj = key.getObject();
             // 312503: When recurse is false we also invalidate all assignable implementing subclasses of [obj]
             if (recurseAndInvalidateToParentRoot || ((obj != null) && (null != myClass) && myClass.isAssignableFrom(obj.getClass()))) {
@@ -1155,7 +1155,7 @@
         iterator.setSession(getSession());
         Iterator<ClassDescriptor> descriptors = getSession().getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             IdentityMap cache = getIdentityMap(descriptor, true);
             if (cache != null) {
                 for (Enumeration mapEnum = cache.elements(); mapEnum.hasMoreElements();) {
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 4cc9f00..88ff26d 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
@@ -438,7 +438,7 @@
             Iterator<ObjectChangeSet> objectChangeEnum = uowChangeSet.getAllChangeSets().keySet().iterator();
             Set<Class> classesChanged = new HashSet<>();
             while (objectChangeEnum.hasNext()) {
-                ObjectChangeSet objectChangeSet = (ObjectChangeSet)objectChangeEnum.next();
+                ObjectChangeSet objectChangeSet = objectChangeEnum.next();
                 // Don't read the object here.  If it is null then we won't merge it at this stage, unless it
                 // is being referenced which will force the load later.
                 Object object = objectChangeSet.getTargetVersionOfSourceObject(this, this.session, false);
@@ -456,7 +456,7 @@
             if (uowChangeSet.hasDeletedObjects()) {
                 Iterator<ObjectChangeSet> deletedObjects = uowChangeSet.getDeletedObjects().values().iterator();
                 while (deletedObjects.hasNext()) {
-                    ObjectChangeSet changeSet = (ObjectChangeSet)deletedObjects.next();
+                    ObjectChangeSet changeSet = deletedObjects.next();
                     changeSet.removeFromIdentityMap(this.session);
                     classesChanged.add(changeSet.getClassType(this.session));
                 }
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 e237cd7..18b9595 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
@@ -41,7 +41,7 @@
     public void initializeAllIdentityMaps() {
         for (Iterator<AbstractSession> sessionEnum = ((SessionBroker)session).getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.getIdentityMapAccessorInstance().initializeAllIdentityMaps();
         }
         super.initializeAllIdentityMaps();
@@ -59,7 +59,7 @@
     public void initializeIdentityMaps() {
         for (Iterator<AbstractSession> sessionEnum = ((SessionBroker)session).getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.getIdentityMapAccessorInstance().initializeIdentityMaps();
         }
         super.initializeIdentityMaps();
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 715c7d1..7d5da5c 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
@@ -3814,7 +3814,7 @@
         if (this.unitOfWorkChangeSet.hasDeletedObjects()) {
             Map<ObjectChangeSet, ObjectChangeSet> deletedObjects = this.unitOfWorkChangeSet.getDeletedObjects();
             for (Iterator<ObjectChangeSet> removedObjects = deletedObjects.keySet().iterator(); removedObjects.hasNext(); ) {
-                ObjectChangeSet removedObjectChangeSet = (ObjectChangeSet) removedObjects.next();
+                ObjectChangeSet removedObjectChangeSet = removedObjects.next();
                 Object primaryKey = removedObjectChangeSet.getId();
                 ClassDescriptor descriptor = removedObjectChangeSet.getDescriptor();
                 // PERF: Do not remove if uow is isolated.
@@ -5429,7 +5429,7 @@
             Iterator<Map.Entry<Object, Object>> newEntries = this.newObjectsCloneToOriginal.entrySet().iterator();
             Map cloneToOriginals = getCloneToOriginals();
             while (newEntries.hasNext()) {
-                Map.Entry entry = (Map.Entry)newEntries.next();
+                Map.Entry<Object, Object> entry = newEntries.next();
                 Object clone = entry.getKey();
                 Object original = entry.getValue();
                 if (original != null) {
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 9397a86..78b300d 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
@@ -90,7 +90,7 @@
         Iterator<RemoteConnection> connections = rcm.getTransportManager().getConnectionsToExternalServicesForCommandPropagation().values().iterator();
 
         while (connections.hasNext()) {
-            connection = (RemoteConnection)connections.next();
+            connection = connections.next();
             this.propagateCommand(connection);
         }
     }
@@ -203,12 +203,12 @@
                 // There is only one connection - no need for yet another thread.
                 // Set the connection into the current one
                 // so that it's recognized as async propagation in handleCommunicationException method.
-                this.connection = (RemoteConnection)iterator.next();
+                this.connection = iterator.next();
                 propagateCommand(this.connection);
             } else {
                 // This is the top level thread. We need to spawn off a bunch of async connection threads
                 while (iterator.hasNext()) {
-                    RemoteConnection remoteConnection = (RemoteConnection)iterator.next();
+                    RemoteConnection remoteConnection = iterator.next();
                     CommandPropagator propagator = new CommandPropagator(this.rcm, this.command, this.commandBytes, remoteConnection);
                     this.rcm.getServerPlatform().launchContainerRunnable(propagator);
                 }
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 0c9b851..e6e3f38 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
@@ -582,7 +582,7 @@
                 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);
+                    Association association = associations.get(index);
                     FieldTranslation translation = new FieldTranslation();
                     translation.setKey(new DatabaseField((String)association.getKey()));
                     translation.setValue(association.getValue());
@@ -3609,7 +3609,7 @@
                 List associations = new ArrayList(sourceToTargetKeyFields.size());
                 Iterator<Map.Entry<DatabaseField, DatabaseField>> iterator = sourceToTargetKeyFields.entrySet().iterator();
                 while (iterator.hasNext()) {
-                    Map.Entry entry = (Map.Entry)iterator.next();
+                    Map.Entry<DatabaseField, DatabaseField> entry = iterator.next();
                     associations.add(new Association(entry.getKey(), entry.getValue()));
                 }
                 return associations;
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 440e34a..480165f 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
@@ -1001,9 +1001,9 @@
             List storedProcedureArguments = new Vector();
             for (int i = spc.getFirstParameterIndexForCallString(); i < parameterTypes.size(); i++) {
                 StoredProcedureArgument spa = null;
-                Integer direction = (Integer)parameterTypes.get(i);
+                Integer direction = parameterTypes.get(i);
                 Object argument = parameters.get(i);
-                String argumentName = (String)procedureArgumentNames.get(i);
+                String argumentName = procedureArgumentNames.get(i);
                 if (direction.equals(IN)) {
                     spa = new StoredProcedureArgument();
                 }
@@ -1717,8 +1717,8 @@
                  List associations = new ArrayList(fields.size());
                  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())));
+                     Map.Entry<String, DatabaseType> entry = iterator.next();
+                     associations.add(new ObjectTypeFieldAssociation(entry.getKey().toString(),  wrapType(entry.getValue())));
                  }
                  return associations;
              }
@@ -1729,7 +1729,7 @@
                  Map<String, DatabaseType> fieldMap = new LinkedHashMap<>(associations.size() + 1);
                  Iterator<ObjectTypeFieldAssociation> iterator = associations.iterator();
                  while (iterator.hasNext()) {
-                     ObjectTypeFieldAssociation association = (ObjectTypeFieldAssociation)iterator.next();
+                     ObjectTypeFieldAssociation association = iterator.next();
                      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 c489f24..be58fa6 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
@@ -554,7 +554,7 @@
                 Iterator<String> i = converterClassConfig.getStructConverterClasses().iterator();
 
                 while (i.hasNext()) {
-                    String converterClassName = (String)i.next();
+                    String converterClassName = i.next();
                     try {
                         Class<StructConverter> converterClass = (Class<StructConverter>) m_classLoader.loadClass(converterClassName);
                         StructConverter converter = null;
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 47165f1..15be2c5 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
@@ -1388,7 +1388,7 @@
         Expression builder = new ExpressionBuilder();
 
         for (Iterator<DatabaseField> keys = getTargetForeignKeyToSourceKeys().keySet().iterator(); keys.hasNext();) {
-            DatabaseField targetForeignKey = (DatabaseField)keys.next();
+            DatabaseField targetForeignKey = keys.next();
             DatabaseField sourceKey = getTargetForeignKeyToSourceKeys().get(targetForeignKey);
 
             expression = builder.getField(targetForeignKey).equal(builder.getParameter(sourceKey));
@@ -1456,7 +1456,7 @@
 
         for (Enumeration<DatabaseField> sourcekeys = getSourceKeyFields().elements();
              sourcekeys.hasMoreElements();) {
-            DatabaseField sourceKey = (DatabaseField)sourcekeys.nextElement();
+            DatabaseField sourceKey = 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.
             Object referenceKey = null;
@@ -1480,7 +1480,7 @@
         Vector fieldNames = new Vector(getSourceKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getSourceKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -1503,7 +1503,7 @@
         Vector fieldNames = new Vector(getTargetForeignKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getTargetForeignKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -2030,7 +2030,7 @@
         Expression builder = new ExpressionBuilder();
 
         for (Iterator<DatabaseField> keys = getTargetForeignKeyToSourceKeys().keySet().iterator(); keys.hasNext();) {
-            DatabaseField targetForeignKey = (DatabaseField)keys.next();
+            DatabaseField targetForeignKey = keys.next();
             DatabaseField sourceKey = getTargetForeignKeyToSourceKeys().get(targetForeignKey);
 
             expression = builder.getField(targetForeignKey).equal(builder.getParameter(sourceKey));
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 90b5536..a49176b 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
@@ -1086,7 +1086,7 @@
         }
         for (Enumeration<DatabaseMapping> mappings = getReferenceDescriptor(attributeValue, session).getMappings().elements();
              mappings.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = 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 7149937..1680f37 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
@@ -309,7 +309,7 @@
         Vector<DatabaseField> fields = getReferenceFields();
         int size = fields.size();
         for (int index = 0; index < size; index++) {
-            DatabaseField field = (DatabaseField)fields.get(index);
+            DatabaseField field = fields.get(index);
             Object value = databaseRow.get(field);
             if (value != null) {
                 return false;
@@ -556,7 +556,7 @@
         }
         Enumeration<DatabaseMapping> mappings = referenceDescriptor.getMappings().elements();
         for (; mappings.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.nextElement();
+            DatabaseMapping mapping = mappings.nextElement();
             if (value == null) {
                 attributeValue = null;
             } else {
@@ -583,7 +583,7 @@
         //Enumeration mappingsEnum = getSourceToTargetKeyFields().elements();
         Enumeration<DatabaseMapping> mappingsEnum = getReferenceDescriptor().getMappings().elements();
         for (; mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             String attributeName = mapping.getAttributeName();
             Expression join = expression.get(attributeName).equal(argument.get(attributeName));
             if (attributeByAttributeComparison == null) {
@@ -1615,7 +1615,7 @@
         if (referencedDescriptor == null) {
             Iterator<ClassDescriptor> ordered = project.getOrderedDescriptors().iterator();
             while (ordered.hasNext() && referencedDescriptor == null){
-                ClassDescriptor descriptor = (ClassDescriptor)ordered.next();
+                ClassDescriptor descriptor = ordered.next();
                 if (descriptor.getJavaClassName().equals(getReferenceClassName())){
                     referencedDescriptor = descriptor;
                 }
@@ -1628,7 +1628,7 @@
             // Also check subclasses.
             if (referencedDescriptor.hasInheritance()) {
                 for (Iterator<ClassDescriptor> iterator = referencedDescriptor.getInheritancePolicy().getChildDescriptors().iterator(); iterator.hasNext(); ) {
-                    ClassDescriptor subclassDescriptor = (ClassDescriptor)iterator.next();
+                    ClassDescriptor subclassDescriptor = iterator.next();
                     if (!subclassDescriptor.supportsChangeTracking(project)) {
                         return false;
                     }
@@ -1762,7 +1762,7 @@
             List values = row.getValues();
             List<DatabaseField> aggregateFields = getReferenceFields();
             for(int i=0; i < size; i++) {
-                DatabaseField field = (DatabaseField)fields.get(i);
+                DatabaseField field = fields.get(i);
                 if(aggregateFields.contains(field)) {
                     aggregateRow.add(field, values.get(i));
                 }
@@ -1890,7 +1890,7 @@
         Hashtable fieldNames = new Hashtable(fieldAssociations.size() + 1);
         for (Enumeration<Association> associationsEnum = fieldAssociations.elements();
              associationsEnum.hasMoreElements();) {
-            Association association = (Association)associationsEnum.nextElement();
+            Association association = associationsEnum.nextElement();
             fieldNames.put(association.getKey(), association.getValue());
         }
 
@@ -2014,7 +2014,7 @@
         // EL Bug 326977
         Vector fieldsToTranslate = (Vector) clonedDescriptor.getFields().clone();
         for (Iterator<QueryKey> qkIterator = clonedDescriptor.getQueryKeys().values().iterator(); qkIterator.hasNext();) {
-            QueryKey queryKey = (QueryKey)qkIterator.next();
+            QueryKey queryKey = qkIterator.next();
             if (queryKey.isDirectQueryKey()) {
                 DatabaseField field = ((DirectQueryKey)queryKey).getField();
                 fieldsToTranslate.add(field);
@@ -2024,7 +2024,7 @@
         // EL Bug 332080 - translate foreign reference mapping source key fields
         if (!clonedDescriptor.getObjectBuilder().isSimple()) {
             for (Iterator<DatabaseMapping> dcIterator = clonedDescriptor.getMappings().iterator(); dcIterator.hasNext();) {
-                DatabaseMapping mapping = (DatabaseMapping)dcIterator.next();
+                DatabaseMapping mapping = dcIterator.next();
                 if (mapping.isForeignReferenceMapping()) {
                     Collection fkFields = ((ForeignReferenceMapping)mapping).getFieldsForTranslationInAggregate();
                     if (fkFields != null && !fkFields.isEmpty()) {
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 c9e04a2..cc50897 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
@@ -1796,7 +1796,7 @@
         CollectionChangeRecord collectionChangeRecord = (CollectionChangeRecord)changeRecord;
         Iterator<ObjectChangeSet> it = collectionChangeRecord.getRemoveObjectList().values().iterator();
         while(it.hasNext()) {
-            ObjectChangeSet ocs = (ObjectChangeSet)it.next();
+            ObjectChangeSet ocs = it.next();
             containerPolicy.postCalculateChanges(ocs, referenceDescriptor, this, uow);
         }
     }
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 9b5629b..2f62d30 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
@@ -1352,7 +1352,7 @@
         Vector fieldNames = new Vector(getReferenceKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getReferenceKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -1419,7 +1419,7 @@
         Vector fieldNames = new Vector(getSourceKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getSourceKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -1753,7 +1753,7 @@
         AbstractRecord directRow = new DatabaseRecord();
         for (Enumeration<DatabaseField> referenceEnum = getReferenceKeyFields().elements();
              referenceEnum.hasMoreElements();) {
-            directRow.put((DatabaseField)referenceEnum.nextElement(), null);
+            directRow.put(referenceEnum.nextElement(), null);
         }
         directRow.put(getDirectField(), null);
         if(listOrderField != null) {
@@ -1781,7 +1781,7 @@
         }
 
         for (Enumeration<DatabaseField> referenceEnum = getReferenceKeyFields().elements(); referenceEnum.hasMoreElements();) {
-            DatabaseField field = (DatabaseField)referenceEnum.nextElement();
+            DatabaseField field = referenceEnum.nextElement();
 
             // Update the field first if the mapping is on a table per tenant entity.
             if (getDescriptor().hasTablePerMultitenantPolicy()) {
@@ -2655,7 +2655,7 @@
         // Make sure that each source key field is in the translation row.
         for (Enumeration<DatabaseField> sourceFieldsEnum = getSourceKeyFields().elements();
              sourceFieldsEnum.hasMoreElements();) {
-            DatabaseField sourceKey = (DatabaseField)sourceFieldsEnum.nextElement();
+            DatabaseField sourceKey = sourceFieldsEnum.nextElement();
             if (!translationRow.containsKey(sourceKey)) {
                 Object value = descriptor.getObjectBuilder().extractValueFromObjectForField(object, sourceKey, session);
                 translationRow.put(sourceKey, value);
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 207e7a9..c0f3555 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
@@ -957,7 +957,7 @@
         // Make sure that each source key field is in the translation row.
         for (Enumeration<DatabaseField> sourceFieldsEnum = getSourceKeyFields().elements();
              sourceFieldsEnum.hasMoreElements();) {
-            DatabaseField sourceKey = (DatabaseField)sourceFieldsEnum.nextElement();
+            DatabaseField sourceKey = sourceFieldsEnum.nextElement();
             if (!translationRow.containsKey(sourceKey)) {
                 Object value = descriptor.getObjectBuilder().extractValueFromObjectForField(object, sourceKey, session);
                 translationRow.put(sourceKey, value);
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 7b0a04d..f7ebff8 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
@@ -248,7 +248,7 @@
 
         for (Iterator<DatabaseField> keys = getTargetForeignKeysToSourceKeys().keySet().iterator();
              keys.hasNext();) {
-            DatabaseField targetForeignKey = (DatabaseField)keys.next();
+            DatabaseField targetForeignKey = keys.next();
             DatabaseField sourceKey = getTargetForeignKeysToSourceKeys().get(targetForeignKey);
 
             Expression partialSelectionCriteria = builder.getField(targetForeignKey).equal(builder.getParameter(sourceKey));
@@ -276,8 +276,8 @@
         Enumeration<DatabaseField> sourceKeys = getSourceKeyFields().elements();
         for (Enumeration<DatabaseField> targetForeignKeys = getTargetForeignKeyFields().elements();
              targetForeignKeys.hasMoreElements();) {
-            DatabaseField targetForeignKey = (DatabaseField)targetForeignKeys.nextElement();
-            DatabaseField sourceKey = (DatabaseField)sourceKeys.nextElement();
+            DatabaseField targetForeignKey = targetForeignKeys.nextElement();
+            DatabaseField sourceKey = sourceKeys.nextElement();
             Expression targetExpression = builder.getField(targetForeignKey);
             Expression sourceExpression = builder.getParameter(sourceKey);
             // store the expressions in order to initialize their fields later
@@ -474,7 +474,7 @@
         Vector fieldNames = new Vector(getSourceKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getSourceKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -517,7 +517,7 @@
         Vector fieldNames = new Vector(getTargetForeignKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getTargetForeignKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
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 085fc05..daef951 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
@@ -158,7 +158,7 @@
     public void addFieldsForMapKey(AbstractRecord joinRow){
         Iterator<DatabaseField> i = getForeignKeyFields().iterator();
         while (i.hasNext()){
-            joinRow.put((DatabaseField)i.next(), null);
+            joinRow.put(i.next(), null);
         }
     }
 
@@ -381,7 +381,7 @@
             if (expression==argument){
                 for (Iterator<DatabaseField> sourceFieldsEnum = getSourceToTargetKeyFields().keySet().iterator();
                      sourceFieldsEnum.hasNext();) {
-                    DatabaseField field = (DatabaseField)sourceFieldsEnum.next();
+                    DatabaseField field = sourceFieldsEnum.next();
                     Expression join = base.getField(field);
                     join = join.equal(join);
                     if (foreignKeyJoin == null) {
@@ -394,8 +394,8 @@
                 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();
+                    DatabaseField sourceField = sourceFieldsEnum.next();
+                    DatabaseField targetField = targetFieldsEnum.next();
                     Expression join = null;
                     join = base.getField(sourceField).equal(argument.getField(targetField));
                     if (foreignKeyJoin == null) {
@@ -753,7 +753,7 @@
         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);
+            DatabaseField targetKeyField = primaryKeyFields.get(index);
             DatabaseField sourceKeyField = getTargetToSourceKeyFields().get(targetKeyField);
             if (sourceKeyField == null) {
                 return null;
@@ -921,7 +921,7 @@
         Vector fieldNames = new Vector(getForeignKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -1003,7 +1003,7 @@
         Vector result = new Vector(primaryKeyFields.size());
 
         for (int index = 0; index < primaryKeyFields.size(); index++) {
-            DatabaseField pkField = (DatabaseField)primaryKeyFields.get(index);
+            DatabaseField pkField = primaryKeyFields.get(index);
             boolean found = false;
             for (Iterator fkStream = this.getForeignKeysToPrimaryKeys().keySet().iterator();
                      fkStream.hasNext();) {
@@ -1054,8 +1054,8 @@
         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();
+            Object fieldValue = sourceFieldEnum.next().getQualifiedName();
+            Object attributeValue = targetFieldEnum.next().getQualifiedName();
             associations.addElement(new Association(fieldValue, attributeValue));
         }
 
@@ -1405,7 +1405,7 @@
             }
 
             for (Iterator<DatabaseField> keys = getSourceToTargetKeyFields().keySet().iterator(); keys.hasNext();) {
-                DatabaseField foreignKey = (DatabaseField)keys.next();
+                DatabaseField foreignKey = keys.next();
                 DatabaseField targetKey = getSourceToTargetKeyFields().get(foreignKey);
 
                 Expression targetKeyExpression = builder.getField(targetKey);
@@ -1450,7 +1450,7 @@
         AbstractRecord targetRow = new DatabaseRecord();
 
         for (Iterator<DatabaseField> keys = getSourceToTargetKeyFields().keySet().iterator(); keys.hasNext();) {
-            DatabaseField foreignKey = (DatabaseField)keys.next();
+            DatabaseField foreignKey = keys.next();
             DatabaseField targetKey = getSourceToTargetKeyFields().get(foreignKey);
 
             targetRow.put(targetKey, databaseRow.get(foreignKey));
@@ -1765,7 +1765,7 @@
     public void writeFromAttributeIntoRow(Object attribute, AbstractRecord row, AbstractSession session)
     {
           for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements(); fieldsEnum.hasMoreElements();) {
-                  DatabaseField sourceKey = (DatabaseField) fieldsEnum.nextElement();
+                  DatabaseField sourceKey = fieldsEnum.nextElement();
                   DatabaseField targetKey = getSourceToTargetKeyFields().get(sourceKey);
                   Object referenceValue = null;
                           // If privately owned part is null then method cannot be invoked.
@@ -2080,7 +2080,7 @@
 
         for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            DatabaseField sourceKey = (DatabaseField)fieldsEnum.nextElement();
+            DatabaseField sourceKey = fieldsEnum.nextElement();
             databaseRow.add(sourceKey, null);
         }
     }
@@ -2096,7 +2096,7 @@
         }
 
         for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements(); fieldsEnum.hasMoreElements();) {
-            DatabaseField sourceKey = (DatabaseField)fieldsEnum.nextElement();
+            DatabaseField sourceKey = fieldsEnum.nextElement();
 
             if (shouldWriteField(sourceKey, WriteType.INSERT)) {
                 databaseRow.add(sourceKey, null);
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 f577eb3..b925697 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
@@ -318,7 +318,7 @@
         Vector fieldNames = new Vector(getSourceKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getSourceKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -419,7 +419,7 @@
         Vector fieldNames = new Vector(getSourceRelationKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getSourceRelationKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -442,7 +442,7 @@
         Vector fieldNames = new Vector(getTargetKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getTargetKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -477,7 +477,7 @@
         Vector fieldNames = new Vector(getTargetRelationKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getTargetRelationKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -734,7 +734,7 @@
         }
 
         for (Enumeration<DatabaseField> entry = getSourceRelationKeyFields().elements(); entry.hasMoreElements();) {
-            DatabaseField field = (DatabaseField)entry.nextElement();
+            DatabaseField field = entry.nextElement();
 
             // Update the fields table first if the mapping is from a table per tenant entity.
             ClassDescriptor sourceDescriptor = mapping.getDescriptor();
@@ -781,7 +781,7 @@
         }
 
         for (Enumeration<DatabaseField> targetEnum = getTargetRelationKeyFields().elements(); targetEnum.hasMoreElements();) {
-            DatabaseField field = (DatabaseField)targetEnum.nextElement();
+            DatabaseField field = targetEnum.nextElement();
 
             // Update the fields table first if the mapping is from a table per tenant entity.
             ClassDescriptor referenceDescriptor = mapping.getReferenceDescriptor();
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 a605bb5..a18249c 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
@@ -247,7 +247,7 @@
         CollectionChangeRecord collectionChangeRecord = (CollectionChangeRecord)changeRecord;
         Iterator<ObjectChangeSet> it = collectionChangeRecord.getAddObjectList().values().iterator();
         while(it.hasNext()) {
-            ObjectChangeSet change = (ObjectChangeSet)it.next();
+            ObjectChangeSet change = it.next();
             if(!change.hasChanges()) {
                 change.setShouldModifyVersionField(Boolean.TRUE);
                 ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)change.getUOWChangeSet()).addObjectChangeSet(change, uow, false);
@@ -256,7 +256,7 @@
         // in the mapping is privately owned then the target will be deleted - no need to modify target version.
         it = collectionChangeRecord.getRemoveObjectList().values().iterator();
         while(it.hasNext()) {
-            ObjectChangeSet change = (ObjectChangeSet)it.next();
+            ObjectChangeSet change = it.next();
             if (!isPrivateOwned()){
                 if(!change.hasChanges()) {
                     change.setShouldModifyVersionField(Boolean.TRUE);
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 e534ab9..86e7678 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
@@ -195,7 +195,7 @@
         }
 
         for (Enumeration<DatabaseField> enumtr = getForeignKeyFields().elements(); enumtr.hasMoreElements();) {
-            DatabaseField field = (DatabaseField)enumtr.nextElement();
+            DatabaseField field = enumtr.nextElement();
             foreignKeys.addElement(setOfKeys.get(field));
         }
         clone.setSourceToTargetQueryKeyFields(sourceToTarget);
@@ -325,7 +325,7 @@
         // Search any of the implementor descriptors for a mapping for the query-key.
         Iterator<ClassDescriptor> iterator = getReferenceDescriptor().getInterfacePolicy().getChildDescriptors().iterator();
         if (iterator.hasNext()) {
-            ClassDescriptor firstChild = (ClassDescriptor)iterator.next();
+            ClassDescriptor firstChild = iterator.next();
             DatabaseMapping mapping = firstChild.getObjectBuilder().getMappingForAttributeName(queryKey);
             if ((mapping != null) && (mapping.isDirectToFieldMapping())) {
                 return mapping.getAttributeClassification();
@@ -347,7 +347,7 @@
         Vector fieldNames = new Vector(getForeignKeyFields().size());
         for (Enumeration<DatabaseField> fieldsEnum = getForeignKeyFields().elements();
              fieldsEnum.hasMoreElements();) {
-            fieldNames.addElement(((DatabaseField)fieldsEnum.nextElement()).getQualifiedName());
+            fieldNames.addElement(fieldsEnum.nextElement().getQualifiedName());
         }
 
         return fieldNames;
@@ -824,7 +824,7 @@
         if (isForeignKeyRelationship()) {
             Enumeration<DatabaseField> foreignKeys = getForeignKeyFields().elements();
             while (foreignKeys.hasMoreElements()) {
-                record.put((DatabaseField)foreignKeys.nextElement(), null);
+                record.put(foreignKeys.nextElement(), null);
                 // EL Bug 319759 - if a field is null, then the update call cache should not be used
                 record.setNullValueInFields(true);
             }
@@ -856,7 +856,7 @@
                 Enumeration<DatabaseField> sourceFields = getForeignKeyFields().elements();
                 ClassDescriptor descriptor = session.getDescriptor(referenceObject.getClass());
                 while (sourceFields.hasMoreElements()) {
-                    DatabaseField sourceKey = (DatabaseField)sourceFields.nextElement();
+                    DatabaseField sourceKey = sourceFields.nextElement();
                     String targetQueryKey = (String)getSourceToTargetQueryKeyNames().get(sourceKey);
                     DatabaseField targetKeyField = descriptor.getObjectBuilder().getFieldForQueryKeyName(targetQueryKey);
                     if (targetKeyField == null) {
@@ -897,7 +897,7 @@
                 Enumeration<DatabaseField> sourceFields = getForeignKeyFields().elements();
                 ClassDescriptor descriptor = session.getDescriptor(referenceObject.getClass());
                 while (sourceFields.hasMoreElements()) {
-                    DatabaseField sourceKey = (DatabaseField)sourceFields.nextElement();
+                    DatabaseField sourceKey = sourceFields.nextElement();
                     String targetQueryKey = (String)getSourceToTargetQueryKeyNames().get(sourceKey);
                     DatabaseField targetKeyField = descriptor.getObjectBuilder().getFieldForQueryKeyName(targetQueryKey);
                     if (targetKeyField == null) {
@@ -975,7 +975,7 @@
                 Enumeration<DatabaseField> sourceFields = getForeignKeyFields().elements();
                 ClassDescriptor descriptor = query.getSession().getDescriptor(referenceObject.getClass());
                 while (sourceFields.hasMoreElements()) {
-                    DatabaseField sourceKey = (DatabaseField)sourceFields.nextElement();
+                    DatabaseField sourceKey = sourceFields.nextElement();
                     String targetQueryKey = (String)getSourceToTargetQueryKeyNames().get(sourceKey);
                     DatabaseField targetKeyField = descriptor.getObjectBuilder().getFieldForQueryKeyName(targetQueryKey);
                     if (targetKeyField == null) {
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 cac226d..2c18686 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
@@ -804,7 +804,7 @@
         Hashtable table = new Hashtable(getFieldTransformations().size());
         Iterator<FieldTransformation> transformations = getFieldTransformations().iterator();
         while (transformations.hasNext()) {
-            FieldTransformation transformation = (FieldTransformation)transformations.next();
+            FieldTransformation transformation = transformations.next();
             if (transformation instanceof MethodBasedFieldTransformation) {
                 table.put(transformation.getField().getQualifiedName(), ((MethodBasedFieldTransformation)transformation).getMethodName());
             }
@@ -852,9 +852,9 @@
                     if (session.getDatasourcePlatform() instanceof DatabasePlatform) {
                         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())) {
-                                field.setType((Class)entry.getKey());
+                            Map.Entry<Class, FieldTypeDefinition> entry = iterator.next();
+                            if (entry.getValue().getName().equals(field.getColumnDefinition())) {
+                                field.setType(entry.getKey());
                                 break;
                             }
                         }
@@ -1162,7 +1162,7 @@
     public Vector getFieldNameToMethodNameAssociations() {
         Vector associations = new Vector();
         for (Iterator<FieldTransformation> source = getFieldTransformations().iterator(); source.hasNext();) {
-            FieldTransformation tf = (FieldTransformation)source.next();
+            FieldTransformation tf = source.next();
             if (tf instanceof MethodBasedFieldTransformation) {
                 Association ass = new Association();
                 ass.setKey(tf.getField().getQualifiedName());
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 f720116..bca46f7 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
@@ -456,7 +456,7 @@
         //Iterate over the ORM descriptors and check for matching OXM descriptors
         Iterator<ClassDescriptor> ormDescriptors = ormSession.getDescriptors().values().iterator();
         while(ormDescriptors.hasNext()) {
-            ClassDescriptor ormDescriptor = (ClassDescriptor)ormDescriptors.next();
+            ClassDescriptor ormDescriptor = ormDescriptors.next();
             Class javaClass = ormDescriptor.getJavaClass();
             AbstractSession oxmSession = null;
             try {
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 9c5d5f2..65e6951 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
@@ -585,7 +585,7 @@
         // Allow mapping pre init, must be done before validate.
         for (Enumeration<DatabaseMapping> mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
             try {
-                DatabaseMapping mapping = (DatabaseMapping) mappingsEnum.nextElement();
+                DatabaseMapping mapping = mappingsEnum.nextElement();
                 mapping.preInitialize(session);
             } catch (DescriptorException exception) {
                 session.getIntegrityChecker().handleError(exception);
@@ -765,7 +765,7 @@
         }
 
         for (Enumeration<DatabaseMapping> mappingsEnum = getMappings().elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping) mappingsEnum.nextElement();
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             validateMappingType(mapping);
             mapping.initialize(session);
             if(mapping.isObjectReferenceMapping()) {
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 17aefba..06888b6 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
@@ -382,7 +382,7 @@
                         cp.addInto(objectValue, container, session);
                     }
                 } else if (next.getNodeType() == Node.ELEMENT_NODE) {
-                    ClassDescriptor referenceDescriptor = null;
+                    XMLDescriptor referenceDescriptor = null;
 
                     //In this case it must be an element so we need to dig up the descriptor
                     //make a nested record and build an object from it.
@@ -415,7 +415,7 @@
                                 referenceDescriptor = null;
                             }
                             // Check if descriptor is for a wrapper, if it is null it out and let continue
-                            XMLDescriptor xmlReferenceDescriptor = (XMLDescriptor) referenceDescriptor;
+                            XMLDescriptor xmlReferenceDescriptor = referenceDescriptor;
                             if (referenceDescriptor != null && xmlReferenceDescriptor.isWrapper()) {
                                 referenceDescriptor = null;
                             }
@@ -427,7 +427,7 @@
                             // wrap the object in an XMLRoot
                             // if we know the descriptor use it to wrap the Element in an XMLRoot (if necessary)
                             if (referenceDescriptor != null) {
-                                objVal = ((XMLDescriptor) referenceDescriptor).wrapObjectInXMLRoot(objVal, next.getNamespaceURI(), next.getLocalName(), next.getPrefix(), false, record.isNamespaceAware(), record.getUnmarshaller());
+                                objVal = referenceDescriptor.wrapObjectInXMLRoot(objVal, next.getNamespaceURI(), next.getLocalName(), next.getPrefix(), false, record.isNamespaceAware(), record.getUnmarshaller());
                                 cp.addInto(objVal, container, session);
                             } else {
                                 // no descriptor, so manually build the XMLRoot
@@ -757,7 +757,7 @@
         Iterator<DatabaseMapping> mappings = parentDesc.getMappings().iterator();
         int mappingsInContext = 0;
         while (mappings.hasNext()) {
-            DatabaseMapping next = (DatabaseMapping) mappings.next();
+            DatabaseMapping next = mappings.next();
             if (!(next == this)) {
                 XMLField nextField = (XMLField) next.getField();
                 XPathFragment frag = getFragmentToCompare(nextField, field);
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 38d71a2..9efc297 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
@@ -335,7 +335,7 @@
                     return objectValue;
                 }
             } else if (next.getNodeType() == Node.ELEMENT_NODE) {
-                ClassDescriptor referenceDescriptor = null;
+                XMLDescriptor referenceDescriptor = null;
 
                 //In this case it must be an element so we need to dig up the descriptor
                 //make a nested record and build an object from it.
@@ -374,7 +374,7 @@
                     // wrap the object in an XMLRoot
                     // if we know the descriptor use it to wrap the Element in an XMLRoot (if necessary)
                     if (referenceDescriptor != null) {
-                        return ((XMLDescriptor) referenceDescriptor).wrapObjectInXMLRoot(objVal, next.getNamespaceURI(), next.getLocalName(), next.getPrefix(), false, record.isNamespaceAware(),record.getUnmarshaller());
+                        return referenceDescriptor.wrapObjectInXMLRoot(objVal, next.getNamespaceURI(), next.getLocalName(), next.getPrefix(), false, record.isNamespaceAware(),record.getUnmarshaller());
                     }
                     // no descriptor, so manually build the XMLRoot
                     return buildXMLRoot(next, objVal);
@@ -576,7 +576,7 @@
         Iterator<DatabaseMapping> mappings = parentDesc.getMappings().iterator();
         int mappingsInContext = 0;
         while (mappings.hasNext()) {
-            DatabaseMapping next = (DatabaseMapping) mappings.next();
+            DatabaseMapping next = mappings.next();
             if (!(next == this)) {
                 XMLField nextField = (XMLField) next.getField();
                 XPathFragment frag = getFragmentToCompare(nextField, field);
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 ac0e3fb..3d5429b 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
@@ -111,7 +111,7 @@
                     throw (RuntimeException) ex.getCause();
                 }
             }else{
-                return (XMLPlatform)PrivilegedAccessHelper.newInstanceFromClass(getXMLPlatformClass());
+                return PrivilegedAccessHelper.newInstanceFromClass(getXMLPlatformClass());
 
             }
         } catch (IllegalAccessException e) {
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 fa81b34..be9184d 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
@@ -976,7 +976,7 @@
             if (this.argumentTypeNames != null) {
                 Iterator<String> args = this.argumentTypeNames.iterator();
                 while (args.hasNext()) {
-                    String argumentTypeName = (String) args.next();
+                    String argumentTypeName = args.next();
                     this.argumentTypes.add(Helper.getObjectClass(ConversionManager.loadClass(argumentTypeName)));
                 }
             }
@@ -2022,8 +2022,8 @@
         List argumentFields = new ArrayList(arguments.size());
         int size = arguments.size();
         for (int index = 0; index < size; index++) {
-            DatabaseField argumentField = new DatabaseField((String) arguments.get(index));
-            argumentField.setType((Class) argumentTypes.get(index));
+            DatabaseField argumentField = new DatabaseField(arguments.get(index));
+            argumentField.setType(argumentTypes.get(index));
             argumentFields.add(argumentField);
         }
 
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 523d139..488dce7 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
@@ -181,7 +181,7 @@
             }
         }
         for (Iterator<DatabaseMapping> mappings = descriptor.getMappings().iterator(); mappings.hasNext();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappings.next();
+            DatabaseMapping mapping = mappings.next();
             FieldResult fieldResult = (FieldResult)this.getFieldResults().get(mapping.getAttributeName());
             if (fieldResult != null){
                 if (mapping.getFields().size() == 1 ) {
@@ -191,7 +191,7 @@
                 }
             } else {
                 for (Iterator<DatabaseField> fields = mapping.getFields().iterator(); fields.hasNext();) {
-                    DatabaseField field = (DatabaseField)fields.next();
+                    DatabaseField field = fields.next();
                     entityRecord.put(field, record.get(field));
                 }
             }
@@ -226,7 +226,7 @@
         /** This processes each FieldResult stored in the collection of FieldResults individually */
         Iterator<FieldResult> fieldResults = fieldResult.getFieldResults().iterator();
         while (fieldResults.hasNext()){
-            FieldResult tempFieldResult = ((FieldResult)fieldResults.next());
+            FieldResult tempFieldResult = fieldResults.next();
             DatabaseField dbfield = processValueFromRecordForMapping(currentDescriptor,tempFieldResult.getMultipleFieldIdentifiers(),1);
              if (mapping.isOneToOneMapping()){
                 dbfield = (((OneToOneMapping)mapping).getTargetToSourceKeyFields().get(dbfield));
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 9db41ac..7e2033b 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
@@ -1645,7 +1645,7 @@
 
         //Add attribute fields
         for(Iterator<Expression> it = getPartialAttributeExpressions().iterator(); it.hasNext();){
-            Expression expression = (Expression)it.next();
+            Expression expression = it.next();
             if (expression.isQueryKeyExpression()) {
                 expression.getBuilder().setSession(session.getRootSession(null));
                 expression.getBuilder().setQueryClass(getDescriptor().getJavaClass());
@@ -1683,7 +1683,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<DatabaseField> iterator = getDescriptor().getFields().iterator(); iterator.hasNext();) {
-            DatabaseField field = (DatabaseField)iterator.next();
+            DatabaseField field = iterator.next();
             if (localFields.contains(field)) {
                 selectionFields.add(field);
             } else {
@@ -1725,7 +1725,7 @@
         }
         // Add specified fields.
         for (Iterator<String> iterator = getExecutionFetchGroup().getAttributeNames().iterator(); iterator.hasNext();) {
-            String attribute = (String)iterator.next();
+            String attribute = iterator.next();
             DatabaseMapping mapping = getDescriptor().getObjectBuilder().getMappingForAttributeName(attribute);
             if (mapping == null) {
                 throw QueryException.fetchGroupAttributeNotMapped(attribute);
@@ -1760,7 +1760,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<DatabaseField> iterator = getDescriptor().getFields().iterator(); iterator.hasNext();) {
-            DatabaseField field = (DatabaseField)iterator.next();
+            DatabaseField field = iterator.next();
             if (fetchedFields.contains(field)) {
                 fields.add(field);
             }
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 5dd21e5..3ce49ff 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
@@ -302,7 +302,7 @@
         if (ClassConstants.ServerSession_Class.isAssignableFrom(getSession().getClass())) {
             Iterator<ConnectionPool> enumtr = ((ServerSession)getSession()).getConnectionPools().values().iterator();
             while (enumtr.hasNext()) {
-                ConnectionPool pool = (ConnectionPool)enumtr.next();
+                ConnectionPool pool = enumtr.next();
                 pool.shutDown();
                 pool.startUp();
             }
@@ -334,7 +334,7 @@
         Vector results = new Vector(map.getSize());
         Enumeration<CacheKey> objects = map.keys();
         while (objects.hasMoreElements()) {
-            results.add(((CacheKey)objects.nextElement()).getObject());
+            results.add(objects.nextElement().getObject());
         }
         return results;
     }
@@ -809,10 +809,10 @@
              filters.add(lineTokens.nextToken());
          }
          for (int i = 0; i < mappedClassNames.size(); i++) {
-             String className = (String)mappedClassNames.get(i);
-             String classNameLowerCase = ((String)mappedClassNames.get(i)).toLowerCase();
+             String className = mappedClassNames.get(i);
+             String classNameLowerCase = mappedClassNames.get(i).toLowerCase();
              for (int j = 0; j < filters.size(); j++) {
-                 String filterValue = (Helper.rightTrimString((String)filters.get(j)).trim()).toLowerCase();
+                 String filterValue = (Helper.rightTrimString(filters.get(j)).trim()).toLowerCase();
                  if (filterValue.indexOf('*') == 0) {
                      filterValue = filterValue.substring(1);
                  }
@@ -1080,7 +1080,7 @@
 
          CacheKey cacheKey;
          while (objects.hasMoreElements()) {
-             cacheKey = (CacheKey)objects.nextElement();
+             cacheKey = objects.nextElement();
              if(null != cacheKey && null != cacheKey.getKey() && null != cacheKey.getObject()) {
                  ((AbstractSession)session).log(SessionLog.INFO, SessionLog.SERVER, "jmx_mbean_runtime_services_print_cache_key_value",
                      cacheKey.getKey().toString(), cacheKey.getObject().toString());
@@ -1178,7 +1178,7 @@
          //use a table to eliminate duplicate classes. Ignore Aggregates
          Iterator<ClassDescriptor> descriptors = getSession().getProject().getDescriptors().values().iterator();
          while (descriptors.hasNext()) {
-             currentDescriptor = (ClassDescriptor)descriptors.next();
+             currentDescriptor = descriptors.next();
              if (!currentDescriptor.isAggregateDescriptor()) {
                  classesTable.put(currentDescriptor.getJavaClassName(), Boolean.TRUE);
              }
@@ -1413,7 +1413,7 @@
              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);
+                 mappedClassName = mappedClassNames.elementAt(index);
                  Map<String, String> data = buildLowlevelDetailsFor(mappedClassName);
                  final CompositeDataSupport support = new CompositeDataSupport(type, buildLowlevelDetailsFor(mappedClassName));
                  classSummaryDetails.add(ClassSummaryDetailBase.from(support));
@@ -1552,7 +1552,7 @@
 
              // 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);
+                 mappedClassName = mappedClassNames.elementAt(index);
                  String[] key = new String[] { mappedClassName };
                  rowData.put(key, buildDetailsFor(mappedClassName, rowData.getTabularType().getRowType()));
              }
@@ -1590,7 +1590,7 @@
 
              // 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);
+                 mappedClassName = mappedClassNames.elementAt(index);
                  String[] key = new String[] { mappedClassName };
                  rowData.put(key, buildDetailsFor(mappedClassName, rowData.getTabularType().getRowType()));
              }
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 ed6e87f..23a1cec 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
@@ -111,7 +111,7 @@
         AbstractSession session;
         Iterator<String> names = this.getSessionsByName().keySet().iterator();
         while (names.hasNext()) {
-            sessionName = (String)names.next();
+            sessionName = names.next();
             session = getSessionForName(sessionName);
             if (session.isServerSession()) {
                 ServerSession serverSession = (ServerSession)session;
@@ -156,7 +156,7 @@
         AbstractSession session;
         Iterator<String> names = this.getSessionsByName().keySet().iterator();
         while (names.hasNext()) {
-            sessionName = (String)names.next();
+            sessionName = names.next();
             session = getSessionForName(sessionName);
             historicalBroker.registerSession(sessionName, (AbstractSession)session.acquireHistoricalSession(clause));
         }
@@ -174,7 +174,7 @@
         RuntimeException exception = null;
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             try {
                 session.releaseJTSConnection();
             } catch (RuntimeException ex) {
@@ -247,7 +247,7 @@
     protected void basicBeginTransaction() throws DatabaseException {
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.beginTransaction();
         }
     }
@@ -263,14 +263,14 @@
         // Do one last check it make sure that all sessions are still connected.
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             if (!session.isConnected()) {
                 throw DatabaseException.databaseAccessorNotConnected();
             }
         }
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.commitTransaction();
         }
     }
@@ -284,7 +284,7 @@
         DatabaseException globalException = null;
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             try {
                 session.rollbackTransaction();
             } catch (DatabaseException exception) {
@@ -309,7 +309,7 @@
 
             Iterator<String> names = this.getSessionsByName().keySet().iterator();
             while (names.hasNext()) {
-                sessionName = (String)names.next();
+                sessionName = names.next();
                 ssession = getSessionForName(sessionName);
                 if (ssession instanceof org.eclipse.persistence.sessions.server.ClientSession) {
                     if (((ClientSession)ssession).getParent().getBroker().containsQuery(queryName)) {
@@ -380,7 +380,7 @@
     @Override
     public AsOfClause getAsOfClause() {
         for (Iterator<AbstractSession> enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
-            return ((AbstractSession)enumtr.next()).getAsOfClause();
+            return enumtr.next().getAsOfClause();
         }
         return null;
     }
@@ -662,7 +662,7 @@
     public boolean isClientSessionBroker() {
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             if (session.isClientSession()) {
                 return true;
             }
@@ -683,7 +683,7 @@
 
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             if (!session.isConnected()) {
                 return false;
             }
@@ -699,7 +699,7 @@
     public boolean isServerSessionBroker() {
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             if (session.isServerSession()) {
                 return true;
             }
@@ -853,8 +853,8 @@
             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();
+                ClassDescriptor descriptor = descriptors.next();
+                Class<?> descriptorClass = classes.next();
                 getSessionNamesByClass().put(descriptorClass, name);
                 if(this.shouldUseDescriptorAliases) {
                     String alias = descriptor.getAlias();
@@ -896,7 +896,7 @@
         RuntimeException exception = null;
         AbstractSession session;
         for (Iterator<AbstractSession> enumtr = getSessionsByName().values().iterator(); enumtr.hasNext();) {
-            session = (AbstractSession)enumtr.next();
+            session = enumtr.next();
             try {
                 session.release();
             } catch (RuntimeException ex) {
@@ -951,7 +951,7 @@
 
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.setIntegrityChecker(integrityChecker);
         }
     }
@@ -968,7 +968,7 @@
 
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.setSessionLog(log);
         }
     }
@@ -985,7 +985,7 @@
 
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.setLog(log);
         }
     }
@@ -1001,7 +1001,7 @@
 
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.setProfiler(profiler);
         }
     }
@@ -1034,7 +1034,7 @@
             super.setSynchronized(synched);
             Iterator<AbstractSession> itSessions = getSessionsByName().values().iterator();
             while(itSessions.hasNext()) {
-                ((AbstractSession)itSessions.next()).setSynchronized(synched);
+                itSessions.next().setSynchronized(synched);
             }
         }
     }
@@ -1049,14 +1049,14 @@
     public void writesCompleted() {
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             if (!session.isConnected()) {
                 throw DatabaseException.databaseAccessorNotConnected();
             }
         }
         for (Iterator<AbstractSession> sessionEnum = getSessionsByName().values().iterator();
              sessionEnum.hasNext();) {
-            AbstractSession session = (AbstractSession)sessionEnum.next();
+            AbstractSession session = sessionEnum.next();
             session.writesCompleted();
         }
     }
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 ef15d6c..b1733f5 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
@@ -346,7 +346,7 @@
             connectionsToExternalServices = new Hashtable(3);
 
             while (connections.hasMoreElements()) {
-                ((RemoteConnection)connections.nextElement()).close();
+                connections.nextElement().close();
             }
         }
     }
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 83cafbd..87cfe21 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
@@ -175,8 +175,8 @@
         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();
+            DatabaseField sourceField = sourceKeysEnum.nextElement();
+            DatabaseField targetField = targetKeysEnum.nextElement();
             method.addLine(mappingName + ".addTargetForeignKeyFieldName(\"" + targetField.getQualifiedName() + "\", \"" + sourceField.getQualifiedName() + "\");");
         }
     }
@@ -400,8 +400,8 @@
         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();
+            DatabaseField sourceField = sourceKeysEnum.nextElement();
+            DatabaseField referenceField = referenceKeysEnum.nextElement();
             method.addLine(mappingName + ".addReferenceKeyFieldName(\"" + referenceField.getQualifiedName() + "\", \"" + sourceField.getQualifiedName() + "\");");
         }
 
@@ -448,7 +448,7 @@
         }
         for (Iterator<FetchGroup> namedFetchGroupIter = namedFetchGroups.values().iterator();
              namedFetchGroupIter.hasNext();) {
-            FetchGroup namedFetchGroup = (FetchGroup)namedFetchGroupIter.next();
+            FetchGroup namedFetchGroup = namedFetchGroupIter.next();
             String fetchGroupIdentifier = namedFetchGroup.getName() + "FetchGroup";
             method.addLine("");
             method.addLine("//Named fetch group -- " + fetchGroupIdentifier);
@@ -715,16 +715,16 @@
         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();
+            DatabaseField sourceField = sourceKeysEnum.nextElement();
+            DatabaseField relationField = sourceRelationKeysEnum.nextElement();
             method.addLine(mappingName + ".addSourceRelationKeyFieldName(\"" + relationField.getQualifiedName() + "\", \"" + sourceField.getQualifiedName() + "\");");
         }
 
         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();
+            DatabaseField targetField = targetKeysEnum.nextElement();
+            DatabaseField relationField = targetRelationKeysEnum.nextElement();
             method.addLine(mappingName + ".addTargetRelationKeyFieldName(\"" + relationField.getQualifiedName() + "\", \"" + targetField.getQualifiedName() + "\");");
         }
 
@@ -824,8 +824,8 @@
         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();
+            DatabaseField sourceField = sourceKeysEnum.nextElement();
+            DatabaseField targetField = targetKeysEnum.nextElement();
             method.addLine(mappingName + ".addTargetForeignKeyFieldName(\"" + targetField.getQualifiedName() + "\", \"" + sourceField.getQualifiedName() + "\");");
         }
     }
@@ -833,7 +833,7 @@
     protected void addOneToOneMappingLines(NonreflectiveMethodDefinition method, String mappingName, OneToOneMapping mapping) {
         for (Iterator<DatabaseField> foreignKeysEnum = mapping.getSourceToTargetKeyFields().keySet().iterator();
              foreignKeysEnum.hasNext();) {
-            DatabaseField sourceField = (DatabaseField)foreignKeysEnum.next();
+            DatabaseField sourceField = foreignKeysEnum.next();
             DatabaseField targetField = mapping.getSourceToTargetKeyFields().get(sourceField);
             if (mapping.getForeignKeyFields().contains(sourceField)) {
                 method.addLine(mappingName + ".addForeignKeyFieldName(\"" + sourceField.getQualifiedName() + "\", \"" + targetField.getQualifiedName() + "\");");
@@ -1192,7 +1192,7 @@
 
             //joinedAttribute
             for (Iterator<Expression> joinedEnum = readQuery.getJoinedAttributeManager().getJoinedAttributeExpressions().iterator(); joinedEnum.hasNext();) {
-                Expression joinedExp = (Expression)joinedEnum.next();
+                Expression joinedExp = joinedEnum.next();
                 builderString = buildBuilderString(builderString, method, iteration, queryIdentifier);
                 buildExpressionString(builderString, method, queryIdentifier, joinedExp, ".addJoinedAttribute(");
             }
@@ -1301,7 +1301,7 @@
         // Query arguments.
         Iterator<String> argumentTypes = query.getArgumentTypeNames().iterator();
         for (Iterator<String> arguments = query.getArguments().iterator(); arguments.hasNext();) {
-            String argument = (String)arguments.next();
+            String argument = arguments.next();
             String argumentTypeName = argumentTypes.next();
             method.addLine(queryIdentifier + ".addArgument(\"" + argument + "\", " + argumentTypeName + ".class);");
         }
@@ -1385,7 +1385,7 @@
 
         Iterator<FieldTransformation> fieldTransformations = mapping.getFieldTransformations().iterator();
         while (fieldTransformations.hasNext()) {
-            FieldTransformation trans = (FieldTransformation)fieldTransformations.next();
+            FieldTransformation trans = fieldTransformations.next();
             String fieldName = trans.getFieldName();
             if (trans instanceof MethodBasedFieldTransformation) {
                 String methodName = ((MethodBasedFieldTransformation)trans).getMethodName();
@@ -1528,7 +1528,7 @@
             // Tables
             for (Enumeration<DatabaseTable> tablesEnum = descriptor.getTables().elements();
                  tablesEnum.hasMoreElements();) {
-                String tableName = ((DatabaseTable)tablesEnum.nextElement()).getQualifiedName();
+                String tableName = tablesEnum.nextElement().getQualifiedName();
                 method.addLine("descriptor.addTableName(\"" + tableName + "\");");
             }
 
@@ -1541,12 +1541,12 @@
             }
             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();
+                Map<DatabaseField, DatabaseField> keyMapping = multipleTablePrimaryKeysEnum.next();
+                Iterator<DatabaseField> keyMappingSourceFieldsEnum = keyMapping.keySet().iterator();
+                Iterator<DatabaseField> keyMappingTargetFieldsEnum = keyMapping.values().iterator();
                 while (keyMappingSourceFieldsEnum.hasNext()) {
-                    DatabaseField sourceField = (DatabaseField)keyMappingSourceFieldsEnum.next();
-                    DatabaseField targetField = (DatabaseField)keyMappingTargetFieldsEnum.next();
+                    DatabaseField sourceField = keyMappingSourceFieldsEnum.next();
+                    DatabaseField targetField = keyMappingTargetFieldsEnum.next();
                     if (descriptor.getMultipleTableForeignKeys().containsKey(sourceField.getTable())) {
                         method.addLine("descriptor.addForeignKeyFieldNameForMultipleTable(\"" + targetField.getQualifiedName() + "\", \"" + sourceField.getQualifiedName() + "\");");
                     }
@@ -1594,7 +1594,7 @@
             method.addLine("");
             method.addLine("// Query keys.");
             for (Iterator<QueryKey> queryKeysEnum = descriptor.getQueryKeys().values().iterator(); queryKeysEnum.hasNext();) {
-                addQueryKeyLines(method, (QueryKey)queryKeysEnum.next());
+                addQueryKeyLines(method, queryKeysEnum.next());
             }
         }
 
@@ -1768,7 +1768,7 @@
         Hashtable shortNames = new Hashtable();
         Iterator<ClassDescriptor> descriptors = project.getOrderedDescriptors().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
 
             // Singleton interface descriptors should not exist.
             if (!(descriptor.isDescriptorForInterface() && (descriptor.getInterfacePolicy().getImplementorDescriptor() != null))) {
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 989a3c9..7ccae74 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
@@ -476,7 +476,7 @@
 
         for (Iterator<Accessor> iterator = getConnectionsAvailable().iterator(); iterator.hasNext();) {
             try {
-                ((Accessor)iterator.next()).disconnect(getOwner());
+                iterator.next().disconnect(getOwner());
             } catch (DatabaseException exception) {
                 // Ignore.
             }
@@ -484,7 +484,7 @@
 
         for (Iterator<Accessor> iterator = getConnectionsUsed().iterator(); iterator.hasNext();) {
             try {
-                ((Accessor)iterator.next()).disconnect(getOwner());
+                iterator.next().disconnect(getOwner());
             } catch (DatabaseException exception) {
                 // Ignore.
             }
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 c4b83d5..7a8c0a8 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
@@ -825,7 +825,7 @@
             this.readConnectionPool.shutDown();
 
             for (Iterator<ConnectionPool> poolsEnum = getConnectionPools().values().iterator(); poolsEnum.hasNext();) {
-                ((ConnectionPool)poolsEnum.next()).shutDown();
+                poolsEnum.next().shutDown();
             }
         }
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/file/FileUtil.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/file/FileUtil.java
index 3694417..fdd5963 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/file/FileUtil.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/file/FileUtil.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.util.List;
 import java.util.Objects;
 import java.util.Vector;
 import java.util.jar.JarEntry;
@@ -74,10 +75,10 @@
             }
         }
 
-        Vector files = findFiles(inputPath, filteredExtensions);
+        List<File> files = findFiles(inputPath, filteredExtensions);
 
         for (int i = 0; i < files.size(); i++) {
-            File in = (File)files.elementAt(i);
+            File in = files.get(i);
 
             String outFilePath = in.getAbsolutePath().substring(inputPath.length());
             outFilePath = outputPath + File.separator + outFilePath;
@@ -137,10 +138,10 @@
         JarOutputStream jarOut = null;
         try {
             jarOut = new JarOutputStream(new FileOutputStream(jar), new Manifest());
-            Vector files = findFiles(jarDirectory, filtertedExtensions);
+            List<File> files = findFiles(jarDirectory, filtertedExtensions);
 
             for (int i = 0; i < files.size(); i++) {
-                File file = (File)files.elementAt(i);
+                File file = files.get(i);
 
                 String relativePathToDirectory = file.getAbsolutePath().substring(directory.getAbsolutePath().length() + 1);
                 String entryName = relativePathToDirectory.replace('\\', '/');
@@ -188,8 +189,8 @@
      *      If it's file path then return a single instance of File
      *      If it's directory path then return all instances of File contained in the directory and its sub directories
      */
-    public static Vector findFiles(String path, String[] filteredExtensions) {
-        Vector files = new Vector();
+    public static List<File> findFiles(String path, String[] filteredExtensions) {
+        List<File> files = new Vector<>();
 
         findFilesHelper(new File(path), filteredExtensions, files);
         return files;
@@ -199,7 +200,7 @@
      * INTERNAL: traverse the directory to find all files with filtered extensions.  The result is passed
      * around for each recursive call
      */
-    private static void findFilesHelper(File file, String[] filteredExtensions, Vector result) {
+    private static void findFilesHelper(File file, String[] filteredExtensions, List<File> result) {
         if (!file.exists()) {
             return;
         }
@@ -215,14 +216,14 @@
         } else {
             // add everything if no filtered extension
             if ((filteredExtensions == null) || (filteredExtensions.length == 0)) {
-                result.addElement(file);
+                result.add(file);
                 return;
             }
 
             // add only filtered extensions
             for (int i = 0; i < filteredExtensions.length; i++) {
                 if (file.getName().endsWith(filteredExtensions[i])) {
-                    result.addElement(file);
+                    result.add(file);
                     return;
                 }
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/PerformanceMonitor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/PerformanceMonitor.java
index d5aaa38..caf2e19 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/PerformanceMonitor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/PerformanceMonitor.java
@@ -48,8 +48,8 @@
      * The profiler can be registered with a session to log performance information on queries.
      */
     public PerformanceMonitor() {
-        this.operationTimings = new ConcurrentHashMap();
-        this.operationStartTimesByThread = new ConcurrentHashMap();
+        this.operationTimings = new ConcurrentHashMap<>();
+        this.operationStartTimesByThread = new ConcurrentHashMap<>();
         this.lastDumpTime = System.currentTimeMillis();
         this.dumpTime = 60000; // 1 minute
         this.profileWeight = SessionProfiler.ALL;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/PerformanceProfiler.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/PerformanceProfiler.java
index 1dc3bc3..7a23791 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/PerformanceProfiler.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/PerformanceProfiler.java
@@ -64,13 +64,13 @@
      */
     public PerformanceProfiler(boolean shouldLogProfile) {
         super();
-        this.profiles = new Vector();
+        this.profiles = new Vector<>();
         this.shouldLogProfile = shouldLogProfile;
         this.nestLevel = 0;
         this.profileTime = 0;
         this.nestTime = 0;
-        this.operationTimingsByThread = new Hashtable();
-        this.operationStartTimesByThread = new Hashtable();
+        this.operationTimingsByThread = new Hashtable<>();
+        this.operationStartTimesByThread = new Hashtable<>();
     }
 
     protected void addProfile(Profile profile) {
@@ -96,11 +96,10 @@
             summary.setLocalTime(summary.getLocalTime() + profile.getLocalTime());
             summary.setProfileTime(summary.getProfileTime() + profile.getProfileTime());
             summary.setNumberOfInstancesEffected(summary.getNumberOfInstancesEffected() + profile.getNumberOfInstancesEffected());
-            for (Enumeration operationNames = profile.getOperationTimings().keys();
-                     operationNames.hasMoreElements();) {
-                String name = (String)operationNames.nextElement();
-                Long oldTime = (Long)summary.getOperationTimings().get(name);
-                long profileTime = (Long) profile.getOperationTimings().get(name);
+            for (Map.Entry<String, Long> entry: profile.getOperationTimings().entrySet()) {
+                String name = entry.getKey();
+                Long oldTime = summary.getOperationTimings().get(name);
+                long profileTime = entry.getValue();
                 long newTime;
                 if (oldTime == null) {
                     newTime = profileTime;
@@ -118,16 +117,16 @@
      * INTERNAL:
      * Return a map of summary profiles reporting on the profile contained.
      */
-    public Hashtable buildProfileSummaryByClass() {
-        Hashtable summaries = new Hashtable();
+    public Hashtable<Class<?>, Profile> buildProfileSummaryByClass() {
+        Hashtable<Class<?>, Profile> summaries = new Hashtable<>();
 
         for (Profile profile : getProfiles()) {
-            Class domainClass = profile.getDomainClass();
+            Class<?> domainClass = profile.getDomainClass();
             if (domainClass == null) {
                 domainClass = Void.class;
             }
 
-            Profile summary = (Profile)summaries.get(domainClass);
+            Profile summary = summaries.get(domainClass);
             if (summary == null) {
                 summary = new Profile();
                 summary.setDomainClass(domainClass);
@@ -143,11 +142,10 @@
             summary.setLocalTime(summary.getLocalTime() + profile.getLocalTime());
             summary.setProfileTime(summary.getProfileTime() + profile.getProfileTime());
             summary.setNumberOfInstancesEffected(summary.getNumberOfInstancesEffected() + profile.getNumberOfInstancesEffected());
-            for (Enumeration operationNames = profile.getOperationTimings().keys();
-                     operationNames.hasMoreElements();) {
-                String name = (String)operationNames.nextElement();
-                Long oldTime = (Long)summary.getOperationTimings().get(name);
-                long profileTime = (Long) profile.getOperationTimings().get(name);
+            for (Map.Entry<String, Long> entry: profile.getOperationTimings().entrySet()) {
+                String name = entry.getKey();
+                Long oldTime = summary.getOperationTimings().get(name);
+                long profileTime = entry.getValue();
                 long newTime;
                 if (oldTime == null) {
                     newTime = profileTime;
@@ -165,16 +163,16 @@
      * INTERNAL:
      * Return a map of summary profiles reporting on the profile contained.
      */
-    public Hashtable buildProfileSummaryByQuery() {
-        Hashtable summaries = new Hashtable();
+    public Hashtable<Class<?>, Profile> buildProfileSummaryByQuery() {
+        Hashtable<Class<?>, Profile> summaries = new Hashtable<>();
 
         for (Profile profile : getProfiles()) {
-            Class queryType = profile.getQueryClass();
+            Class<?> queryType = profile.getQueryClass();
             if (queryType == null) {
                 queryType = Void.class;
             }
 
-            Profile summary = (Profile)summaries.get(queryType);
+            Profile summary = summaries.get(queryType);
             if (summary == null) {
                 summary = new Profile();
                 summary.setQueryClass(queryType);
@@ -184,11 +182,10 @@
             summary.setLocalTime(summary.getLocalTime() + profile.getLocalTime());
             summary.setProfileTime(summary.getProfileTime() + profile.getProfileTime());
             summary.setNumberOfInstancesEffected(summary.getNumberOfInstancesEffected() + profile.getNumberOfInstancesEffected());
-            for (Enumeration operationNames = profile.getOperationTimings().keys();
-                     operationNames.hasMoreElements();) {
-                String name = (String)operationNames.nextElement();
-                Long oldTime = (Long)summary.getOperationTimings().get(name);
-                long profileTime = (Long) profile.getOperationTimings().get(name);
+            for (Map.Entry<String, Long> entry: profile.getOperationTimings().entrySet()) {
+                String name = entry.getKey();
+                Long oldTime = summary.getOperationTimings().get(name);
+                long profileTime = entry.getValue();
                 long newTime;
                 if (oldTime == null) {
                     newTime = profileTime;
@@ -283,7 +280,7 @@
     protected Map<String, Long> getOperationStartTimes() {
         Integer threadId = Thread.currentThread().hashCode();
         if (getOperationStartTimesByThread().get(threadId) == null) {
-            getOperationStartTimesByThread().put(threadId, new Hashtable(10));
+            getOperationStartTimesByThread().put(threadId, new Hashtable<>(10));
         }
         return getOperationStartTimesByThread().get(threadId);
     }
@@ -295,7 +292,7 @@
     protected Map<String, Long> getOperationTimings() {
         Integer threadId = Thread.currentThread().hashCode();
         if (getOperationTimingsByThread().get(threadId) == null) {
-            getOperationTimingsByThread().put(threadId, new Hashtable(10));
+            getOperationTimingsByThread().put(threadId, new Hashtable<>(10));
         }
         return getOperationTimingsByThread().get(threadId);
     }
@@ -346,10 +343,10 @@
      * Log a profile summary by class.
      */
     public void logProfileSummaryByClass() {
-        Hashtable summaries = buildProfileSummaryByClass();
+        Hashtable<Class<?>, Profile> summaries = buildProfileSummaryByClass();
 
-        for (Enumeration classes = summaries.keys(); classes.hasMoreElements();) {
-            Class domainClass = (Class)classes.nextElement();
+        for (Enumeration<Class<?>> classes = summaries.keys(); classes.hasMoreElements();) {
+            Class<?> domainClass = classes.nextElement();
             Writer writer = getSession().getLog();
             try {
                 writer.write(summaries.get(domainClass).toString());
@@ -364,10 +361,10 @@
      * Log a profile summary by query.
      */
     public void logProfileSummaryByQuery() {
-        Hashtable summaries = buildProfileSummaryByQuery();
+        Hashtable<Class<?>, Profile> summaries = buildProfileSummaryByQuery();
 
-        for (Enumeration classes = summaries.keys(); classes.hasMoreElements();) {
-            Class queryType = (Class)classes.nextElement();
+        for (Enumeration<Class<?>> classes = summaries.keys(); classes.hasMoreElements();) {
+            Class<?> queryType = classes.nextElement();
             Writer writer = getSession().getLog();
             try {
                 writer.write(summaries.get(queryType).toString());
@@ -386,6 +383,7 @@
      * @return the execution result of the query.
      */
     @Override
+    @SuppressWarnings({"unchecked"})
     public Object profileExecutionOfQuery(DatabaseQuery query, Record row, AbstractSession session) {
         long profileStartTime = System.nanoTime();
         long nestedProfileStartTime = getProfileTime();
@@ -404,8 +402,8 @@
 
             setNestLevel(getNestLevel() + 1);
             long startNestTime = getNestTime();
-            Map<String, Long> timingsBeforeExecution = (Map<String, Long>)((Hashtable)getOperationTimings()).clone();
-            Map<String, Long> startTimingsBeforeExecution = (Map<String, Long>)((Hashtable)getOperationStartTimes()).clone();
+            Map<String, Long> timingsBeforeExecution = (Map<String, Long>)((Hashtable<String, Long>)getOperationTimings()).clone();
+            Map<String, Long> startTimingsBeforeExecution = (Map<String, Long>)((Hashtable<String, Long>)getOperationStartTimes()).clone();
             long startTime = System.nanoTime();
             try {
                 result = session.internalExecuteQuery(query, (AbstractRecord)row);
@@ -451,8 +449,8 @@
                 if (getNestLevel() == 0) {
                     setNestTime(0);
                     setProfileTime(0);
-                    setOperationTimings(new Hashtable());
-                    setOperationStartTimes(new Hashtable());
+                    setOperationTimings(new Hashtable<>());
+                    setOperationStartTimes(new Hashtable<>());
                     long profileEndTime = System.nanoTime();
                     long totalTimeIncludingProfiling = profileEndTime - profileStartTime;// Try to remove the profiling time from the total time.
                     profile.setProfileTime(totalTimeIncludingProfiling - profile.getTotalTime());
@@ -464,7 +462,7 @@
                     long totalTimeIncludingProfiling = profileEndTime - profileStartTime;// Try to remove the profiling time from the total time.
                     setProfileTime(getProfileTime() + (totalTimeIncludingProfiling - (endTime - startTime)));
                     profile.setProfileTime(totalTimeIncludingProfiling - profile.getTotalTime());
-                    for (String timingName : ((Map<String, Long>)(((Hashtable)startTimingsBeforeExecution).clone())).keySet()) {
+                    for (String timingName : ((Map<String, Long>)(((Hashtable<String, Long>)startTimingsBeforeExecution).clone())).keySet()) {
                         startTimingsBeforeExecution.put(timingName, ((Number) startTimingsBeforeExecution.get(timingName)).longValue() + totalTimeIncludingProfiling);
                     }
                 }
@@ -487,7 +485,7 @@
         getOperationStartTimesByThread().put(threadId, operationStartTimes);
     }
 
-    protected void setOperationStartTimesByThread(Hashtable operationStartTimesByThread) {
+    protected void setOperationStartTimesByThread(Map<Integer, Map<String, Long>> operationStartTimesByThread) {
         this.operationStartTimesByThread = operationStartTimesByThread;
     }
 
@@ -496,11 +494,11 @@
         getOperationTimingsByThread().put(threadId, operationTimings);
     }
 
-    protected void setOperationTimingsByThread(Hashtable operationTimingsByThread) {
+    protected void setOperationTimingsByThread(Map<Integer, Map<String, Long>> operationTimingsByThread) {
         this.operationTimingsByThread = operationTimingsByThread;
     }
 
-    protected void setProfiles(Vector profiles) {
+    protected void setProfiles(Vector<Profile> profiles) {
         this.profiles = profiles;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/Profile.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/Profile.java
index 77ec18a..0c01cbb 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/Profile.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/Profile.java
@@ -26,10 +26,10 @@
  * @author James Sutherland
  */
 public class Profile implements Serializable, Cloneable {
-    protected Class queryClass;
-    protected Class domainClass;
+    protected Class<?> queryClass;
+    protected Class<?> domainClass;
     protected long numberOfInstancesEffected;
-    protected Hashtable operationTimings;
+    protected Map<String, Long> operationTimings;
     protected long localTime;
     protected long profileTime;
     protected long totalTime;
@@ -38,7 +38,7 @@
 
     public Profile() {
         this.numberOfInstancesEffected = 0;
-        this.operationTimings = new Hashtable();
+        this.operationTimings = new Hashtable<>();
         this.totalTime = 0;
         this.localTime = 0;
         this.longestTime = 0;
@@ -61,7 +61,7 @@
         return null;
     }
 
-    public Class getDomainClass() {
+    public Class<?> getDomainClass() {
         return domainClass;
     }
 
@@ -84,7 +84,7 @@
         return (getNumberOfInstancesEffected() * 1000) / getTotalTime();
     }
 
-    public Hashtable getOperationTimings() {
+    public Map<String, Long> getOperationTimings() {
         return operationTimings;
     }
 
@@ -92,7 +92,7 @@
         return profileTime;
     }
 
-    public Class getQueryClass() {
+    public Class<?> getQueryClass() {
         return queryClass;
     }
 
@@ -111,7 +111,7 @@
         return totalTime;
     }
 
-    public void setDomainClass(Class domainClass) {
+    public void setDomainClass(Class<?> domainClass) {
         this.domainClass = domainClass;
     }
 
@@ -127,7 +127,7 @@
         this.numberOfInstancesEffected = numberOfInstancesEffected;
     }
 
-    public void setOperationTimings(Hashtable operationTimings) {
+    public void setOperationTimings(Map<String, Long> operationTimings) {
         this.operationTimings = operationTimings;
     }
 
@@ -135,7 +135,7 @@
         this.profileTime = profileTime;
     }
 
-    public void setQueryClass(Class queryClass) {
+    public void setQueryClass(Class<?> queryClass) {
         this.queryClass = queryClass;
     }
 
@@ -182,10 +182,9 @@
                 writer.write("\t" + ToStringLocalization.buildMessage("profiling_time", null) + "=" + getProfileTime() + "," + cr);
             }
 
-            for (Enumeration operationNames = getOperationTimings().keys();
-                     operationNames.hasMoreElements();) {
-                String operationName = (String)operationNames.nextElement();
-                long operationTime = (Long) getOperationTimings().get(operationName);
+            for (Map.Entry<String, Long> entry: getOperationTimings().entrySet()) {
+                String operationName = entry.getKey();
+                long operationTime = entry.getValue();
 
                 if (operationTime != 0) {
                     profiler.writeNestingTabs(writer);
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 6450df5..1ed55a8 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
@@ -151,9 +151,9 @@
             this.databasePlatform = (DatabasePlatform)project.getDatasourceLogin().getDatasourcePlatform();
             this.generateFKConstraints = this.databasePlatform.supportsForeignKeyConstraints();
         }
-        this.tableMap = new LinkedHashMap();
-        this.fieldMap = new LinkedHashMap();
-        this.databaseFields = new LinkedHashMap();
+        this.tableMap = new LinkedHashMap<>();
+        this.fieldMap = new LinkedHashMap<>();
+        this.databaseFields = new LinkedHashMap<>();
     }
 
     /**
@@ -234,7 +234,7 @@
             }
             DatabaseMetaData dbMetaData = conn.getMetaData();
             ResultSet resultSet = dbMetaData.getTables(null, dbMetaData.getUserName(), null, new String[] { "TABLE" });
-            List tablesInDatabase = new ArrayList();
+            List<String> tablesInDatabase = new ArrayList<>();
 
             while (resultSet.next()) {
                 //save all tables from the database
@@ -243,12 +243,12 @@
 
             resultSet.close();
 
-            List existedTables = new ArrayList();
-            List existedTableNames = new ArrayList();
+            List<TableDefinition> existedTables = new ArrayList<>();
+            List<String> existedTableNames = new ArrayList<>();
             Iterator<TableDefinition> tblDefIter = tblCreator.getTableDefinitions().iterator();
 
             while (tblDefIter.hasNext()) {
-                TableDefinition tblDef = (TableDefinition) tblDefIter.next();
+                TableDefinition tblDef = tblDefIter.next();
 
                 //check if the to-be-created table is already in the database
                 if (tablesInDatabase.contains(tblDef.getFullName())) {
@@ -448,8 +448,8 @@
 
         DatabaseField fkField = null;
         DatabaseField targetField = null;
-        List<String> fkFieldNames = new ArrayList();
-        List<String> targetFieldNames = new ArrayList();
+        List<String> fkFieldNames = new ArrayList<>();
+        List<String> targetFieldNames = new ArrayList<>();
 
         for (int index = 0; index < fkFields.size(); index++) {
             fkField = fkFields.get(index);
@@ -484,8 +484,8 @@
 
         DatabaseField dbField = null;
         DatabaseField targetField = null;
-        List<String> fkFieldNames = new ArrayList();
-        List<String> targetFieldNames = new ArrayList();
+        List<String> fkFieldNames = new ArrayList<>();
+        List<String> targetFieldNames = new ArrayList<>();
         List<DatabaseField> fkFields = mapping.getReferenceKeyFields();
         List<DatabaseField> targetFields = mapping.getSourceKeyFields();
         for (int index = 0; index < fkFields.size(); index++) {
@@ -558,7 +558,7 @@
     protected void resetTransformedFieldType(TransformationMapping mapping) {
         Iterator<FieldTransformation> transIter = mapping.getFieldTransformations().iterator();
         while (transIter.hasNext()) {
-            FieldTransformation transformation = (FieldTransformation) transIter.next();
+            FieldTransformation transformation = transIter.next();
 
             if (transformation instanceof MethodBasedFieldTransformation) {
                 MethodBasedFieldTransformation methodTransformation = (MethodBasedFieldTransformation) transformation;
@@ -605,7 +605,7 @@
 
         Iterator<DatabaseField> aggregateFieldIterator = mapping.getReferenceDescriptor().getFields().iterator();
         while (aggregateFieldIterator.hasNext()) {
-            DatabaseField dbField = (DatabaseField) aggregateFieldIterator.next();
+            DatabaseField dbField = aggregateFieldIterator.next();
             //add the target definition to the table definition
             FieldDefinition fieldDef = getFieldDefFromDBField(dbField);
             if (!targetTable.getFields().contains(fieldDef)) {
@@ -615,8 +615,8 @@
 
         //unlike normal one-to-many mapping, aggregate collection mapping does not have 1:1 back reference
         //mapping, so the target foreign key fields are not stored in the target descriptor.
-        List<String> fkFieldNames = new ArrayList();
-        List<String> targetFieldNames = new ArrayList();
+        List<String> fkFieldNames = new ArrayList<>();
+        List<String> targetFieldNames = new ArrayList<>();
         List<DatabaseField> fkFields = mapping.getTargetForeignKeyFields();
         List<DatabaseField> targetFields = mapping.getSourceKeyFields();
         DatabaseField targetField = null;
@@ -876,7 +876,7 @@
         DatabaseTable databaseTable = null;
         Iterator<DatabaseTable> dbTblIter = descriptor.getTables().iterator();
         while (dbTblIter.hasNext()) {
-            databaseTable = (DatabaseTable) dbTblIter.next();
+            databaseTable = dbTblIter.next();
             Map<DatabaseField, DatabaseField> srcFields = descriptor.getAdditionalTablePrimaryKeyFields().get(databaseTable);
             if ((null != srcFields) && srcFields.size() > 0) {
                 // srcFields is from the secondary field to the primary key field
@@ -902,8 +902,8 @@
 
         DatabaseField fkField = null;
         DatabaseField targetField = null;
-        List<String> fkFieldNames = new ArrayList();
-        List<String> targetFieldNames = new ArrayList();
+        List<String> fkFieldNames = new ArrayList<>();
+        List<String> targetFieldNames = new ArrayList<>();
 
         DatabaseTable sourceTable = fkFields.get(0).getTable();
         TableDefinition sourceTableDef = getTableDefFromDBTable(sourceTable);
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 5a44d1a..09443f3 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
@@ -38,8 +38,8 @@
 
     public ForeignKeyConstraint() {
         this.name = "";
-        this.sourceFields = new ArrayList();
-        this.targetFields = new ArrayList();
+        this.sourceFields = new ArrayList<>();
+        this.targetFields = new ArrayList<>();
         this.targetTable = "";
         this.shouldCascadeOnDelete = false;
     }
@@ -71,7 +71,7 @@
             } else {
                 writer.write("FOREIGN KEY (");
                 for (Iterator<String> iterator = getSourceFields().iterator(); iterator.hasNext();) {
-                    writer.write((String)iterator.next());
+                    writer.write(iterator.next());
                     if (iterator.hasNext()) {
                         writer.write(", ");
                     }
@@ -80,7 +80,7 @@
                 writer.write(getTargetTable());
                 writer.write(" (");
                 for (Iterator<String> iterator = getTargetFields().iterator(); iterator.hasNext();) {
-                    writer.write((String)iterator.next());
+                    writer.write(iterator.next());
                     if (iterator.hasNext()) {
                         writer.write(", ");
                     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/IndexDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/IndexDefinition.java
index b32afcf..df564c3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/IndexDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/IndexDefinition.java
@@ -32,7 +32,7 @@
     protected boolean isUnique;
 
     public IndexDefinition() {
-        this.fields = new ArrayList();
+        this.fields = new ArrayList<>();
     }
 
     public boolean isUnique() {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/PackageDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/PackageDefinition.java
index 921a3a4..abe2e6c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/PackageDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/PackageDefinition.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,26 +26,26 @@
  * </p>
  */
 public class PackageDefinition extends DatabaseObjectDefinition {
-    protected Vector statements;
-    protected Vector procedures;
+    protected List<String> statements;
+    protected List<StoredProcedureDefinition> procedures;
 
     public PackageDefinition() {
-        this.statements = new Vector();
-        this.procedures = new Vector();
+        this.statements = new Vector<>();
+        this.procedures = new Vector<>();
     }
 
     /**
      * Packages can contain sets of procedures.
      */
     public void addProcedures(StoredProcedureDefinition procedure) {
-        getProcedures().addElement(procedure);
+        getProcedures().add(procedure);
     }
 
     /**
      * The statements are the SQL lines of code.
      */
     public void addStatement(String statement) {
-        getStatements().addElement(statement);
+        getStatements().add(statement);
     }
 
     /**
@@ -59,16 +59,14 @@
             writer.write("CREATE PACKAGE " + getFullName());
             writer.write(" AS");
             writer.write("\n");
-            for (Enumeration statementsEnum = getStatements().elements();
-                     statementsEnum.hasMoreElements();) {
-                writer.write((String)statementsEnum.nextElement());
+            for (String statement: statements) {
+                writer.write(statement);
                 writer.write(platform.getBatchDelimiterString());
                 writer.write("\n");
             }
-            for (Enumeration proceduresEnum = getProcedures().elements();
-                     proceduresEnum.hasMoreElements();) {
+            for (StoredProcedureDefinition procedure: procedures) {
                 writer.write("\n");
-                String procedureString = ((StoredProcedureDefinition)proceduresEnum.nextElement()).buildCreationWriter(session, writer).toString();
+                String procedureString = procedure.buildCreationWriter(session, writer).toString();
                 writer.write(procedureString.substring(7, procedureString.length()));
                 writer.write("\n");
             }
@@ -97,28 +95,28 @@
     /**
      * Packages can contain sets of procedures.
      */
-    public Vector getProcedures() {
+    public List<StoredProcedureDefinition> getProcedures() {
         return procedures;
     }
 
     /**
      * The statements are the SQL lines of code.
      */
-    public Vector getStatements() {
+    public List<String> getStatements() {
         return statements;
     }
 
     /**
      * Packages can contain sets of procedures.
      */
-    public void setProcedures(Vector procedures) {
+    public void setProcedures(List<StoredProcedureDefinition> procedures) {
         this.procedures = procedures;
     }
 
     /**
      * The statements are the SQL lines of code.
      */
-    public void setStatements(Vector statements) {
+    public void setStatements(List<String> statements) {
         this.statements = statements;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/PopulationManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/PopulationManager.java
index 435f3bb..c8abc1f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/PopulationManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/PopulationManager.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -33,20 +33,20 @@
 public class PopulationManager {
 
     /** Store the objects registered. */
-    protected Hashtable registeredObjects;
+    protected Map<Class, Map<String, Object>> registeredObjects;
 
     /** Store the default instance. */
     protected static PopulationManager defaultManager;
 
     public PopulationManager() {
-        registeredObjects = new Hashtable();
+        registeredObjects = new Hashtable<>();
     }
 
     /**
      * Add all of the objects of the class and all of its subclasses.
      * The session is needed because there is no other way to find all subclasses.
      */
-    public void addAllObjectsForAbstractClass(Class objectsClass, AbstractSession session, Vector allObjects) {
+    public void addAllObjectsForAbstractClass(Class objectsClass, AbstractSession session, Vector<Object> allObjects) {
         ClassDescriptor descriptor = session.getDescriptor(objectsClass);
         addAllObjectsForClass(objectsClass, allObjects);
         for (ClassDescriptor child : descriptor.getInheritancePolicy().getChildDescriptors()) {
@@ -58,19 +58,19 @@
      * Add all of the objects of the class and all of its subclasses.
      * The session is needed because there is no other way to find all subclasses.
      */
-    public void addAllObjectsForAbstractClass(Class objectsClass, org.eclipse.persistence.sessions.Session session, Vector allObjects) {
+    public void addAllObjectsForAbstractClass(Class objectsClass, org.eclipse.persistence.sessions.Session session, Vector<Object> allObjects) {
         addAllObjectsForAbstractClass(objectsClass, (AbstractSession)session, allObjects);
     }
 
     /**
      * Add all of the objects of the class.
      */
-    public void addAllObjectsForClass(Class objectsClass, List allObjects) {
+    public void addAllObjectsForClass(Class objectsClass, List<Object> allObjects) {
         if (!getRegisteredObjects().containsKey(objectsClass)) {
             return;
         }
 
-        for (Object object : ((Map)getRegisteredObjects().get(objectsClass)).values()) {
+        for (Object object : getRegisteredObjects().get(objectsClass).values()) {
             allObjects.add(object);
         }
     }
@@ -79,7 +79,7 @@
      * Check if the object is registered given its name.
      */
     public boolean containsObject(Class objectsClass, String objectsName) {
-        return ((getRegisteredObjects().containsKey(objectsClass)) && (((Hashtable)getRegisteredObjects().get(objectsClass)).containsKey(objectsName)));
+        return ((getRegisteredObjects().containsKey(objectsClass)) && (getRegisteredObjects().get(objectsClass).containsKey(objectsName)));
     }
 
     /**
@@ -92,25 +92,18 @@
     /**
      * Return all of the objects registered.
      */
-    public Vector getAllClasses() {
-        Vector allClasses = new Vector();
-
-        for (Enumeration e = getRegisteredObjects().keys(); e.hasMoreElements();) {
-            allClasses.addElement(e.nextElement());
-        }
-
+    public List<Class> getAllClasses() {
+        Vector<Class> allClasses = new Vector<>();
+        allClasses.addAll(getRegisteredObjects().keySet());
         return allClasses;
     }
 
     /**
      * Return all of the objects registered.
      */
-    public Vector getAllObjects() {
-        Vector allObjects;
-
-        allObjects = new Vector();
-        for (Enumeration e = getAllClasses().elements(); e.hasMoreElements();) {
-            Class eachClass = (Class)e.nextElement();
+    public Vector<Object> getAllObjects() {
+        Vector<Object> allObjects = new Vector<> ();
+        for (Class eachClass : getAllClasses()) {
             addAllObjectsForClass(eachClass, allObjects);
         }
 
@@ -120,10 +113,8 @@
     /**
      * Return all of the objects of the class and all of its subclasses.
      */
-    public Vector getAllObjectsForAbstractClass(Class objectsClass) {
-        Vector allObjects;
-
-        allObjects = new Vector();
+    public List<Object> getAllObjectsForAbstractClass(Class objectsClass) {
+        List<Object> allObjects = new Vector<>();
         // hummm, how can this be done....
         return allObjects;
     }
@@ -132,9 +123,9 @@
      * Return all of the objects of the class and all of its subclasses.
      * The session is needed because there is no other way to find all subclasses.
      */
-    public Vector getAllObjectsForAbstractClass(Class objectsClass, AbstractSession session) {
+    public List<Object> getAllObjectsForAbstractClass(Class objectsClass, AbstractSession session) {
         ClassDescriptor descriptor = session.getDescriptor(objectsClass);
-        Vector allObjects = new Vector();
+        List<Object> allObjects = new Vector<>();
         addAllObjectsForClass(objectsClass, allObjects);
         if (descriptor.hasInheritance()) {
             for (ClassDescriptor child : descriptor.getInheritancePolicy().getChildDescriptors()) {
@@ -148,10 +139,8 @@
     /**
      * Return all of the objects of the class.
      */
-    public Vector getAllObjectsForClass(Class objectsClass) {
-        Vector allObjects;
-
-        allObjects = new Vector();
+    public Vector<Object> getAllObjectsForClass(Class objectsClass) {
+        Vector<Object> allObjects = new Vector<>();
         addAllObjectsForClass(objectsClass, allObjects);
 
         return allObjects;
@@ -175,13 +164,13 @@
             return null;
         }
 
-        return ((Hashtable)getRegisteredObjects().get(objectsClass)).get(objectsName);
+        return getRegisteredObjects().get(objectsClass).get(objectsName);
     }
 
     /**
      * Return the registered objects.
      */
-    public Hashtable getRegisteredObjects() {
+    public Map<Class, Map<String, Object>> getRegisteredObjects() {
         return registeredObjects;
     }
 
@@ -191,9 +180,9 @@
      */
     public Object registerObject(Class javaClass, Object objectToRegister, String objectsName) {
         if (!(getRegisteredObjects().containsKey(javaClass))) {
-            getRegisteredObjects().put(javaClass, new Hashtable());
+            getRegisteredObjects().put(javaClass, new Hashtable<>());
         }
-        ((Hashtable)getRegisteredObjects().get(javaClass)).put(objectsName, objectToRegister);
+        getRegisteredObjects().get(javaClass).put(objectsName, objectToRegister);
 
         return objectToRegister;
     }
@@ -204,9 +193,9 @@
      */
     public Object registerObject(Object objectToRegister, String objectsName) {
         if (!(getRegisteredObjects().containsKey(objectToRegister.getClass()))) {
-            getRegisteredObjects().put(objectToRegister.getClass(), new Hashtable());
+            getRegisteredObjects().put(objectToRegister.getClass(), new Hashtable<>());
         }
-        ((Hashtable)getRegisteredObjects().get(objectToRegister.getClass())).put(objectsName, objectToRegister);
+        getRegisteredObjects().get(objectToRegister.getClass()).put(objectsName, objectToRegister);
 
         return objectToRegister;
     }
@@ -216,7 +205,7 @@
      */
     public void removeObject(Class classToRemove, String objectsName) {
         if (getRegisteredObjects().containsKey(classToRemove)) {
-            ((Hashtable)getRegisteredObjects().get(classToRemove)).remove(objectsName);
+            getRegisteredObjects().get(classToRemove).remove(objectsName);
         }
     }
 
@@ -246,7 +235,7 @@
     /**
      * Set the registered objects.
      */
-    public void setRegisteredObjects(Hashtable registeredObjects) {
+    public void setRegisteredObjects(Map<Class, Map<String, Object>> registeredObjects) {
         this.registeredObjects = registeredObjects;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/SchemaManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/SchemaManager.java
index 0118de9..839b1a6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/SchemaManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/SchemaManager.java
@@ -314,7 +314,7 @@
      *        false if it should be dropped.
      * @param replace - true if table definitions and sequence definitions should be replaced.
      */
-    protected void processSequenceDefinition(SequenceDefinition definition, final boolean createTables, final boolean createSequences, final boolean replace, HashSet<String> createdTableNames, HashSet<String> droppedTableNames) throws EclipseLinkException {
+    protected void processSequenceDefinition(SequenceDefinition definition, final boolean createTables, final boolean createSequences, final boolean replace, Set<String> createdTableNames, Set<String> droppedTableNames) throws EclipseLinkException {
         try {
             // Handle the table definitions first.
             if (definition.isTableSequenceDefinition()) {
@@ -403,14 +403,14 @@
         // Not required on Sybase native etc.
         if (sequencing != null && sequencing.whenShouldAcquireValueForAll() != Sequencing.AFTER_INSERT) {
             // Build the sequence definitions.
-            HashSet<SequenceDefinition> sequenceDefinitions = buildSequenceDefinitions();
+            Set<SequenceDefinition> sequenceDefinitions = buildSequenceDefinitions();
 
             // Now process the sequence definitions.
             // CR 3870467, do not log stack
             boolean shouldLogExceptionStackTrace = session.getSessionLog().shouldLogExceptionStackTrace();
             session.getSessionLog().setShouldLogExceptionStackTrace(false);
-            HashSet<String> createdSequenceTableNames = new HashSet();
-            HashSet<String> droppedSequenceTableNames = new HashSet();
+            Set<String> createdSequenceTableNames = new HashSet<>();
+            Set<String> droppedSequenceTableNames = new HashSet<>();
 
             for (SequenceDefinition sequenceDefinition : sequenceDefinitions) {
                 processSequenceDefinition(sequenceDefinition, createSequenceTables, createSequences, replaceSequences, createdSequenceTableNames, droppedSequenceTableNames);
@@ -425,10 +425,10 @@
      * INTERNAL:
      * Build the sequence definitions.
      */
-    protected HashSet<SequenceDefinition> buildSequenceDefinitions() {
+    protected Set<SequenceDefinition> buildSequenceDefinitions() {
         // Remember the processed - to handle each sequence just once.
-        HashSet processedSequenceNames = new HashSet();
-        HashSet<SequenceDefinition> sequenceDefinitions = new HashSet<>();
+        Set<String> processedSequenceNames = new HashSet<>();
+        Set<SequenceDefinition> sequenceDefinitions = new HashSet<>();
 
         for (ClassDescriptor descriptor : getSession().getDescriptors().values()) {
             if (descriptor.usesSequenceNumbers()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredFunctionDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredFunctionDefinition.java
index 08dbc5d..a2bab71 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredFunctionDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredFunctionDefinition.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
@@ -87,7 +87,7 @@
      * Prints return for stored function
      */
     public void setReturnType(Class type) {
-        FieldDefinition argument = (FieldDefinition)getArguments().firstElement();
+        FieldDefinition argument = getArguments().get(0);
         argument.setType(type);
     }
 
@@ -98,7 +98,7 @@
     protected void printReturn(Writer writer, AbstractSession session) throws ValidationException {
         try {
             session.getPlatform().printStoredFunctionReturnKeyWord(writer);
-            FieldDefinition argument = (FieldDefinition)getArguments().firstElement();
+            FieldDefinition argument = getArguments().get(0);
 
             // argumentType should be OUT: getArgumentTypes().firstElement() == OUT;
             // but should be printed as IN
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredProcedureDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredProcedureDefinition.java
index a81b4b4..95ce7f6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredProcedureDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/StoredProcedureDefinition.java
@@ -19,6 +19,7 @@
 import java.io.IOException;
 import java.io.Writer;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.Vector;
 
 import org.eclipse.persistence.exceptions.ValidationException;
@@ -30,19 +31,19 @@
  * <b>Purpose</b>: Allow a semi-generic way of creating stored procedures.
  */
 public class StoredProcedureDefinition extends DatabaseObjectDefinition {
-    protected Vector variables;
-    protected Vector statements;
-    protected Vector arguments;
-    protected Vector argumentTypes;
+    protected List<FieldDefinition> variables;
+    protected List<String> statements;
+    protected List<FieldDefinition> arguments;
+    protected List<Integer> argumentTypes;
     protected static final Integer IN = 1;
     protected static final Integer OUT = 2;
     protected static final Integer INOUT = 3;
 
     public StoredProcedureDefinition() {
-        this.statements = new Vector();
-        this.variables = new Vector();
-        this.arguments = new Vector();
-        this.argumentTypes = new Vector();
+        this.statements = new Vector<>();
+        this.variables = new Vector<>();
+        this.arguments = new Vector<>();
+        this.argumentTypes = new Vector<>();
     }
 
     /**
@@ -70,8 +71,8 @@
      * The arguments are the names of the parameters to the procedure.
      */
     public void addArgument(FieldDefinition argument) {
-        getArguments().addElement(argument);
-        getArgumentTypes().addElement(IN);
+        getArguments().add(argument);
+        getArgumentTypes().add(IN);
     }
 
     /**
@@ -85,8 +86,8 @@
      * The output arguments are used to get values back from the proc, such as cursors.
      */
     public void addInOutputArgument(FieldDefinition argument) {
-        getArguments().addElement(argument);
-        getArgumentTypes().addElement(INOUT);
+        getArguments().add(argument);
+        getArgumentTypes().add(INOUT);
     }
 
     /**
@@ -114,15 +115,15 @@
      * The output arguments are used to get values back from the proc, such as cursors.
      */
     public void addOutputArgument(FieldDefinition argument) {
-        getArguments().addElement(argument);
-        getArgumentTypes().addElement(OUT);
+        getArguments().add(argument);
+        getArgumentTypes().add(OUT);
     }
 
     /**
      * The statements are the SQL lines of code in procedure.
      */
     public void addStatement(String statement) {
-        getStatements().addElement(statement);
+        getStatements().add(statement);
     }
 
     /**
@@ -136,7 +137,7 @@
      * The variables are the names of the declared variables used in the procedure.
      */
     public void addVariable(FieldDefinition variable) {
-        getVariables().addElement(variable);
+        getVariables().add(variable);
     }
 
     /**
@@ -153,8 +154,8 @@
             writer.write("\n");
             for (int i = getFirstArgumentIndex(); i < getArguments().size(); i++) {
                 writer.write("\t");
-                FieldDefinition argument = (FieldDefinition)getArguments().elementAt(i);
-                Integer argumentType = (Integer)getArgumentTypes().elementAt(i);
+                FieldDefinition argument = getArguments().get(i);
+                Integer argumentType = getArgumentTypes().get(i);
                 if (argumentType == IN) {
                     printArgument(argument, writer, session);
                 } else if (argumentType == OUT) {
@@ -186,9 +187,7 @@
                 writer.write("DECLARE\n");
             }
 
-            for (Enumeration variablesEnum = getVariables().elements();
-                     variablesEnum.hasMoreElements();) {
-                FieldDefinition field = (FieldDefinition)variablesEnum.nextElement();
+            for (FieldDefinition field: getVariables()) {
                 writer.write("\t");
                 writer.write(field.getName());
                 writer.write(" ");
@@ -202,9 +201,8 @@
                 writer.write("\n");
             }
 
-            for (Enumeration statementsEnum = getStatements().elements();
-                     statementsEnum.hasMoreElements();) {
-                writer.write((String)statementsEnum.nextElement());
+            for (String statement: getStatements()) {
+                writer.write(statement);
                 writer.write(platform.getBatchDelimiterString());
                 writer.write("\n");
             }
@@ -231,7 +229,7 @@
     /**
      * The arguments are the names of the parameters to the procedure.
      */
-    public Vector getArguments() {
+    public List<FieldDefinition> getArguments() {
         return arguments;
     }
 
@@ -259,21 +257,21 @@
     /**
          *
          */
-    public Vector getArgumentTypes() {
+    public List<Integer> getArgumentTypes() {
         return argumentTypes;
     }
 
     /**
      * The statements are the SQL lines of code in procedure.
      */
-    public Vector getStatements() {
+    public List<String> getStatements() {
         return statements;
     }
 
     /**
      * The variables are the names of the declared variables used in the procedure.
      */
-    public Vector getVariables() {
+    public List<FieldDefinition> getVariables() {
         return variables;
     }
 
@@ -438,21 +436,21 @@
     /**
      * The arguments are the field defs of the parameters names and types to the procedure.
      */
-    public void setArguments(Vector arguments) {
+    public void setArguments(List<FieldDefinition> arguments) {
         this.arguments = arguments;
     }
 
     /**
      * The statements are the SQL lines of code in procedure.
      */
-    public void setStatements(Vector statements) {
+    public void setStatements(List<String> statements) {
         this.statements = statements;
     }
 
     /**
      * The variables are the field defs of the declared variables used in the procedure.
      */
-    public void setVariables(Vector variables) {
+    public void setVariables(List<FieldDefinition> variables) {
         this.variables = variables;
     }
 }
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 81969ae..fe13329 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
@@ -32,6 +32,7 @@
 import org.eclipse.persistence.internal.expressions.ParameterExpression;
 import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.helper.Helper;
+import org.eclipse.persistence.internal.oxm.mappings.Field;
 import org.eclipse.persistence.internal.queries.CallQueryMechanism;
 import org.eclipse.persistence.internal.sessions.AbstractRecord;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
@@ -154,11 +155,11 @@
     public void generateAmendmentClass(Writer outputWriter, String packageName, String className) throws ValidationException {
         String methodComment = "/**\n * EclipseLink generated method. \n * <b>WARNING</b>: This code was generated by an automated tool.\n * Any changes will be lost when the code is re-generated\n */";
         ClassDescriptor descriptor;
-        Vector storedProcedureVector;
+        List<StoredProcedureDefinition> storedProcedureVector;
         Hashtable mappingHashtable;
         StoredProcedureDefinition definition;
-        Vector storedProcedureDefinitionArguments;
-        Enumeration argumentEnum;
+        List<FieldDefinition> storedProcedureDefinitionArguments;
+        Iterator<FieldDefinition> argumentEnum;
         FieldDefinition fieldDefinition;
         try {
             outputWriter.write("package ");
@@ -170,7 +171,7 @@
             outputWriter.write("{\n");
             Enumeration<ClassDescriptor> descriptorEnum = this.storedProcedures.keys();
             while (descriptorEnum.hasMoreElements()) {
-                descriptor = (ClassDescriptor)descriptorEnum.nextElement();
+                descriptor = descriptorEnum.nextElement();
                 if (descriptor.isDescriptorForInterface() || descriptor.isAggregateDescriptor()) {
                     continue;
                 }
@@ -178,19 +179,19 @@
                 outputWriter.write("\npublic static void amend");
                 outputWriter.write(Helper.getShortClassName(descriptor.getJavaClass()));
                 outputWriter.write("ClassDescriptor(ClassDescriptor descriptor){\n\t");
-                storedProcedureVector = (Vector)this.storedProcedures.get(descriptor);
-                mappingHashtable = (Hashtable)this.mappingStoredProcedures.get(descriptor);
-                definition = (StoredProcedureDefinition)storedProcedureVector.elementAt(0);
+                storedProcedureVector = this.storedProcedures.get(descriptor);
+                mappingHashtable = this.mappingStoredProcedures.get(descriptor);
+                definition = storedProcedureVector.get(0);
                 outputWriter.write("\n\t//INSERT QUERY\n");
                 outputWriter.write("\tInsertObjectQuery insertQuery = new InsertObjectQuery();\n\tStoredProcedureCall call = new StoredProcedureCall();\n");
                 outputWriter.write("\tcall.setProcedureName(\"");
                 outputWriter.write(definition.getName());
                 outputWriter.write("\");\n\t");
                 storedProcedureDefinitionArguments = definition.getArguments();
-                argumentEnum = storedProcedureDefinitionArguments.elements();
+                argumentEnum = storedProcedureDefinitionArguments.iterator();
 
-                while (argumentEnum.hasMoreElements()) {
-                    fieldDefinition = (FieldDefinition)argumentEnum.nextElement();
+                while (argumentEnum.hasNext()) {
+                    fieldDefinition = argumentEnum.next();
                     outputWriter.write("call.addNamedArgument(\"");
                     outputWriter.write(fieldDefinition.getName());
                     outputWriter.write("\", \"");
@@ -198,7 +199,7 @@
                     outputWriter.write("\");\n\t");
                 }
                 outputWriter.write("insertQuery.setCall(call);\n\tdescriptor.getQueryManager().setInsertQuery(insertQuery);\n\t");
-                definition = (StoredProcedureDefinition)storedProcedureVector.elementAt(1);
+                definition = storedProcedureVector.get(1);
                 if (definition != null) {
                     outputWriter.write("\n\t//UPDATE QUERY\n");
                     outputWriter.write("\tUpdateObjectQuery updateQuery = new UpdateObjectQuery();\n\tcall = new StoredProcedureCall();\n");
@@ -206,9 +207,9 @@
                     outputWriter.write(definition.getName());
                     outputWriter.write("\");\n\t");
                     storedProcedureDefinitionArguments = definition.getArguments();
-                    argumentEnum = storedProcedureDefinitionArguments.elements();
-                    while (argumentEnum.hasMoreElements()) {
-                        fieldDefinition = (FieldDefinition)argumentEnum.nextElement();
+                    argumentEnum = storedProcedureDefinitionArguments.iterator();
+                    while (argumentEnum.hasNext()) {
+                        fieldDefinition = argumentEnum.next();
                         outputWriter.write("call.addNamedArgument(\"");
                         outputWriter.write(fieldDefinition.getName());
                         outputWriter.write("\", \"");
@@ -217,16 +218,16 @@
                     }
                     outputWriter.write("updateQuery.setCall(call);\n\tdescriptor.getQueryManager().setUpdateQuery(updateQuery);\n");
                 }
-                definition = (StoredProcedureDefinition)storedProcedureVector.elementAt(2);
+                definition = storedProcedureVector.get(2);
                 outputWriter.write("\n\t//DELETE QUERY\n");
                 outputWriter.write("\tDeleteObjectQuery deleteQuery = new DeleteObjectQuery();\n\tcall = new StoredProcedureCall();\n");
                 outputWriter.write("\tcall.setProcedureName(\"");
                 outputWriter.write(definition.getName());
                 outputWriter.write("\");\n\t");
                 storedProcedureDefinitionArguments = definition.getArguments();
-                argumentEnum = storedProcedureDefinitionArguments.elements();
-                while (argumentEnum.hasMoreElements()) {
-                    fieldDefinition = (FieldDefinition)argumentEnum.nextElement();
+                argumentEnum = storedProcedureDefinitionArguments.iterator();
+                while (argumentEnum.hasNext()) {
+                    fieldDefinition = argumentEnum.next();
                     outputWriter.write("call.addNamedArgument(\"");
                     outputWriter.write(fieldDefinition.getName());
                     outputWriter.write("\", \"");
@@ -235,16 +236,16 @@
                 }
                 outputWriter.write("deleteQuery.setCall(call);\n\tdescriptor.getQueryManager().setDeleteQuery(deleteQuery);\n");
                 if (storedProcedureVector.size() > 3) {
-                    definition = (StoredProcedureDefinition)storedProcedureVector.elementAt(3);
+                    definition = storedProcedureVector.get(3);
                     outputWriter.write("\n\t//READ OBJECT QUERY\n");
                     outputWriter.write("\tReadObjectQuery readQuery = new ReadObjectQuery();\n\tcall = new StoredProcedureCall();\n");
                     outputWriter.write("\tcall.setProcedureName(\"");
                     outputWriter.write(definition.getName());
                     outputWriter.write("\");\n\t");
                     storedProcedureDefinitionArguments = definition.getArguments();
-                    argumentEnum = storedProcedureDefinitionArguments.elements();
-                    while (argumentEnum.hasMoreElements()) {
-                        fieldDefinition = (FieldDefinition)argumentEnum.nextElement();
+                    argumentEnum = storedProcedureDefinitionArguments.iterator();
+                    while (argumentEnum.hasNext()) {
+                        fieldDefinition = argumentEnum.next();
                         outputWriter.write("call.addNamedArgument(\"");
                         outputWriter.write(fieldDefinition.getName());
                         outputWriter.write("\", \"");
@@ -256,16 +257,16 @@
 
                 //generate read all stored procs.
                 if (storedProcedureVector.size() > 4) {
-                    definition = (StoredProcedureDefinition)storedProcedureVector.elementAt(4);
+                    definition = storedProcedureVector.get(4);
                     outputWriter.write("\n\t//READ ALL QUERY\n");
                     outputWriter.write("\tReadAllQuery readAllQuery = new ReadAllQuery();\n\tcall = new StoredProcedureCall();\n");
                     outputWriter.write("\tcall.setProcedureName(\"");
                     outputWriter.write(definition.getName());
                     outputWriter.write("\");\n\t");
                     storedProcedureDefinitionArguments = definition.getArguments();
-                    argumentEnum = storedProcedureDefinitionArguments.elements();
-                    while (argumentEnum.hasMoreElements()) {
-                        fieldDefinition = (FieldDefinition)argumentEnum.nextElement();
+                    argumentEnum = storedProcedureDefinitionArguments.iterator();
+                    while (argumentEnum.hasNext()) {
+                        fieldDefinition = argumentEnum.next();
                         outputWriter.write("call.addNamedArgument(\"");
                         outputWriter.write(fieldDefinition.getName());
                         outputWriter.write("\", \"");
@@ -291,9 +292,9 @@
                             outputWriter.write(definition.getName());
                             outputWriter.write("\");\n\t");
                             storedProcedureDefinitionArguments = definition.getArguments();
-                            argumentEnum = storedProcedureDefinitionArguments.elements();
-                            while (argumentEnum.hasMoreElements()) {
-                                fieldDefinition = (FieldDefinition)argumentEnum.nextElement();
+                            argumentEnum = storedProcedureDefinitionArguments.iterator();
+                            while (argumentEnum.hasNext()) {
+                                fieldDefinition = argumentEnum.next();
                                 outputWriter.write("call.addNamedArgument(\"");
                                 outputWriter.write(fieldDefinition.getName());
                                 outputWriter.write("\", \"");
@@ -312,9 +313,9 @@
                             outputWriter.write(definition.getName());
                             outputWriter.write("\");\n\t");
                             storedProcedureDefinitionArguments = definition.getArguments();
-                            argumentEnum = storedProcedureDefinitionArguments.elements();
-                            while (argumentEnum.hasMoreElements()) {
-                                fieldDefinition = (FieldDefinition)argumentEnum.nextElement();
+                            argumentEnum = storedProcedureDefinitionArguments.iterator();
+                            while (argumentEnum.hasNext()) {
+                                fieldDefinition = argumentEnum.next();
                                 outputWriter.write("call.addNamedArgument(\"");
                                 outputWriter.write(fieldDefinition.getName());
                                 outputWriter.write("\", \"");
@@ -327,16 +328,16 @@
                 }
                 outputWriter.write("}\n");
             }
-            definition = (StoredProcedureDefinition)sequenceProcedures.get("SELECT");
+            definition = sequenceProcedures.get("SELECT");
             if (definition != null) {
                 outputWriter.write("\n\tValueReadQuery seqSelectQuery = new ValueReadQuery();\n\tcall = new StoredProcedureCall();\n");
                 outputWriter.write("\tcall.setProcedureName(\"");
                 outputWriter.write(definition.getName());
                 outputWriter.write("\");\n\t");
                 storedProcedureDefinitionArguments = definition.getArguments();
-                argumentEnum = storedProcedureDefinitionArguments.elements();
-                while (argumentEnum.hasMoreElements()) {
-                    fieldDefinition = (FieldDefinition)argumentEnum.nextElement();
+                argumentEnum = storedProcedureDefinitionArguments.iterator();
+                while (argumentEnum.hasNext()) {
+                    fieldDefinition = argumentEnum.next();
                     outputWriter.write("call.addNamedArgument(\"");
                     outputWriter.write(fieldDefinition.getName());
                     outputWriter.write("\", \"");
@@ -398,7 +399,7 @@
         Hashtable<String, StoredProcedureDefinition> mappingTable;
         for (Enumeration<DatabaseMapping> enumtr = mappings.elements(); enumtr.hasMoreElements();) {
             mappingTable = new Hashtable<>();
-            DatabaseMapping mapping = (DatabaseMapping)enumtr.nextElement();
+            DatabaseMapping mapping = enumtr.nextElement();
             if (mapping.isOneToManyMapping()) {
                 if (!getSession().getPlatform().isOracle()) {
                     //reads not supported in oracle
@@ -418,7 +419,7 @@
     /**
      * INTERNAL: Generates the object level stored procedure based on the passed in query
      */
-    protected StoredProcedureDefinition generateObjectStoredProcedure(DatabaseQuery query, List fields, String namePrefix) {
+    protected StoredProcedureDefinition generateObjectStoredProcedure(DatabaseQuery query, List<DatabaseField> fields, String namePrefix) {
         String className = Helper.getShortClassName(query.getDescriptor().getJavaClass());
 
         return generateStoredProcedure(query, fields, getPrefix() + namePrefix + className);
@@ -596,7 +597,7 @@
         Vector<StoredProcedureDefinition> definitionVector;
         this.generateSequenceStoredProcedures(getSession().getProject());
         while (iterator.hasNext()) {
-            desc = (ClassDescriptor)descriptors.get(iterator.next());
+            desc = descriptors.get(iterator.next());
             if (desc.isDescriptorForInterface() || desc.isDescriptorTypeAggregate()) {
                 continue;
             }
@@ -621,11 +622,11 @@
             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");
+                definition = table.get("1MREAD");
                 if (definition != null) {
                     this.writeDefinition(definition);
                 }
-                definition = (StoredProcedureDefinition)table.get("1MDALL");
+                definition = table.get("1MDALL");
                 if (definition != null) {
                     this.writeDefinition(definition);
                 }
@@ -686,7 +687,7 @@
      */
     protected Class getFieldType(Object jdbcDataType) {
         Integer key = ((Number) jdbcDataType).intValue();
-        return (Class)intToTypeConverterHash.get(key);
+        return intToTypeConverterHash.get(key);
     }
 
     public String getPrefix() {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableCreator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableCreator.java
index 50af220..1d28b27 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableCreator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableCreator.java
@@ -389,7 +389,7 @@
     /**
      * Set the tables.
      */
-    public void setTableDefinitions(Vector tableDefinitions) {
+    public void setTableDefinitions(List<TableDefinition> tableDefinitions) {
         this.tableDefinitions = tableDefinitions;
     }
 
@@ -497,7 +497,7 @@
                         //Table exists, add individual fields as necessary
 
                         //hash the table's existing columns by name
-                        final Map<DatabaseField, DatabaseRecord> columns = new HashMap(columnInfo.size());
+                        final Map<DatabaseField, DatabaseRecord> columns = new HashMap<>(columnInfo.size());
                         final DatabaseField columnNameLookupField = new DatabaseField("COLUMN_NAME");
                         final DatabaseField schemaLookupField = new DatabaseField("TABLE_SCHEM");
                         boolean schemaMatchFound = false;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableDefinition.java
index 82d6dfc..9252c49 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TableDefinition.java
@@ -550,8 +550,8 @@
      * Build a foreign key constraint using FieldDefinition.getForeignKeyFieldName().
      */
     protected ForeignKeyConstraint buildForeignKeyConstraint(FieldDefinition field, DatabasePlatform platform) {
-        Vector sourceFields = new Vector();
-        Vector targetFields = new Vector();
+        List<String> sourceFields = new Vector<>();
+        List<String> targetFields = new Vector<>();
         ForeignKeyConstraint fkConstraint = new ForeignKeyConstraint();
         DatabaseField tempTargetField = new DatabaseField(field.getForeignKeyFieldName());
         DatabaseField tempSourceField = new DatabaseField(field.getName());
@@ -797,10 +797,10 @@
             }
         }
         if (foreignKeyMap != null) {
-            clone.setForeignKeyMap(new HashMap(this.foreignKeyMap));
+            clone.setForeignKeyMap(new HashMap<>(this.foreignKeyMap));
         }
         if (uniqueKeys != null) {
-            clone.setUniqueKeys(new ArrayList(this.uniqueKeys));
+            clone.setUniqueKeys(new ArrayList<>(this.uniqueKeys));
         }
         return clone;
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TypeDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TypeDefinition.java
index da86a28..1b15938 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TypeDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/schemaframework/TypeDefinition.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,10 +25,10 @@
  * </p>
  */
 public class TypeDefinition extends DatabaseObjectDefinition {
-    protected Vector fields;
+    protected List<FieldDefinition> fields;
 
     public TypeDefinition() {
-        this.fields = new Vector();
+        this.fields = new Vector<>();
     }
 
     /**
@@ -72,7 +72,7 @@
      * Add the field to the type.
      */
     public void addField(FieldDefinition field) {
-        this.getFields().addElement(field);
+        this.getFields().add(field);
     }
 
     /**
@@ -83,10 +83,11 @@
     public Writer buildCreationWriter(AbstractSession session, Writer writer) throws ValidationException {
         try {
             writer.write("CREATE TYPE " + getFullName() + " AS OBJECT (");
-            for (Enumeration fieldsEnum = getFields().elements(); fieldsEnum.hasMoreElements();) {
-                FieldDefinition field = (FieldDefinition)fieldsEnum.nextElement();
+            List<FieldDefinition> fields = getFields();
+            for (int i = 0; i < getFields().size(); i++) {
+                FieldDefinition field = fields.get(i);
                 field.appendTypeString(writer, session);
-                if (fieldsEnum.hasMoreElements()) {
+                if (i + 1 < fields.size()) {
                     writer.write(", ");
                 }
             }
@@ -111,11 +112,11 @@
         return writer;
     }
 
-    public Vector getFields() {
+    public List<FieldDefinition> getFields() {
         return fields;
     }
 
-    public void setFields(Vector fields) {
+    public void setFields(List<FieldDefinition> fields) {
         this.fields = fields;
     }
 }
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 5c85522..2867a02 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
@@ -62,7 +62,7 @@
             writer.write("UNIQUE (");
             for (Enumeration<String> sourceEnum = getSourceFields().elements();
                  sourceEnum.hasMoreElements();) {
-                writer.write((String)sourceEnum.nextElement());
+                writer.write(sourceEnum.nextElement());
                 if (sourceEnum.hasMoreElements()) {
                     writer.write(", ");
                 }
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 5208694..1174455 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
@@ -130,7 +130,7 @@
             Collection<ClassDescriptor> descriptors = project.getDescriptors().values();
             Iterator<ClassDescriptor> iter = descriptors.iterator();
             while (iter.hasNext()) {
-                ClassDescriptor nextDesc = (ClassDescriptor)iter.next();
+                ClassDescriptor nextDesc = iter.next();
                 if (nextDesc instanceof org.eclipse.persistence.oxm.XMLDescriptor) {
                     ((org.eclipse.persistence.oxm.XMLDescriptor)nextDesc).setShouldPreserveDocument(true);
                 }
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 641d301..a78f01e 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
@@ -100,7 +100,7 @@
             Map<Class<?>, ClassDescriptor> descriptors = project.getDescriptors();
             Iterator<Class<?>> keysIterator = descriptors.keySet().iterator();
             while (keysIterator.hasNext()) {
-                Class nextClass = (Class)keysIterator.next();
+                Class<?> nextClass = keysIterator.next();
                 EISDescriptor next = (EISDescriptor)descriptors.get(nextClass);
                 for (int i = 0; i < next.getMappings().size(); i++) {
                     DatabaseMapping nextMapping = next.getMappings().get(i);
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 77494c4..b4f3d04 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
@@ -36,7 +36,7 @@
         resultRow = new CobolRow();
         //write to array
         while (fieldEnum.hasMoreElements()) {
-            DatabaseField databaseField = (DatabaseField)fieldEnum.nextElement();
+            DatabaseField databaseField = fieldEnum.nextElement();
             FieldMetaData field = recordMetaData.getFieldNamed(databaseField.getName());
             field.writeOnArray(row, recordData);
         }
@@ -44,7 +44,7 @@
         //write to database row
         fieldEnum = row.getFields().elements();
         while (fieldEnum.hasMoreElements()) {
-            DatabaseField databaseField = (DatabaseField)fieldEnum.nextElement();
+            DatabaseField databaseField = fieldEnum.nextElement();
             FieldMetaData field = recordMetaData.getFieldNamed(databaseField.getName());
             field.writeOnRow(resultRow, recordData);
         }
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 478ce67..70d038e 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
@@ -518,7 +518,7 @@
 
         Enumeration<DatabaseField> fieldsEnum = row1.getFields().elements();
         while (fieldsEnum.hasMoreElements()) {
-            DatabaseField field = (DatabaseField)fieldsEnum.nextElement();
+            DatabaseField field = fieldsEnum.nextElement();
             DatabaseField fieldMatch = row2.getField(field);
             if (fieldMatch == null) {
                 return false;
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 de57960..a0d7661 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
@@ -38,7 +38,7 @@
         resultRow = new CobolRow();
         //write to array
         while (fieldEnum.hasMoreElements()) {
-            DatabaseField databaseField = (DatabaseField)fieldEnum.nextElement();
+            DatabaseField databaseField = fieldEnum.nextElement();
             FieldMetaData field = recordMetaData.getFieldNamed(databaseField.getName());
             field.writeOnArray(row, recordData);
         }
@@ -46,7 +46,7 @@
         //write to database row
         fieldEnum = row.getFields().elements();
         while (fieldEnum.hasMoreElements()) {
-            DatabaseField databaseField = (DatabaseField)fieldEnum.nextElement();
+            DatabaseField databaseField = fieldEnum.nextElement();
             FieldMetaData field = recordMetaData.getFieldNamed(databaseField.getName());
             field.writeOnRow(resultRow, recordData);
         }
diff --git a/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/eis/adapters/jms/CciJMSConnectionFactory.java b/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/eis/adapters/jms/CciJMSConnectionFactory.java
index 58df923..fb0f100 100644
--- a/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/eis/adapters/jms/CciJMSConnectionFactory.java
+++ b/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/internal/eis/adapters/jms/CciJMSConnectionFactory.java
@@ -55,7 +55,7 @@
     public jakarta.resource.cci.Connection getConnection(ConnectionSpec spec) throws EISException {
         CciJMSConnectionSpec jmsSpec = null;
         Session session = null;
-        jakarta.jms.Connection conn = null;
+        QueueConnection conn = null;
         jakarta.jms.ConnectionFactory factory;
 
         try {
@@ -84,7 +84,7 @@
             // 'AUTO_ACKNOWLEDGE' - session automatically acknowledges a client's receipt of a message either:
             //   - when the session has successfully returned from a call to receive
             //   - when the listener the session has called to process the message successfully returns
-            session = ((QueueConnection)conn).createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
+            session = conn.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
         } catch (Exception e) {
             throw EISException.createException(e);
         }
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 162e745..daa0f28 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
@@ -244,7 +244,7 @@
     public MongoRecord buildRecordFromDBObject(Document object) {
         MongoRecord record = new MongoRecord();
         for (Iterator<Map.Entry<String, Object>> iterator = object.entrySet().iterator(); iterator.hasNext(); ) {
-            Map.Entry entry = (Map.Entry)iterator.next();
+            Map.Entry<String, Object> entry = iterator.next();
             if (entry.getValue() instanceof BasicDBList) {
                 List values = new ArrayList();
                 for (Iterator<Object> valuesIterator = ((BasicDBList)entry.getValue()).iterator(); valuesIterator.hasNext(); ) {
diff --git a/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/models/jpa/nosql/Order.java b/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/models/jpa/nosql/Order.java
index 3f30e46..b6c492c 100644
--- a/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/models/jpa/nosql/Order.java
+++ b/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/models/jpa/nosql/Order.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
@@ -42,9 +42,9 @@
     @OneToOne
     public Customer customer;
     @ElementCollection
-    public List<LineItem> lineItems = new ArrayList();
+    public List<LineItem> lineItems = new ArrayList<>();
     @ElementCollection
-    public List<String> comments = new ArrayList();
+    public List<String> comments = new ArrayList<>();
 
     public String toString() {
         return "Order(" + id + ", " + orderedBy + ", " + address + ", " + lineItems + ", " + comments + ")";
diff --git a/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/models/jpa/nosql/mapped/Order.java b/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/models/jpa/nosql/mapped/Order.java
index 101ac8c..aa0e633 100644
--- a/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/models/jpa/nosql/mapped/Order.java
+++ b/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/models/jpa/nosql/mapped/Order.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
@@ -40,9 +40,9 @@
     @OneToOne
     public Customer customer;
     @Basic
-    public List<LineItem> lineItems = new ArrayList();
+    public List<LineItem> lineItems = new ArrayList<>();
     @Basic
-    public List<String> comments = new ArrayList();
+    public List<String> comments = new ArrayList<>();
 
     public String toString() {
         return "Order(" + id + ", " + orderedBy + ", " + address + ", " + lineItems + ")";
diff --git a/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/tests/nosql/EntityManagerHelper.java b/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/tests/nosql/EntityManagerHelper.java
index e074e68..6f094d8 100644
--- a/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/tests/nosql/EntityManagerHelper.java
+++ b/foundation/org.eclipse.persistence.oracle.nosql/src/it/java/org/eclipse/persistence/testing/tests/nosql/EntityManagerHelper.java
@@ -59,7 +59,7 @@
             return new JEEPlatform();
         } else {
             try {
-                return (ServerPlatform)Class.forName(platformClass).newInstance();
+                return (ServerPlatform)Class.forName(platformClass).getConstructor().newInstance();
             } catch (Exception ex) {
                 LOG.log(SessionLog.WARNING, String.format(
                         "Could not initiaize ServerPlatform: %s", ex.getLocalizedMessage()));
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 7d326d1..33254a3 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
@@ -61,7 +61,7 @@
         // fill out tableNames collection with all tables' names mapped by all descriptors
         Iterator<ClassDescriptor> descriptors = session.getDescriptors().values().iterator();
         while (descriptors.hasNext()) {
-            ClassDescriptor desc = (ClassDescriptor)descriptors.next();
+            ClassDescriptor desc = descriptors.next();
 
             // Create a Vector containing names of all tables mapped to the descriptor
             Vector descTableNames = desc.getTableNames();
@@ -94,7 +94,7 @@
         // loop through the descriptors to fill out tableNameToClass and tableNameToPkFieldNames
         Iterator<ClassDescriptor> descriptors = session.getDescriptors().values().iterator();
         while (descriptors.hasNext() && !tableNames.isEmpty()) {
-            ClassDescriptor desc = (ClassDescriptor)descriptors.next();
+            ClassDescriptor desc = descriptors.next();
 
             // Create a Vector containing names of all tables mapped to the descriptor
             Vector descTableNames = desc.getTableNames();
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 e12d4f5..a22f0fc 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
@@ -53,10 +53,10 @@
     public void updateProject(Project project, Session session) {
         Iterator<ClassDescriptor> it = project.getDescriptors().values().iterator();
         while (it.hasNext()) {
-            ClassDescriptor desc = (ClassDescriptor)it.next();
+            ClassDescriptor desc = it.next();
             Enumeration<DatabaseTable> enumDescTableNames = desc.getTables().elements();
             while (enumDescTableNames.hasMoreElements()) {
-                String tableName = ((DatabaseTable)enumDescTableNames.nextElement()).getName();
+                String tableName = enumDescTableNames.nextElement().getName();
                 if (!tableNamesToPkFields.containsKey(tableName)) {
                     while (desc.isChildDescriptor()) {
                         desc = project.getClassDescriptor(desc.getInheritancePolicy().getParentClass());
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni10TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni10TestSet.java
index b7ea302..6911c65 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni10TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni10TestSet.java
@@ -154,9 +154,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(-1);
         boolean worked = false;
@@ -195,6 +195,6 @@
           msg = e.getMessage();
         }
         assertFalse("invocation signtype_in_test with -2 worked: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni1TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni1TestSet.java
index b060586..539326c 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni1TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni1TestSet.java
@@ -156,9 +156,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(1);
         boolean worked = false;
@@ -171,6 +171,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation bool_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni2TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni2TestSet.java
index 85f1e39..a71a85b 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni2TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni2TestSet.java
@@ -153,9 +153,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(2);
         boolean worked = false;
@@ -168,6 +168,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation plsint_in_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni3TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni3TestSet.java
index 22e112b..613f5fc 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni3TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni3TestSet.java
@@ -153,9 +153,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(3);
         boolean worked = false;
@@ -168,6 +168,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation binaryint_in_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni4TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni4TestSet.java
index e200a0b..cefa183 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni4TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni4TestSet.java
@@ -153,9 +153,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(4);
         boolean worked = false;
@@ -168,6 +168,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation dec_in_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni5TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni5TestSet.java
index e49447d..26609ec 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni5TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni5TestSet.java
@@ -153,9 +153,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(5);
         boolean worked = false;
@@ -168,6 +168,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation int_in_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni6TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni6TestSet.java
index 5569828..33a13f5 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni6TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni6TestSet.java
@@ -153,9 +153,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(6);
         boolean worked = false;
@@ -168,6 +168,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation natural_in_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni7TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni7TestSet.java
index 90722b1..9b42f07 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni7TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni7TestSet.java
@@ -153,9 +153,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(7);
         boolean worked = false;
@@ -168,6 +168,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation naturaln_in_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni8TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni8TestSet.java
index 570c60d..1dbb1aa 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni8TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni8TestSet.java
@@ -154,9 +154,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(8);
         boolean worked = false;
@@ -182,6 +182,6 @@
           msg = e.getMessage();
         }
         assertFalse("invocation positive_in_test with neg number worked: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni9TestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni9TestSet.java
index 0a98cd7..594ce9e 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni9TestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/Ni9TestSet.java
@@ -154,9 +154,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(9);
         boolean worked = false;
@@ -182,6 +182,6 @@
           msg = e.getMessage();
         }
         assertFalse("invocation positiven_in_test with neg number worked: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiNiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiNiTestSet.java
index 226eb5f..92878f1 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiNiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiNiTestSet.java
@@ -173,9 +173,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(1);
         queryArgs.add("test");
@@ -190,6 +190,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation nijini failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiTestSet.java
index 6975d14..a36c1dc 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiTestSet.java
@@ -164,9 +164,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(0);
         queryArgs.add("test");
@@ -180,6 +180,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation niji failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijijiNiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijijiNiTestSet.java
index 7ce5645..5a63f8f 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijijiNiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijijiNiTestSet.java
@@ -185,9 +185,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(0);
         queryArgs.add("test");
@@ -203,6 +203,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation nijijini failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijioNijioTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijioNijioTestSet.java
index 3d93825..77ea65f 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijioNijioTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijioNijioTestSet.java
@@ -193,9 +193,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(107);
@@ -218,6 +218,6 @@
         assertTrue("wrong y value", y.intValue() == 158);
         String aa = (String)record.get("AA");
         assertTrue("wrong aa value", aa.equals("MERVISH"));
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiojiNiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiojiNiTestSet.java
index 5f05ea4..8f27700 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiojiNiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NijiojiNiTestSet.java
@@ -192,9 +192,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(105);
@@ -215,6 +215,6 @@
         DatabaseRecord record = (DatabaseRecord)results.get(0);
         BigDecimal y = (BigDecimal)record.get("Y");
         assertTrue("wrong y value", y.intValue() == 155);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NoTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NoTestSet.java
index c76c438..0daac24 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NoTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NoTestSet.java
@@ -146,9 +146,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         boolean worked = false;
         String msg = null;
@@ -162,6 +162,6 @@
         assertTrue("invocation no failed: " + msg, worked);
         Integer bool2int = (Integer)o;
         assertTrue("wrong bool2int value", bool2int == 1);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojiNoTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojiNoTestSet.java
index 5933aa7..586a45b 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojiNoTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojiNoTestSet.java
@@ -172,9 +172,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add("test");
@@ -194,6 +194,6 @@
         assertTrue("wrong bint2bigdec value", bint2bigdec.intValue() == 42);
         Integer bool2int = (Integer)record.get("Z");
         assertTrue("wrong bool2int value", bool2int == 1);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojiTestSet.java
index be27a9d..6e0c930 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojiTestSet.java
@@ -168,9 +168,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add("testsdfsdfasdfsdfsdfsdfsdfsdfdfsdfsdffds");
         boolean worked = false;
@@ -189,6 +189,6 @@
         DatabaseRecord record = (DatabaseRecord)results.get(0);
         BigDecimal x = (BigDecimal)record.get("X");
         assertTrue("wrong x value", x.intValue() == 33);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojijioNoTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojijioNoTestSet.java
index bb1f479..4b80477 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojijioNoTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/NojijioNoTestSet.java
@@ -186,9 +186,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(104);
@@ -209,6 +209,6 @@
         assertTrue("wrong x value", x.intValue() == 48);
         String z = (String)record.get("Z");
         assertTrue("wrong z value", z.equals("FOOBAR"));
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiNijiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiNijiTestSet.java
index 64e1326..4c0d0b9 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiNijiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiNijiTestSet.java
@@ -188,9 +188,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         DataModifyQuery query = (DataModifyQuery)project.getClassDescriptor(Empty.class).
             getQueryManager().getQuery("jiNiNiji");
         Vector queryArgs = new NonSynchronizedVector();
@@ -208,6 +208,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation jiNiNiji failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiTestSet.java
index 0e9b5aa..c79c0e4 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiTestSet.java
@@ -164,9 +164,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add("test");
         queryArgs.add(0);
@@ -180,6 +180,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation jiNi failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNijiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNijiTestSet.java
index 3a4ed3e..45d373c 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNijiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNijiTestSet.java
@@ -179,9 +179,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add("test");
         queryArgs.add(0);
@@ -196,6 +196,6 @@
           msg = e.getMessage();
         }
         assertTrue("invocation jiniji failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNioTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNioTestSet.java
index 64fb51fb..bde36b4 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNioTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNioTestSet.java
@@ -171,9 +171,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add("test");
@@ -192,6 +192,6 @@
         DatabaseRecord record = (DatabaseRecord)results.get(0);
         Integer bool2int = (Integer)record.get("Y");
         assertTrue("wrong bool2int value", bool2int == 0);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiojiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiojiTestSet.java
index 2a54da5..af2604b 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiojiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNiojiTestSet.java
@@ -184,9 +184,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add("snicker-doodle");
@@ -206,6 +206,6 @@
         DatabaseRecord record = (DatabaseRecord)results.get(0);
         BigDecimal y = (BigDecimal)record.get("Y");
         assertTrue("wrong y value", y.intValue() == 149);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNoTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNoTestSet.java
index 17f2c77..6927b92 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNoTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNoTestSet.java
@@ -167,9 +167,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add("test");
@@ -187,6 +187,6 @@
         DatabaseRecord record = (DatabaseRecord)results.get(0);
         Integer bool2int = (Integer)record.get("Y");
         assertTrue("wrong bool2int value", bool2int == 0);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNojiTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNojiTestSet.java
index ff4d48b..52250ac 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNojiTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/jiNojiTestSet.java
@@ -179,9 +179,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add("test");
@@ -200,6 +200,6 @@
         DatabaseRecord record = (DatabaseRecord)results.get(0);
         BigDecimal y = (BigDecimal)record.get("Y");
         assertTrue("wrong y value", y.intValue() == 44);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijiNoTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijiNoTestSet.java
index e4bfd09..f724db1 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijiNoTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijiNoTestSet.java
@@ -185,9 +185,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(100);
@@ -208,6 +208,6 @@
         assertTrue("wrong y value", y.equals("test"));
         Integer aa = (Integer)record.get("AA");
         assertTrue("wrong aa value", aa == 1);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijijoTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijijoTestSet.java
index d9db188..3ed74a4 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijijoTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijijoTestSet.java
@@ -185,9 +185,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(100);
@@ -208,6 +208,6 @@
         assertTrue("wrong y value", y.equals("test"));
         Integer aa = (Integer)record.get("AA");
         assertTrue("wrong aa value", aa == 1);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijioTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijioTestSet.java
index 20a4021..6a3c86d 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijioTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijioTestSet.java
@@ -180,9 +180,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(1);
@@ -203,6 +203,6 @@
         assertTrue("wrong x value", x.intValue() == 51);
         String z = (String)record.get("Z");
         assertTrue("wrong z value", z.equals("test-thingie"));
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijoTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijoTestSet.java
index a8fbd32..143433e 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijoTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/nonJDBC/joNijoTestSet.java
@@ -176,9 +176,9 @@
     @SuppressWarnings("unchecked")
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object o = null;
         Vector queryArgs = new NonSynchronizedVector();
         queryArgs.add(1);
@@ -198,6 +198,6 @@
         assertTrue("wrong y value", y.equals("test"));
         BigDecimal z = (BigDecimal)record.get("Z");
         assertTrue("wrong z value", z.intValue() == 46);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordInOutTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordInOutTestSet.java
index ba5d50b..0a77478 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordInOutTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordInOutTestSet.java
@@ -280,9 +280,9 @@
 
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         NonSynchronizedVector queryArgs = new NonSynchronizedVector();
         queryArgs.add(new BigDecimal(10));
         queryArgs.add("MikeNorman");
@@ -312,6 +312,6 @@
         assertTrue("incorrect SAL" , result.salary.equals(3500F));
         assertNull("COMM is supposed to be null", result.commission);
         assertTrue("incorrect DEPTNO" , result.department.equals(new BigDecimal(20)));
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordInTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordInTestSet.java
index a634a5c..9ddba7a 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordInTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordInTestSet.java
@@ -273,9 +273,9 @@
 
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         NonSynchronizedVector queryArgs = new NonSynchronizedVector();
         queryArgs.add(new BigDecimal(10));
         queryArgs.add("MikeNorman");
@@ -295,6 +295,6 @@
             msg = e.getMessage();
         }
         assertTrue("invocation rec_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordOutTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordOutTestSet.java
index 44f1519..2ffefd1 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordOutTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordOutTestSet.java
@@ -242,9 +242,9 @@
 
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         OutputRowSessionEventAdapter outputParametersDetected
             = new OutputRowSessionEventAdapter();
         s.getEventManager().addListener(outputParametersDetected);
@@ -276,6 +276,6 @@
         assertNull("COMM is supposed to be null",  record.get("COMM"));
         assertTrue("incorrect DEPTNO" ,
             record.get("DEPTNO").equals(new BigDecimal(20)));
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeInOutTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeInOutTestSet.java
index fad6747..83cc782 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeInOutTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeInOutTestSet.java
@@ -262,9 +262,9 @@
 
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object[] attributes = {
             new BigDecimal(10),
             "MikeNorman",
@@ -304,6 +304,6 @@
         assertNull("MGR is supposed to be null",  result.manager);
         assertTrue("incorrect SAL" , result.salary.equals(3500F));
         assertTrue("incorrect DEPTNO" , result.department.equals(new BigDecimal(20)));
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeInTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeInTestSet.java
index fd94cce..03995e2 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeInTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeInTestSet.java
@@ -254,9 +254,9 @@
 
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         Object[] attributes = {
             new BigDecimal(10),
             "MikeNorman",
@@ -288,6 +288,6 @@
             msg = e.getMessage();
         }
         assertTrue("invocation rec_test failed: " + msg, worked);
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
diff --git a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeOutTestSet.java b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeOutTestSet.java
index dc81502..eb72640 100644
--- a/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeOutTestSet.java
+++ b/foundation/org.eclipse.persistence.oracle.test/src/it/java/org/eclipse/persistence/testing/tests/plsqlrecord/PLSQLrecordWithCompatibleTypeOutTestSet.java
@@ -249,9 +249,9 @@
 
     @Test
     public void runQuery() {
-        Session s = project.createDatabaseSession();
+        DatabaseSession s = project.createDatabaseSession();
         s.dontLogMessages();
-        ((DatabaseSession)s).login();
+        s.login();
         boolean worked = false;
         String msg = null;
         PLSQLEmployeeType result = null;
@@ -272,6 +272,6 @@
         assertTrue("incorrect SAL" , result.salary.equals(6000F));
         assertNull("COMM is supposed to be null", result.commission);
         assertTrue("incorrect DEPTNO" , result.department.equals(new BigDecimal(20)));
-        ((DatabaseSession)s).logout();
+        s.logout();
     }
 }
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 c74e6fa..2d50185 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
@@ -891,7 +891,7 @@
                 }else{
                     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]);
+                    xmlTypeFactory = PrivilegedAccessHelper.invokeConstructor(xmlTypeFactoryConstructor, new Object[0]);
                 }
             } catch (Exception e) {
                 throw QueryException.reflectiveCallOnTopLinkClassFailed(className, e);
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 d83de5f..f8cc1de 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
@@ -506,7 +506,7 @@
         if (getSession().isServerSession()) {
             Iterator<String> enumtr = ((ServerSession)getSession()).getConnectionPools().keySet().iterator();
             while (enumtr.hasNext()) {
-                String poolName = (String)enumtr.next();
+                String poolName = enumtr.next();
                 State connectionInUse = State.create(connectionsNoun, ConnectionInUse + "(" + poolName + ")", "", DMSLocalization.buildMessage("connection_in_used"), "not available");
                 getHeavyWeightSensors().put(poolName, connectionInUse);
             }
@@ -665,7 +665,7 @@
         if (weight == DMSConsole.NORMAL) {
             Iterator<Noun> iterator = getNormalWeightNouns().values().iterator();
             while (iterator.hasNext()) {
-                ((Noun)iterator.next()).destroy();
+                iterator.next().destroy();
             }
             getNormalWeightNouns().clear();
             getNormalWeightSensors().clear();
@@ -673,7 +673,7 @@
         if (weight == DMSConsole.HEAVY) {
             Iterator<Noun> iterator = getHeavyWeightNouns().values().iterator();
             while (iterator.hasNext()) {
-                ((Noun)iterator.next()).destroy();
+                iterator.next().destroy();
             }
             getHeavyWeightNouns().clear();
             destroySensorsByWeight(DMSConsole.HEAVY);
@@ -683,7 +683,7 @@
         if (weight == DMSConsole.ALL) {
             Iterator<Noun> iterator = getAllWeightNouns().values().iterator();
             while (iterator.hasNext()) {
-                ((Noun)iterator.next()).destroy();
+                iterator.next().destroy();
             }
             getAllWeightNouns().clear();
             destroySensorsByWeight(DMSConsole.ALL);
diff --git a/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/SpringJunitTestCase.java b/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/SpringJunitTestCase.java
index 0baa23c..5cc4a85 100644
--- a/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/SpringJunitTestCase.java
+++ b/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/SpringJunitTestCase.java
@@ -139,7 +139,7 @@
         assertTrue(r.getAverageTimeMins() == 150);
 
         em.executeNativeQuery("DELETE FROM SPRING_TLE_ROUTE WHERE (ID="+route.getId()+")");
-        List l = em.createNativeQuery(
+        List<?> l = em.createNativeQuery(
                 "SELECT id as ID, averageTimeMins as AVERAGETIMEMINS FROM SPRING_TLE_ROUTE WHERE (ID="+route.getId()+")", Route.class)
                 .getResultList();
         assertTrue(l.size() == 0);
diff --git a/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/dao/SpringAbstractJpaTestsCase.java b/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/dao/SpringAbstractJpaTestsCase.java
index bb31b5a..f217b3c 100644
--- a/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/dao/SpringAbstractJpaTestsCase.java
+++ b/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/dao/SpringAbstractJpaTestsCase.java
@@ -160,7 +160,7 @@
         Truck truck = new Truck("namedQuery");
         try {
             dao.persist(truck);
-            List l = dao.findByNamedQuery("findTruckByDriverName", "namedQuery");
+            List<?> l = dao.findByNamedQuery("findTruckByDriverName", "namedQuery");
             assertTrue(l.contains(truck));
         }catch (Exception e){
             assertFalse("Error during named query: " + e, true);
diff --git a/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/dao/SpringDao.java b/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/dao/SpringDao.java
index 15458f4..73014c2 100644
--- a/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/dao/SpringDao.java
+++ b/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/dao/SpringDao.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
@@ -73,7 +73,7 @@
         entityManager.refresh(obj);
     }
 
-    public List findByNamedQuery(String query, String driverName) {
+    public List<?> findByNamedQuery(String query, String driverName) {
         Query q = entityManager.createNamedQuery(query);
         q.setParameter(1, driverName);
         return q.getResultList();
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Customizer.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Customizer.java
index 97ddd0d..6c3f2e6 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Customizer.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/advanced/Customizer.java
@@ -65,7 +65,7 @@
 
         if (Boolean.parseBoolean(System.getProperty("sop"))) {
             boolean isRecoverable = Boolean.parseBoolean(System.getProperty("sop.recoverable"));
-            Class sopClass = Class.forName("oracle.toplink.exalogic.sop.SerializedObjectPolicy");
+            Class<?> sopClass = Class.forName("oracle.toplink.exalogic.sop.SerializedObjectPolicy");
             Method setIsRecoverableMethod = null;
             if (isRecoverable) {
                 setIsRecoverableMethod = sopClass.getDeclaredMethod("setIsRecoverable", new Class[] {boolean.class});
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/complexaggregate/ComplexAggregateTableCreator.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/complexaggregate/ComplexAggregateTableCreator.java
index 3e3edfb..0e0596d 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/complexaggregate/ComplexAggregateTableCreator.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/complexaggregate/ComplexAggregateTableCreator.java
@@ -754,11 +754,11 @@
     @Override
     public void replaceTables(DatabaseSession session, SchemaManager schemaManager) {
         if (session.getPlatform().isH2() || session.getPlatform().isHSQL()) {
-            for (Iterator iterator = getTableDefinitions().iterator(); iterator.hasNext(); ) {
-                TableDefinition table = (TableDefinition)iterator.next();
+            for (Iterator<TableDefinition> iterator = getTableDefinitions().iterator(); iterator.hasNext(); ) {
+                TableDefinition table = iterator.next();
                 if (table.getName().equals("CMP3_CITYSLICKER") || table.getName().equals("CMP3_COUNTRY_DWELLER")) {
-                    for (Iterator fields = table.getFields().iterator(); fields.hasNext(); ) {
-                        ((FieldDefinition)fields.next()).setIsPrimaryKey(false);
+                    for (Iterator<FieldDefinition> fields = table.getFields().iterator(); fields.hasNext(); ) {
+                        fields.next().setIsPrimaryKey(false);
                     }
                 }
             }
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 e1126ba..2aa9247 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
@@ -48,7 +48,7 @@
         boolean hasSetTruncateDate = false;
         if (session.getPlatform().isOracle9()) {
             try {
-                Class clazz = PrivilegedAccessHelper.getClassForName("org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
+                Class<Object> clazz = PrivilegedAccessHelper.getClassForName("org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
                 Method getDriverVersionMethod = PrivilegedAccessHelper.getMethod(clazz, "getDriverVersion", null, false);
                 String driverVersion = PrivilegedAccessHelper.invokeMethod(getDriverVersionMethod, session.getPlatform(), null);
                 if (Helper.compareVersions(driverVersion, "12.1") >= 0) {
@@ -72,7 +72,7 @@
         if (hasSetTruncateDate) {
             // Now setting shouldTruncateDate flag back to its original value "false".
             try {
-                Class clazz = PrivilegedAccessHelper.getClassForName("org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
+                Class<Object> clazz = PrivilegedAccessHelper.getClassForName("org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
                 Method setShouldTruncateDateMethod = PrivilegedAccessHelper.getMethod(clazz, "setShouldTruncateDate", new Class[]{boolean.class}, false);
                 PrivilegedAccessHelper.invokeMethod(setShouldTruncateDateMethod, session.getPlatform(), new Object[]{false});
             } catch (Exception ex) {
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/extensibility/Address.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/extensibility/Address.java
index 5684d85..409d3c7 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/extensibility/Address.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/extensibility/Address.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
@@ -14,7 +14,6 @@
 //     tware - initial implementation as part of extensibility feature
 package org.eclipse.persistence.testing.models.jpa.extensibility;
 
-import java.beans.PropertyChangeListener;
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Map;
@@ -22,7 +21,6 @@
 import jakarta.persistence.Entity;
 import jakarta.persistence.GeneratedValue;
 import jakarta.persistence.Id;
-import jakarta.persistence.Transient;
 import jakarta.persistence.Table;
 
 import org.eclipse.persistence.annotations.VirtualAccessMethods;
@@ -113,7 +111,7 @@
         buf.append(city + ", ");
         buf.append(country + ", ");
         buf.append(postalCode);
-        Iterator i = extensions.keySet().iterator();
+        Iterator<String> i = extensions.keySet().iterator();
         while (i.hasNext()){
             buf.append("," + extensions.get(i.next()));
         }
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/performance2/Populate.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/performance2/Populate.java
index e34030d..61cc064 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/performance2/Populate.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/performance2/Populate.java
@@ -620,7 +620,7 @@
      */
     public void assertCount(EntityManager em, Class entityClass, int count) {
         CriteriaBuilder cb = em.getCriteriaBuilder();
-        CriteriaQuery criteria = cb.createQuery();
+        CriteriaQuery<Object> criteria = cb.createQuery();
         Root entity = criteria.from(entityClass);
         criteria.select(cb.count(entity));
         Query query = em.createQuery(criteria);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/relationships/CustomerServiceRepresentative.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/relationships/CustomerServiceRepresentative.java
index e1ca35b..ee75412 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/relationships/CustomerServiceRepresentative.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/relationships/CustomerServiceRepresentative.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 @@
 
     private int id;
     private String name = null;
-    private List customers = new ArrayList<Customer>();
+    private List<Customer> customers = new ArrayList<Customer>();
 
     @Id
     @GeneratedValue(strategy=TABLE, generator="CUSTOMER_TABLE_GENERATOR")
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/complexaggregate/ComplexAggregateTableCreator.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/complexaggregate/ComplexAggregateTableCreator.java
index d1c9c91..eeea57e 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/complexaggregate/ComplexAggregateTableCreator.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/xml/complexaggregate/ComplexAggregateTableCreator.java
@@ -545,11 +545,11 @@
     @Override
     public void replaceTables(DatabaseSession session, SchemaManager schemaManager) {
         if (session.getPlatform().isH2() || session.getPlatform().isHSQL()) {
-            for (Iterator iterator = getTableDefinitions().iterator(); iterator.hasNext(); ) {
-                TableDefinition table = (TableDefinition)iterator.next();
+            for (Iterator<TableDefinition> iterator = getTableDefinitions().iterator(); iterator.hasNext(); ) {
+                TableDefinition table = iterator.next();
                 if (table.getName().equals("XML_CITYSLICKER") || table.getName().equals("XML_COUNTRY_DWELLER")) {
-                    for (Iterator fields = table.getFields().iterator(); fields.hasNext(); ) {
-                        ((FieldDefinition)fields.next()).setIsPrimaryKey(false);
+                    for (Iterator<FieldDefinition> fields = table.getFields().iterator(); fields.hasNext(); ) {
+                        fields.next().setIsPrimaryKey(false);
                     }
                 }
             }
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 cd532ff..37354d2 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
@@ -43,7 +43,6 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Random;
 import java.util.Set;
 import java.util.Vector;
 
@@ -63,7 +62,6 @@
 import jakarta.persistence.spi.ProviderUtil;
 
 import junit.framework.Test;
-import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
 import org.eclipse.persistence.annotations.BatchFetchType;
@@ -161,7 +159,6 @@
 import org.eclipse.persistence.testing.models.jpa.advanced.additionalcriteria.Sandwich;
 import org.eclipse.persistence.testing.models.jpa.advanced.additionalcriteria.School;
 import org.eclipse.persistence.testing.models.jpa.advanced.additionalcriteria.Student;
-import org.eclipse.persistence.testing.models.jpa.advanced.MyTestEntity;
 import org.eclipse.persistence.tools.schemaframework.SchemaManager;
 import org.eclipse.persistence.tools.schemaframework.StoredFunctionDefinition;
 import org.eclipse.persistence.exceptions.QueryException;
@@ -894,7 +891,7 @@
         assertEquals(budgetSingularAttribute, budgetAttribute);
         assertTrue(declaredAttributes.contains(budgetSingularAttribute));
         // check the type
-        Class budgetClass = budgetSingularAttribute.getJavaType();
+        Class<?> budgetClass = budgetSingularAttribute.getJavaType();
         // Verify whether we expect a boxed class or not
         assertEquals(double.class, budgetClass);
         //assertEquals(Double.class, budgetClass);
@@ -910,7 +907,7 @@
         assertEquals(PersistenceType.ENTITY, entityBuyer.getPersistenceType());
         assertEquals(Buyer.class, entityBuyer.getJavaType());
         // verify EnumSet is a SingularAttribute
-        Attribute buyingDaysAttribute = entityBuyer.getAttribute("buyingDays");
+        Attribute<? super Buyer, ?> buyingDaysAttribute = entityBuyer.getAttribute("buyingDays");
         assertNotNull(buyingDaysAttribute);
         // Check persistent attribute type
         assertEquals(PersistentAttributeType.BASIC, buyingDaysAttribute.getPersistentAttributeType());
@@ -942,7 +939,7 @@
         //* @param <K> The type of the key of the represented Map
         //* @param <V> The type of the value of the represented Map
         //public class MapAttributeImpl<X, K, V> extends PluralAttributeImpl<X, java.util.Map<K, V>, V>
-        Attribute buyerCreditCards = entityBuyer.getAttribute("creditCards");
+        Attribute<? super Buyer, ?> buyerCreditCards = entityBuyer.getAttribute("creditCards");
         assertNotNull(buyerCreditCards);
         assertTrue(buyerCreditCards.isCollection());
         assertTrue(buyerCreditCards instanceof MapAttributeImpl);
@@ -2180,7 +2177,7 @@
 
     public void testRelationshipReadDuringClone(){
         EntityManager em = createEntityManager();
-        Session session = getServerSession();
+        AbstractSession session = getServerSession();
         ClassDescriptor departmentDesc = session.getDescriptor(Department.class);
         DescriptorEventAdapter listener = new DescriptorEventAdapter(){
             @Override
@@ -2191,7 +2188,7 @@
         departmentDesc.getDescriptorEventManager().addListener(listener);
         em.createQuery("SELECT e from Equipment e where e.department is not null").getResultList();
         departmentDesc.getDescriptorEventManager().removeListener(listener);
-        departmentDesc.getDescriptorEventManager().initialize((AbstractSession) session);
+        departmentDesc.getDescriptorEventManager().initialize(session);
         closeEntityManager(em);
     }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EMCascadingRemoveAndFlushTest.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EMCascadingRemoveAndFlushTest.java
index a027e32..24e9fa1 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EMCascadingRemoveAndFlushTest.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EMCascadingRemoveAndFlushTest.java
@@ -58,8 +58,8 @@
         try {
             beginTransaction();
             Employee employee = getEntityManager().find(Employee.class, empIDs[0]);
-            for (Iterator phones = employee.getPhoneNumbers().iterator(); phones.hasNext();){
-                this.phoneIDs.add(((PhoneNumber)phones.next()).buildPK());
+            for (Iterator<PhoneNumber> phones = employee.getPhoneNumbers().iterator(); phones.hasNext();){
+                this.phoneIDs.add(phones.next().buildPK());
             }
             getEntityManager().remove(employee);
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EMRemoveAndCommitTests.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EMRemoveAndCommitTests.java
index 5fe5b98..181f0f1 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EMRemoveAndCommitTests.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EMRemoveAndCommitTests.java
@@ -128,8 +128,8 @@
                 }
                 employee.getManagedEmployees().remove(report);
             }
-            for (Iterator phones = employee.getPhoneNumbers().iterator(); phones.hasNext();){
-                this.phoneIDs.add(((PhoneNumber)phones.next()).buildPK());
+            for (Iterator<PhoneNumber> phones = employee.getPhoneNumbers().iterator(); phones.hasNext();){
+                this.phoneIDs.add(phones.next().buildPK());
             }
             getEntityManager().remove(employee);
             Address address = getEntityManager().find(Address.class, addrIDs[0]);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
index c6041fc..102d9ad 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/EntityManagerJUnitTestSuite.java
@@ -72,7 +72,6 @@
 import jakarta.persistence.spi.ProviderUtil;
 import javax.sql.DataSource;
 
-import junit.framework.TestCase;
 import org.eclipse.persistence.annotations.IdValidation;
 import org.eclipse.persistence.config.CacheUsage;
 import org.eclipse.persistence.config.CacheUsageIndirectionPolicy;
@@ -114,6 +113,7 @@
 import org.eclipse.persistence.internal.jpa.deployment.SEPersistenceUnitInfo;
 import org.eclipse.persistence.internal.jpa.jdbc.DataSourceImpl;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
+import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
 import org.eclipse.persistence.internal.weaving.PersistenceWeaved;
@@ -158,7 +158,6 @@
 import org.eclipse.persistence.sessions.SessionEventAdapter;
 import org.eclipse.persistence.sessions.UnitOfWork;
 import org.eclipse.persistence.sessions.changesets.ChangeRecord;
-import org.eclipse.persistence.sessions.changesets.ObjectChangeSet;
 import org.eclipse.persistence.sessions.changesets.UnitOfWorkChangeSet;
 import org.eclipse.persistence.sessions.server.ClientSession;
 import org.eclipse.persistence.sessions.server.ConnectionPolicy;
@@ -3853,9 +3852,9 @@
         if(!manager_NotInCache.getLastName().endsWith("_Updated")) {
             errorMsg = errorMsg + "manager_NotInCache lastName NOT updated; ";
         }
-        Iterator it = manager_NotInCache.getManagedEmployees().iterator();
+        Iterator<Employee> it = manager_NotInCache.getManagedEmployees().iterator();
         while(it.hasNext()) {
-            Employee emp = (Employee)it.next();
+            Employee emp = it.next();
             if(emp.getId() == employee_1_NotInCache_id) {
                 if(!emp.getLastName().endsWith("_Updated")) {
                     errorMsg = errorMsg + "employee_1_NotInCache lastName NOT updated; ";
@@ -3878,7 +3877,7 @@
         }
         it = manager_InCache.getManagedEmployees().iterator();
         while(it.hasNext()) {
-            Employee emp = (Employee)it.next();
+            Employee emp = it.next();
             if(emp.getId() == employee_1_InCache_id) {
                 if(!emp.getLastName().endsWith("_Updated")) {
                     errorMsg = errorMsg + "employee_1_InCache lastName NOT updated; ";
@@ -3901,7 +3900,7 @@
         }
         it = manager_New.getManagedEmployees().iterator();
         while(it.hasNext()) {
-            Employee emp = (Employee)it.next();
+            Employee emp = it.next();
             if(emp.getId() == employee_2_NotInCache_id) {
                 if(!emp.getLastName().endsWith("_Updated")) {
                     errorMsg = errorMsg + "employee_2_NotInCache_id lastName NOT updated; ";
@@ -5419,7 +5418,7 @@
         EntityManager em = createEntityManager();
         beginTransaction(em);
         try {
-            Map m1 = em.getProperties();
+            Map<String, Object> m1 = em.getProperties();
             m1.remove("eclipselink.weaving");
         } catch (UnsupportedOperationException use) {
             return;
@@ -5977,12 +5976,12 @@
         query.setHint(QueryHints.BATCH_SIZE, "10");
 
         ReadAllQuery raq = (ReadAllQuery)query.getDatabaseQuery();
-        List expressions = raq.getBatchReadAttributeExpressions();
+        List<Expression> expressions = raq.getBatchReadAttributeExpressions();
         assertTrue(expressions.size() == 2);
-        Expression exp = (Expression)expressions.get(0);
+        Expression exp = expressions.get(0);
         assertTrue(exp.isQueryKeyExpression());
         assertTrue(exp.getName().equals("phoneNumbers"));
-        exp = (Expression)expressions.get(1);
+        exp = expressions.get(1);
         assertTrue(exp.isQueryKeyExpression());
         assertTrue(exp.getName().equals("phoneNumbers"));
 
@@ -10431,9 +10430,9 @@
             em = createEntityManager();
             beginTransaction(em);
             emp = em.find(Employee.class, id1);
-            Iterator it = emp.getManagedEmployees().iterator();
+            Iterator<Employee> it = emp.getManagedEmployees().iterator();
             while (it.hasNext()) {
-                Employee managedEmp = (Employee) it.next();
+                Employee managedEmp = it.next();
                 it.remove();
                 managedEmp.setManager(null);
                 em.remove(managedEmp);
@@ -11885,14 +11884,14 @@
             // if altering the test, make sure that emp still references (directly or through other objects) all the updated objects, so that all of them are copied.
             Map oldValueMap = copyGroupUpdated.getCopies();
             // using ChangeRecords bring back the original state of the object
-            Iterator itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
+            Iterator<Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet>> itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
             while(itChangeSets.hasNext()) {
-                Map.Entry entry = (Map.Entry)itChangeSets.next();
+                Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet> entry = itChangeSets.next();
                 Object object = entry.getKey();
                 ClassDescriptor descriptor = ss.getDescriptor(object);
                 if(!descriptor.isAggregateDescriptor()) {
-                    ObjectChangeSet changeSet = (ObjectChangeSet)entry.getValue();
-                    if(!((org.eclipse.persistence.internal.sessions.ObjectChangeSet)changeSet).shouldBeDeleted() && !changeSet.isNew()) {
+                    org.eclipse.persistence.internal.sessions.ObjectChangeSet changeSet = entry.getValue();
+                    if(!changeSet.shouldBeDeleted() && !changeSet.isNew()) {
                         List<ChangeRecord> changes = changeSet.getChanges();
                         if(changes != null && !changes.isEmpty()) {
                             Object oldValueObject = oldValueMap.get(object);
@@ -11910,12 +11909,12 @@
             // now compare oldValue objects with corresponding backup objects
             itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
             while(itChangeSets.hasNext()) {
-                Map.Entry entry = (Map.Entry)itChangeSets.next();
+                Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet> entry = itChangeSets.next();
                 Object object = entry.getKey();
                 ClassDescriptor descriptor = ss.getDescriptor(object);
                 if(!descriptor.isAggregateDescriptor()) {
-                    ObjectChangeSet changeSet = (ObjectChangeSet)entry.getValue();
-                    if(!((org.eclipse.persistence.internal.sessions.ObjectChangeSet)changeSet).shouldBeDeleted() && !changeSet.isNew()) {
+                    ObjectChangeSet changeSet = entry.getValue();
+                    if(!changeSet.shouldBeDeleted() && !changeSet.isNew()) {
                         List<ChangeRecord> changes = changeSet.getChanges();
                         if(changes != null && !changes.isEmpty()) {
                             Object oldValueObject = oldValueMap.get(object);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/JoinedAttributeAdvancedJunitTest.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/JoinedAttributeAdvancedJunitTest.java
index 32d9883..646f259 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/JoinedAttributeAdvancedJunitTest.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/JoinedAttributeAdvancedJunitTest.java
@@ -603,16 +603,16 @@
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("lastName").equal("Way").or(raq.getExpressionBuilder().get("lastName").equal("Jones")));
         Employee emp = (Employee)((Vector)getDbSession().executeQuery(raq)).firstElement();
         emp.getPhoneNumbers();
-        for (Iterator iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext();){
-            ((PhoneNumber)iterator.next()).getOwner();
+        for (Iterator<PhoneNumber> iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext();){
+            iterator.next().getOwner();
         }
 
         raq = new ReadAllQuery(Address.class);
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
         Address addr = (Address)((Vector)getDbSession().executeQuery(raq)).firstElement();
         addr.getEmployees();
-        for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext();){
-            ((Employee)iterator.next()).getAddress();
+        for (Iterator<Employee> iterator = addr.getEmployees().iterator(); iterator.hasNext();){
+            iterator.next().getAddress();
         }
 
         getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();
@@ -668,16 +668,16 @@
         raq.setSelectionCriteria(raq.getExpressionBuilder().notEmpty("phoneNumbers"));
         Employee emp = (Employee)((Vector)getDbSession().executeQuery(raq)).firstElement();
         emp.getPhoneNumbers();
-        for (Iterator iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext();){
-            ((PhoneNumber)iterator.next()).getOwner();
+        for (Iterator<PhoneNumber> iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext();){
+            iterator.next().getOwner();
         }
 
         raq = new ReadAllQuery(Address.class);
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
         Address addr = (Address)((Vector)getDbSession().executeQuery(raq)).firstElement();
         addr.getEmployees();
-        for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext();){
-            Employee addrEmp = (Employee)iterator.next();
+        for (Iterator<Employee> iterator = addr.getEmployees().iterator(); iterator.hasNext();){
+            Employee addrEmp = iterator.next();
             addrEmp.getAddress();
             addrEmp.getPhoneNumbers().size(); // as the report query will join in all phones to all emps, make sure we can compare.
         }
@@ -749,8 +749,8 @@
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
         Address addr = (Address)((Vector)getDbSession().executeQuery(raq)).firstElement();
         addr.getEmployees();
-        for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext();){
-            ((Employee)iterator.next()).getAddress();
+        for (Iterator<Employee> iterator = addr.getEmployees().iterator(); iterator.hasNext();){
+            iterator.next().getAddress();
         }
 
         getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();
@@ -900,8 +900,8 @@
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
         Address addr = (Address)((Vector)getDbSession().executeQuery(raq)).firstElement();
         addr.getEmployees();
-        for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext();){
-            ((Employee)iterator.next()).getAddress();
+        for (Iterator<Employee> iterator = addr.getEmployees().iterator(); iterator.hasNext();){
+            iterator.next().getAddress();
         }
 
         getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/PessimisticLockingExtendedScopeTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/PessimisticLockingExtendedScopeTestSuite.java
index 238589c..51a9106 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/PessimisticLockingExtendedScopeTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/PessimisticLockingExtendedScopeTestSuite.java
@@ -110,7 +110,7 @@
         }
         final EntyA a = new EntyA();
 
-        final Actor actor = new Actor<EntyA>() {
+        final Actor<EntyA> actor = new Actor<>() {
 
             @Override
             public void setup(EntityManager em) {
@@ -152,7 +152,7 @@
         }
         final EntyA a = new EntyA();
 
-        final Actor actor = new Actor<EntyA>() {
+        final Actor<EntyA> actor = new Actor<>() {
 
             @Override
             public void setup(EntityManager em) {
@@ -193,7 +193,7 @@
         }
         final Equipment eq = new Equipment();
 
-        final Actor actor = new Actor<Equipment>() {
+        final Actor<Equipment> actor = new Actor<>() {
 
             @Override
             public void setup(EntityManager em) {
@@ -241,7 +241,7 @@
         }
         final Employee emp = new Employee();
 
-        final Actor actor = new Actor<Employee>() {
+        final Actor<Employee> actor = new Actor<>() {
 
             @Override
             public void setup(EntityManager em) {
@@ -282,7 +282,7 @@
         }
         final EntyA entyA = new EntyA();
 
-        final Actor actor = new Actor<EntyA>() {
+        final Actor<EntyA> actor = new Actor<>() {
 
             @Override
             public void setup(EntityManager em) {
@@ -333,7 +333,7 @@
         }
         final EntyA entyA = new EntyA();
 
-        final Actor actor = new Actor<EntyA>() {
+        final Actor<EntyA> actor = new Actor<>() {
 
             @Override
             public void setup(EntityManager em) {
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/fetchgroup/AdvancedFetchGroupJunitTest.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/fetchgroup/AdvancedFetchGroupJunitTest.java
index 862e60c..0a31dbd 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/fetchgroup/AdvancedFetchGroupJunitTest.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/advanced/fetchgroup/AdvancedFetchGroupJunitTest.java
@@ -29,9 +29,7 @@
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.descriptors.FetchGroupManager;
-import org.eclipse.persistence.internal.jpa.EntityManagerImpl;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
-import org.eclipse.persistence.sessions.UnitOfWork;
 import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
 import org.eclipse.persistence.testing.models.jpa.advanced.fetchgroup.AdvancedFetchGroupTableCreator;
 import org.eclipse.persistence.testing.models.jpa.advanced.fetchgroup.ChestProtector;
@@ -146,8 +144,8 @@
             EntityManager em = createEntityManager();
             Map properties = new HashMap();
             properties.put(QueryHints.FETCH_GROUP_NAME, "HeightAndWidth");
-            Class PadsClass = Pads.class;
-            Pads pads = (Pads) em.find(PadsClass, padsId, properties);
+            Class<Pads> PadsClass = Pads.class;
+            Pads pads = em.find(PadsClass, padsId, properties);
 
             try {
                 verifyFetchedField(PadsClass.getDeclaredField("height"), pads, 35.5);
@@ -170,8 +168,8 @@
             EntityManager em = createEntityManager();
             Map properties = new HashMap();
             properties.put(QueryHints.FETCH_GROUP_NAME, "AgeGroup");
-            Class chestProtectorClass = ChestProtector.class;
-            ChestProtector chestProtector = (ChestProtector) em.find(chestProtectorClass, chestProtectorId, properties);
+            Class<ChestProtector> chestProtectorClass = ChestProtector.class;
+            ChestProtector chestProtector = em.find(chestProtectorClass, chestProtectorId, properties);
 
             try {
                 verifyFetchedField(chestProtectorClass.getField("ageGroup"), chestProtector, AgeGroup.INTERMEDIATE);
@@ -192,8 +190,8 @@
             EntityManager em = createEntityManager();
             Map properties = new HashMap();
             properties.put(QueryHints.FETCH_GROUP_NAME, "MSRP");
-            Class PadsClass = Pads.class;
-            Pads pads = (Pads) em.find(PadsClass, padsId, properties);
+            Class<Pads> PadsClass = Pads.class;
+            Pads pads = em.find(PadsClass, padsId, properties);
 
             try {
                 verifyFetchedField(PadsClass.getField("msrp"), pads, 999.99);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/beanvalidation/BeanValidationJunitTest.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/beanvalidation/BeanValidationJunitTest.java
index c7e068ff..8d465c9 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/beanvalidation/BeanValidationJunitTest.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/beanvalidation/BeanValidationJunitTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2009, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2009, 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 @@
         } catch (ConstraintViolationException e) {
             assertTrue("Transaction not marked for roll back when ConstraintViolation is thrown", getRollbackOnly(em)) ;
             Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
-            ConstraintViolation constraintViolation = constraintViolations.iterator().next();
+            ConstraintViolation<?> constraintViolation = constraintViolations.iterator().next();
             Object invalidValue = constraintViolation.getInvalidValue();
             assertTrue("Invalid value should be " + invalidName, invalidName.equals(invalidValue));
             gotConstraintViolations = true;
@@ -166,7 +166,7 @@
         } catch (ConstraintViolationException e) {
             assertTrue("Transaction not marked for roll back when ConstraintViolation is thrown", getRollbackOnly(em)) ;
             Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
-            ConstraintViolation constraintViolation = constraintViolations.iterator().next();
+            ConstraintViolation<?> constraintViolation = constraintViolations.iterator().next();
             Object invalidValue = constraintViolation.getInvalidValue();
             assertTrue("Invalid value should be " + invalidName, invalidName.equals(invalidValue));
             gotConstraintViolations = true;
@@ -204,7 +204,7 @@
         } catch (ConstraintViolationException e) {
             assertTrue("Transaction not marked for roll back when ConstraintViolation is thrown", getRollbackOnly(em)) ;
             Set<ConstraintViolation<?>> constraintViolations = e.getConstraintViolations();
-            ConstraintViolation constraintViolation = constraintViolations.iterator().next();
+            ConstraintViolation<?> constraintViolation = constraintViolations.iterator().next();
             Object invalidValue = constraintViolation.getInvalidValue();
             assertTrue("Invalid value should be " + low_salary, invalidName.equals(invalidValue));
             gotConstraintViolations = true;
@@ -269,17 +269,17 @@
             commitTransaction(em);
           } catch (RuntimeException e) {
             assertFalse("Transaction not marked for roll back when ConstraintViolation is thrown", isTransactionActive(em));;
-            Object cause = e.getCause();
+            Throwable cause = e.getCause();
             while(cause != null) {
                 if (cause instanceof ConstraintViolationException){
                     ConstraintViolationException cve = (ConstraintViolationException)cause;
                     Set<ConstraintViolation<?>> constraintViolations = cve.getConstraintViolations();
-                    ConstraintViolation constraintViolation = constraintViolations.iterator().next();
+                    ConstraintViolation<?> constraintViolation = constraintViolations.iterator().next();
                     assertTrue("Invalid value should be " + invalidName, invalidName.equals(constraintViolation.getInvalidValue() ) );
                     gotConstraintViolations = true;
                     break;
                 }else
-                    cause = ((Throwable)cause).getCause();
+                    cause = cause.getCause();
             }
         } finally {
             if (isTransactionActive(em)) {
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/complexaggregate/ComplexAggregateTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/complexaggregate/ComplexAggregateTestSuite.java
index c4d9d1c..56e3b11 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/complexaggregate/ComplexAggregateTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/complexaggregate/ComplexAggregateTestSuite.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,7 +34,6 @@
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.descriptors.changetracking.ChangeTracker;
 import org.eclipse.persistence.internal.descriptors.changetracking.AttributeChangeListener;
-import org.eclipse.persistence.internal.helper.Helper;
 import org.eclipse.persistence.jpa.JpaHelper;
 import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
 import org.eclipse.persistence.testing.framework.JoinedAttributeTestHelper;
@@ -322,9 +321,9 @@
 
             World w = em.find(World.class, world.getId());
 
-            Collection css = w.getCitySlickers();
+            Collection<CitySlicker> css = w.getCitySlickers();
             css.toString();
-            Collection cds = w.getCountryDwellers();
+            Collection<CountryDweller> cds = w.getCountryDwellers();
             cds.toString();
 
             // Check the ordering
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
index 9d8469a..2830c0f 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/composite/advanced/EntityManagerJUnitTestSuite.java
@@ -70,7 +70,6 @@
 import jakarta.persistence.spi.LoadState;
 import jakarta.persistence.spi.ProviderUtil;
 
-import junit.framework.TestCase;
 import org.eclipse.persistence.config.CacheUsage;
 import org.eclipse.persistence.config.CacheUsageIndirectionPolicy;
 import org.eclipse.persistence.config.CascadePolicy;
@@ -105,6 +104,7 @@
 import org.eclipse.persistence.internal.jpa.jdbc.DataSourceImpl;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.internal.sessions.DatabaseSessionImpl;
+import org.eclipse.persistence.internal.sessions.ObjectChangeSet;
 import org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork;
 import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
 import org.eclipse.persistence.internal.weaving.PersistenceWeaved;
@@ -115,7 +115,6 @@
 import org.eclipse.persistence.jpa.JpaQuery;
 import org.eclipse.persistence.jpa.PersistenceProvider;
 import org.eclipse.persistence.logging.SessionLog;
-import org.eclipse.persistence.mappings.AggregateObjectMapping;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.platform.server.was.WebSphere_7_Platform;
 import org.eclipse.persistence.queries.CursoredStreamPolicy;
@@ -145,7 +144,6 @@
 import org.eclipse.persistence.sessions.UnitOfWork;
 import org.eclipse.persistence.sessions.broker.SessionBroker;
 import org.eclipse.persistence.sessions.changesets.ChangeRecord;
-import org.eclipse.persistence.sessions.changesets.ObjectChangeSet;
 import org.eclipse.persistence.sessions.changesets.UnitOfWorkChangeSet;
 import org.eclipse.persistence.sessions.server.ClientSession;
 import org.eclipse.persistence.sessions.server.ConnectionPolicy;
@@ -3828,9 +3826,9 @@
         if(!manager_NotInCache.getLastName().endsWith("_Updated")) {
             errorMsg = errorMsg + "manager_NotInCache lastName NOT updated; ";
         }
-        Iterator it = manager_NotInCache.getManagedEmployees().iterator();
+        Iterator<Employee> it = manager_NotInCache.getManagedEmployees().iterator();
         while(it.hasNext()) {
-            Employee emp = (Employee)it.next();
+            Employee emp = it.next();
             if(emp.getId() == employee_1_NotInCache_id) {
                 if(!emp.getLastName().endsWith("_Updated")) {
                     errorMsg = errorMsg + "employee_1_NotInCache lastName NOT updated; ";
@@ -3853,7 +3851,7 @@
         }
         it = manager_InCache.getManagedEmployees().iterator();
         while(it.hasNext()) {
-            Employee emp = (Employee)it.next();
+            Employee emp = it.next();
             if(emp.getId() == employee_1_InCache_id) {
                 if(!emp.getLastName().endsWith("_Updated")) {
                     errorMsg = errorMsg + "employee_1_InCache lastName NOT updated; ";
@@ -3876,7 +3874,7 @@
         }
         it = manager_New.getManagedEmployees().iterator();
         while(it.hasNext()) {
-            Employee emp = (Employee)it.next();
+            Employee emp = it.next();
             if(emp.getId() == employee_2_NotInCache_id) {
                 if(!emp.getLastName().endsWith("_Updated")) {
                     errorMsg = errorMsg + "employee_2_NotInCache_id lastName NOT updated; ";
@@ -4922,7 +4920,7 @@
         EntityManager em = createEntityManager();
         beginTransaction(em);
         try {
-            Map m1 = em.getProperties();
+            Map<String, Object> m1 = em.getProperties();
             m1.remove("eclipselink.weaving");
         } catch (UnsupportedOperationException use) {
             return;
@@ -5380,12 +5378,12 @@
         query.setHint(QueryHints.BATCH_SIZE, "10");
 
         ReadAllQuery raq = (ReadAllQuery)query.getDatabaseQuery();
-        List expressions = raq.getBatchReadAttributeExpressions();
+        List<Expression> expressions = raq.getBatchReadAttributeExpressions();
         assertTrue(expressions.size() == 2);
-        Expression exp = (Expression)expressions.get(0);
+        Expression exp = expressions.get(0);
         assertTrue(exp.isQueryKeyExpression());
         assertTrue(exp.getName().equals("phoneNumbers"));
-        exp = (Expression)expressions.get(1);
+        exp = expressions.get(1);
         assertTrue(exp.isQueryKeyExpression());
         assertTrue(exp.getName().equals("phoneNumbers"));
 
@@ -5400,9 +5398,9 @@
 
         beginTransaction(em);
         emp = em.find(Employee.class, id1);
-        Iterator it = emp.getManagedEmployees().iterator();
+        Iterator<Employee> it = emp.getManagedEmployees().iterator();
         while (it.hasNext()){
-            Employee managedEmp = (Employee)it.next();
+            Employee managedEmp = it.next();
             it.remove();
             managedEmp.setManager(null);
             em.remove(managedEmp);
@@ -5494,9 +5492,9 @@
 
         beginTransaction(em);
         emp = em.find(Employee.class, id1);
-        Iterator it = emp.getManagedEmployees().iterator();
+        Iterator<Employee> it = emp.getManagedEmployees().iterator();
         while (it.hasNext()){
-            Employee managedEmp = (Employee)it.next();
+            Employee managedEmp = it.next();
             it.remove();
             managedEmp.setManager(null);
             em.remove(managedEmp);
@@ -9320,9 +9318,9 @@
             beginTransaction(em);
             try {
                 emp = em.find(Employee.class, id1);
-                Iterator it = emp.getManagedEmployees().iterator();
+                Iterator<Employee> it = emp.getManagedEmployees().iterator();
                 while (it.hasNext()) {
-                    Employee managedEmp = (Employee) it.next();
+                    Employee managedEmp = it.next();
                     it.remove();
                     managedEmp.setManager(null);
                     em.remove(managedEmp);
@@ -10341,14 +10339,14 @@
             // if altering the test, make sure that emp still references (directly or through other objects) all the updated objects, so that all of them are copied.
             Map oldValueMap = copyGroupUpdated.getCopies();
             // using ChangeRecords bring back the original state of the object
-            Iterator itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
+            Iterator<Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet>> itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
             while(itChangeSets.hasNext()) {
-                Map.Entry entry = (Map.Entry)itChangeSets.next();
+                Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet> entry = itChangeSets.next();
                 Object object = entry.getKey();
                 ClassDescriptor descriptor = dbs.getDescriptor(object);
                 if(!descriptor.isAggregateDescriptor()) {
-                    ObjectChangeSet changeSet = (ObjectChangeSet)entry.getValue();
-                    if(!((org.eclipse.persistence.internal.sessions.ObjectChangeSet)changeSet).shouldBeDeleted() && !changeSet.isNew()) {
+                    org.eclipse.persistence.internal.sessions.ObjectChangeSet changeSet = entry.getValue();
+                    if(!changeSet.shouldBeDeleted() && !changeSet.isNew()) {
                         List<ChangeRecord> changes = changeSet.getChanges();
                         if(changes != null && !changes.isEmpty()) {
                             Object oldValueObject = oldValueMap.get(object);
@@ -10366,12 +10364,12 @@
             // now compare oldValue objects with corresponding backup objects
             itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
             while(itChangeSets.hasNext()) {
-                Map.Entry entry = (Map.Entry)itChangeSets.next();
+                Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet> entry = itChangeSets.next();
                 Object object = entry.getKey();
                 ClassDescriptor descriptor = dbs.getDescriptor(object);
                 if(!descriptor.isAggregateDescriptor()) {
-                    ObjectChangeSet changeSet = (ObjectChangeSet)entry.getValue();
-                    if(!((org.eclipse.persistence.internal.sessions.ObjectChangeSet)changeSet).shouldBeDeleted() && !changeSet.isNew()) {
+                    ObjectChangeSet changeSet = entry.getValue();
+                    if(!changeSet.shouldBeDeleted() && !changeSet.isNew()) {
                         List<ChangeRecord> changes = changeSet.getChanges();
                         if(changes != null && !changes.isEmpty()) {
                             Object oldValueObject = oldValueMap.get(object);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/config/ConfigPUTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/config/ConfigPUTestSuite.java
index a43dcb6..aff6d2f 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/config/ConfigPUTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/config/ConfigPUTestSuite.java
@@ -92,7 +92,7 @@
         PersistenceUnit pu = new PersistenceUnitImpl("ConfigPUTestSuite", Thread.currentThread().getContextClassLoader());
 
         // Need to get the user specified database properties.
-        Map properties = JUnitTestCaseHelper.getDatabaseProperties();
+        Map<String, String> properties = JUnitTestCaseHelper.getDatabaseProperties();
         pu.setProperty(JDBC_DRIVER, properties.get(JDBC_DRIVER));
         pu.setProperty(JDBC_URL, properties.get(JDBC_URL));
         pu.setProperty(JDBC_USER, properties.get(JDBC_USER));
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/AdvancedCriteriaQueryTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/AdvancedCriteriaQueryTestSuite.java
index 6d237cc..7dab206 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/AdvancedCriteriaQueryTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/AdvancedCriteriaQueryTestSuite.java
@@ -244,7 +244,7 @@
             counter = new QuerySQLTracker(getServerSession());
             // Query by primary key.
             CriteriaQuery<Tuple> cq = qb.createQuery(Tuple.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.multiselect(from.get("id"), from.get("firstName"));
             cq.where(qb.and(qb.equal(from.get("id"), qb.parameter(from.get("id").getModel().getBindableJavaType(), "id")), qb.equal(from.get("firstName"), qb.parameter(from.get("firstName").getModel().getBindableJavaType(), "firstName"))));
             TypedQuery<Tuple> typedQuery = em.createQuery(cq);
@@ -473,7 +473,7 @@
             CriteriaBuilder qbuilder = em.getCriteriaBuilder();
             CriteriaQuery<Employee> cquery =qbuilder.createQuery(Employee.class);
             Root<Employee> emp = cquery.from(Employee.class);
-            ParameterExpression pe = qbuilder.parameter(java.util.Collection.class, "param");
+            ParameterExpression<Collection> pe = qbuilder.parameter(java.util.Collection.class, "param");
             cquery.where(emp.join("responsibilities").in(pe));
             List<Employee> result = em.createQuery(cquery).setParameter("param",respons).getResultList();
             assertFalse("testInParameterCollection failed: No Employees were returned", result.isEmpty());
@@ -1682,7 +1682,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(0);
@@ -1691,7 +1691,7 @@
             counter = new QuerySQLTracker(getServerSession());
             // Query by primary key.
             cq = qb.createQuery(Employee.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("id"), qb.parameter(from.get("id").getModel().getBindableJavaType(), "id")));
             query = em.createQuery(cq);
             query.setHint(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheByExactPrimaryKey);
@@ -1780,7 +1780,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(result.size() - 1);
@@ -1789,7 +1789,7 @@
             counter = new QuerySQLTracker(getServerSession());
             // Query by primary key.
             cq = qb.createQuery(Employee.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("firstName"), qb.parameter(from.get("firstName").getModel().getBindableJavaType(), "firstName")));
             query = em.createQuery(cq);
             query.setHint(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheThenDatabase);
@@ -1819,7 +1819,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(result.size() - 1);
@@ -1828,7 +1828,7 @@
             counter = new QuerySQLTracker(getServerSession());
             // Query by primary key.
             cq = qb.createQuery(Employee.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("firstName"), qb.parameter(from.get("firstName").getModel().getBindableJavaType(), "firstName")));
             query = em.createQuery(cq);
             query.setHint(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheOnly);
@@ -1856,7 +1856,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(result.size() - 1);
@@ -1869,7 +1869,7 @@
             em = createEntityManager();
             beginTransaction(em);
             cq = qb.createQuery(Employee.class);
-             Root from = cq.from(Employee.class);
+             Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("id"), qb.parameter(from.get("id").getModel().getBindableJavaType(), "id")));
             query = em.createQuery(cq);
             query.setHint(QueryHints.QUERY_TYPE, QueryType.ReadObject);
@@ -1917,8 +1917,8 @@
             CriteriaBuilder qbuilder = em.getCriteriaBuilder();
             CriteriaQuery<Employee> cquery = qbuilder.createQuery(Employee.class);
             Root<Employee> customer = cquery.from(Employee.class);
-            Path pathToIgnore = customer.get("manager").get("address");
-            Join manager = customer.join("manager", JoinType.LEFT);
+            Path<Object> pathToIgnore = customer.get("manager").get("address");
+            Join<Object, Object> manager = customer.join("manager", JoinType.LEFT);
 
             TypedQuery<Employee> tquery = em.createQuery(cquery);
             List<Employee> result = tquery.getResultList();
@@ -1942,7 +1942,7 @@
             CriteriaBuilder qbuilder = em.getCriteriaBuilder();
             CriteriaQuery<Employee> cquery = qbuilder.createQuery(Employee.class);
             Root<Employee> customer = cquery.from(Employee.class);
-            Path pathToIgnore = customer.get("manager").get("address");
+            Path<Object> pathToIgnore = customer.get("manager").get("address");
             customer.fetch("manager", JoinType.LEFT);
 
             TypedQuery<Employee> tquery = em.createQuery(cquery);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/AdvancedQueryTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/AdvancedQueryTestSuite.java
index cedf268..31bf9f3 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/AdvancedQueryTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/AdvancedQueryTestSuite.java
@@ -145,7 +145,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(0);
@@ -195,7 +195,7 @@
             counter = new QuerySQLTracker(getServerSession());
             // Query by primary key.
             CriteriaQuery<Tuple> cq = qb.createQuery(Tuple.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.multiselect(from.get("id"), from.get("firstName"));
             cq.where(qb.and(qb.equal(from.get("id"), qb.parameter(from.get("id").getModel().getBindableJavaType(), "id")), qb.equal(from.get("firstName"), qb.parameter(from.get("firstName").getModel().getBindableJavaType(), "firstName"))));
             TypedQuery<Tuple> typedQuery = em.createQuery(cq);
@@ -426,7 +426,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(0);
@@ -435,7 +435,7 @@
             counter = new QuerySQLTracker(getServerSession());
             // Query by primary key.
             cq = qb.createQuery(Employee.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("id"), qb.parameter(from.get("id").getModel().getBindableJavaType(), "id")));
             query = em.createQuery(cq);
             query.setHint(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheByExactPrimaryKey);
@@ -465,7 +465,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(result.size() - 1);
@@ -474,7 +474,7 @@
             counter = new QuerySQLTracker(getServerSession());
             // Query by primary key.
             cq = qb.createQuery(Employee.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("firstName"), qb.parameter(from.get("firstName").getModel().getBindableJavaType(), "firstName")));
             query = em.createQuery(cq);
             query.setHint(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheThenDatabase);
@@ -504,7 +504,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(result.size() - 1);
@@ -513,7 +513,7 @@
             counter = new QuerySQLTracker(getServerSession());
             // Query by primary key.
             cq = qb.createQuery(Employee.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("firstName"), qb.parameter(from.get("firstName").getModel().getBindableJavaType(), "firstName")));
             query = em.createQuery(cq);
             query.setHint(QueryHints.CACHE_USAGE, CacheUsage.CheckCacheOnly);
@@ -541,7 +541,7 @@
         try {
             // Load an employee into the cache.
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Query query = em.createQuery(cq);
             List result = query.getResultList();
             Employee employee = (Employee)result.get(result.size() - 1);
@@ -554,7 +554,7 @@
             em = createEntityManager();
             beginTransaction(em);
             cq = qb.createQuery(Employee.class);
-             Root from = cq.from(Employee.class);
+             Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("id"), qb.parameter(from.get("id").getModel().getBindableJavaType(), "id")));
             query = em.createQuery(cq);
             query.setHint(QueryHints.QUERY_TYPE, QueryType.ReadObject);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaSimpleTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaSimpleTestSuite.java
index acf19b9..073ba4e 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaSimpleTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaSimpleTestSuite.java
@@ -160,7 +160,7 @@
             int numRead = emps.size();
 
             // "SELECT e FROM Employee e WHERE :arg1=:arg2");
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             cq.where(qb.equal(qb.parameter(Integer.class, "arg1"), qb.parameter(Integer.class, "arg2")));
             query = em.createQuery(cq);
 
@@ -192,7 +192,7 @@
             int numRead = emps.size();
 
             // "SELECT e FROM Employee e WHERE 1=1");
-            CriteriaQuery cq = qb.createQuery(Employee.class);
+            CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             cq.where(qb.equal(qb.literal(1), 1));
             emps = em.createQuery(cq).getResultList();
 
@@ -221,8 +221,8 @@
         CriteriaQuery<Tuple> criteria = qb.createTupleQuery();
 
         Root<Employee> emp = criteria.from(Employee.class);
-        Path unusedTupleElement = emp.get("normalHours"); // Receives IllegalArgumentException if metamodel is used
-        Path lastName = emp.get("lastName");
+        Path<Object> unusedTupleElement = emp.get("normalHours"); // Receives IllegalArgumentException if metamodel is used
+        Path<Object> lastName = emp.get("lastName");
         criteria.multiselect(lastName, emp.get("firstName"));
 
         TypedQuery<Tuple> query = em.createQuery(criteria);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaSimpleTestSuiteBase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaSimpleTestSuiteBase.java
index 3412de8..b845553 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaSimpleTestSuiteBase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaSimpleTestSuiteBase.java
@@ -371,7 +371,7 @@
         CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
         Root<Employee> root = wrapper.from(cq, Employee.class);
         wrapper.fetch(root, Employee_phoneNumbers, JoinType.LEFT);
-        List result = em.createQuery(cq).getResultList();
+        List<Employee> result = em.createQuery(cq).getResultList();
 
         ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
         ObjectOutputStream stream = new ObjectOutputStream(byteStream);
@@ -455,7 +455,7 @@
             clearCache();
 
             //"SELECT OBJECT(emp) FROM Employee emp"
-            List result = em.createQuery(em.getCriteriaBuilder().createQuery(Employee.class)).getResultList();
+            List<Employee> result = em.createQuery(em.getCriteriaBuilder().createQuery(Employee.class)).getResultList();
 
             assertTrue("Base Test Case Failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -479,7 +479,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where(qb.equal( qb.abs(wrapper.get(root, Employee_salary)), expectedResult.getSalary()) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("ABS test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -515,7 +515,7 @@
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.between(wrapper.<Employee,Comparable>get(root, Employee_id),
                     qb.<Comparable>literal(empId), qb.<Comparable>literal(employee.getId()) ) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Between test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -544,7 +544,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.equal(wrapper.get(root, Employee_firstName), qb.concat(qb.literal(partOne), qb.literal(partTwo))) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Concat test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -610,7 +610,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.like(qb.concat(wrapper.get(root, Employee_firstName), qb.literal("Smith") ), partOne+"Smith") );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Concat test with constraints failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -645,7 +645,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.like(qb.concat("Smith", wrapper.get(root, Employee_firstName) ), "Smith" + partOne) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Concat test with constraints failed" , comparer.compareObjects(result, expectedResult));
         } finally {
@@ -681,7 +681,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Long> result = em.createQuery(cq).getResultList();
             System.out.println(" results are :"+result);
 
             qb = em.getCriteriaBuilder();
@@ -717,7 +717,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.equal( wrapper.get(root, Employee_firstName), qb.concat(qb.literal(partOne), qb.concat( qb.literal(partTwo), qb.literal(partThree)) ) ) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Concat test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -776,7 +776,7 @@
             cq.where( qb.equal(wrapper.get(root, Employee_lastName), qb.literal(emp.getLastName())));
             beginTransaction(em);
             try {
-                List result = em.createQuery(cq).getResultList();
+                List<String> result = em.createQuery(cq).getResultList();
 
                 assertTrue("Failed to return null value", result.contains(null));
             } finally {
@@ -852,7 +852,7 @@
             Root<Employee> root = wrapper.from(cq, Employee.class);
             Predicate firstOr = qb.or(qb.equal(wrapper.get(root, Employee_id), emp1.getId()), qb.equal(wrapper.get(root, Employee_id), emp2.getId()));
             cq.where( qb.or(firstOr, qb.equal(wrapper.get(root, Employee_id), emp3.getId())) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Double OR test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -877,7 +877,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.equal(wrapper.get(root, Employee_firstName), expectedResult.getFirstName() ) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Equals test failed", comparer.compareObjects(expectedResult, result));
         } finally {
@@ -905,7 +905,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Join<Employee, Employee> managedEmp =  wrapper.join(wrapper.from(cq, Employee.class), Employee_managedEmployees);
             cq.where( qb.equal(wrapper.get((Path) wrapper.get(managedEmp, Employee_address), Address_city), "Ottawa" ) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Equals test with Join failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -933,7 +933,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Join<Employee,PhoneNumber> phones = wrapper.join(wrapper.from(cq, Employee.class), Employee_phoneNumbers);
             cq.where( qb.equal(phones, qb.parameter(PhoneNumber.class, "1") ) );
-            List result = em.createQuery(cq).setParameter("1", phoneNumber).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("1", phoneNumber).getResultList();
 
             assertTrue("CollectionMemberIdentifierEqualsTest failed", comparer.compareObjects(expectedResult, result));
         } finally {
@@ -956,7 +956,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.equal(root, qb.parameter(Employee.class, "1") ) );
-            List result = em.createQuery(cq).setParameter("1", expectedResult).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("1", expectedResult).getResultList();
 
             assertTrue("abstractSchemaIdentifierEqualsTest failed", comparer.compareObjects(expectedResult, result));
         } finally {
@@ -983,7 +983,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.notEqual(root, qb.parameter(Employee.class, "1") ) );
-            List result = em.createQuery(cq).setParameter("1", emp).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("1", emp).getResultList();
 
             assertTrue("abstractSchemaIdentifierNotEqualsTest failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1019,7 +1019,7 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = wrapper.from(cq, Employee.class);
-            Join phone = wrapper.join(root, Employee_phoneNumbers);
+            Join<Employee, Object> phone = wrapper.join(root, Employee_phoneNumbers);
             Predicate firstAnd = qb.and( qb.equal(wrapper.get(phone, PhoneNumber_areaCode), empPhoneNumbers.getAreaCode()),
                     qb.equal(wrapper.get(root, Employee_firstName), expectedResult.getFirstName()));
             cq.where( qb.and(firstAnd, qb.equal(wrapper.get(root, Employee_lastName), expectedResult.getLastName())) );
@@ -1064,7 +1064,7 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             cq.where( qb.in(wrapper.get(wrapper.from(cq, Employee.class), Employee_id)).value(expectedResult.getId()) );
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple In Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1089,7 +1089,7 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             cq.where(wrapper.get(wrapper.from(cq, Employee.class), Employee_id).in(qb.parameter(List.class, "result")));
-            List result = em.createQuery(cq).setParameter("result", expectedResultList).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("result", expectedResultList).getResultList();
 
             assertTrue("Simple In Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1117,7 +1117,7 @@
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.equal( qb.length(wrapper.get(root, Employee_firstName)) , expectedResult.getFirstName().length()) );
 
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Length Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1142,7 +1142,7 @@
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.like( wrapper.get(root, Employee_firstName), partialFirstName) );
 
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Like Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1175,7 +1175,7 @@
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.like( wrapper.get(root, Employee_firstName), qb.parameter(String.class, "1")) );
 
-            List result = em.createQuery(cq).setParameter("1", partialFirstName).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("1", partialFirstName).getResultList();
 
             assertTrue("Simple Like Test with Parameter failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1220,7 +1220,7 @@
         }
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).setParameter("pattern", patternString).setParameter("esc", escChar).getResultList();
+            List<Address> result = em.createQuery(cq).setParameter("pattern", patternString).setParameter("esc", escChar).getResultList();
 
             assertTrue("Simple Escape Underscore test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1254,7 +1254,7 @@
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.not(qb.between(wrapper.get(root, Employee_id), emp1.getId(), emp2.getId())) );
 
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Not Between Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1280,7 +1280,7 @@
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             cq.where( qb.notEqual(wrapper.get(wrapper.from(cq, Employee.class), Employee_id), emp.getId()) );
 
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Like Test with Parameter failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1315,7 +1315,7 @@
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.not(qb.in(wrapper.get(root, Employee_id)).value(emp.getId())) );
 
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Not In Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1349,7 +1349,7 @@
             Root<Employee> root = wrapper.from(cq, Employee.class);
             cq.where( qb.notLike(wrapper.get(root, Employee_firstName), partialFirstName ) );
 
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Not Like Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1377,7 +1377,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Or followed by And Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1404,13 +1404,13 @@
         CriteriaBuilder qb = em.getCriteriaBuilder();
         CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
         Root<Employee> root = wrapper.from(cq, Employee.class);
-        jakarta.persistence.criteria.Expression empFName = wrapper.get(root, Employee_firstName);
+        jakarta.persistence.criteria.Expression<Object> empFName = wrapper.get(root, Employee_firstName);
         Predicate andOpp = qb.and(qb.equal(empFName, "Bob"), qb.equal(wrapper.get(root, Employee_lastName), "Smith"));
         cq.where( qb.or( qb.equal(empFName, "John"), andOpp ) );
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Or followed by And With Static Names Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1432,12 +1432,12 @@
         //"SELECT OBJECT(emp) FROM Employee emp WHERE emp.id = " + emp1.getId() + "OR emp.id = " + emp2.getId()
         CriteriaBuilder qb = em.getCriteriaBuilder();
         CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
-        jakarta.persistence.criteria.Expression empId = wrapper.get(wrapper.from(cq, Employee.class), Employee_id);
+        jakarta.persistence.criteria.Expression<Object> empId = wrapper.get(wrapper.from(cq, Employee.class), Employee_id);
         cq.where( qb.or( qb.equal(empId, emp1.getId()), qb.equal(empId, emp2.getId()) ) );
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
             clearCache();
 
             assertTrue("Simple Or Test failed", comparer.compareObjects(result, expectedResult));
@@ -1476,7 +1476,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).setParameter(parameterName, expectedResult.getFirstName()).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter(parameterName, expectedResult.getFirstName()).getResultList();
 
             assertTrue("Simple Parameter Test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1552,7 +1552,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Reverse Abs test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1579,7 +1579,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Reverse Concat test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1602,7 +1602,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Reverse Equals test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1625,7 +1625,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Reverse Length test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1664,7 +1664,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).setParameter("1", parameters.get(0)).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("1", parameters.get(0)).getResultList();
 
             assertTrue("Simple Reverse Parameter test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1701,7 +1701,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Reverse Square Root test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1729,7 +1729,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Reverse SubString test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1766,7 +1766,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Square Root test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -1791,7 +1791,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
             assertTrue("Simple SubString test failed", comparer.compareObjects(result, expectedResult));
         } finally {
             rollbackTransaction(em);
@@ -1988,7 +1988,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Mod test failed", comparer.compareObjects(result, expectedResult));
 
@@ -2034,7 +2034,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Is empty test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2064,7 +2064,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple is not empty test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2108,7 +2108,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Address> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Escape Underscore test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2138,7 +2138,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple small Project Member Of Projects test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2175,7 +2175,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).setParameter("1", smallProject).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("1", smallProject).getResultList();
 
             assertTrue("Simple small Project NOT Member Of Projects test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2208,7 +2208,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Long> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Select Count One To One test failed", expectedResult.elementAt(0).equals(result.get(0)));
         } finally {
@@ -2244,7 +2244,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Address> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple Select One To One test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2281,7 +2281,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<PhoneNumber> result = em.createQuery(cq).getResultList();
 
             assertTrue("Simple select Phonenumber Declared In IN Clause test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2372,7 +2372,7 @@
         sq.select(qb.min(subroot.<Number>get("number")));//number is a string? not sure this will work.
 
         Root<Employee> root = wrapper.from(cq, Employee.class);
-        Join phone = wrapper.join(root, Employee_phoneNumbers);
+        Join<Employee, Object> phone = wrapper.join(root, Employee_phoneNumbers);
         cq.where(qb.equal(wrapper.get(phone, PhoneNumber_number), qb.all(sq)));
 
         beginTransaction(em);
@@ -2539,7 +2539,7 @@
                 qb.parameter(BigDecimal.class, "1").as(Comparable.class), qb.parameter(Integer.class, "2").as(Comparable.class)));
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).setParameter("1", empId1).setParameter("2", emp2.getId()).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("1", empId1).setParameter("2", emp2.getId()).getResultList();
 
             assertTrue("Simple select between with parameter test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2582,7 +2582,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).setParameter("1", empId1).setParameter("2", emp2.getId()).getResultList();
+            List<Employee> result = em.createQuery(cq).setParameter("1", empId1).setParameter("2", emp2.getId()).getResultList();
 
             assertTrue("Simple select between with parameter test failed", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2602,7 +2602,7 @@
         cq.where(qb.equal(wrapper.get(wrapper.from(cq, Employee.class), Employee_status), Employee.EmployeeStatus.FULL_TIME));
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
             result.size();
         } finally {
             rollbackTransaction(em);
@@ -2624,7 +2624,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Project> result = em.createQuery(cq).getResultList();
 
             assertTrue("SimpleTypeTest", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2655,7 +2655,7 @@
         cq.orderBy(qb.asc(wrapper.get(root, Employee_firstName)));
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<String> result = em.createQuery(cq).getResultList();
 
             assertTrue("SimpleTypeTest", comparer.compareObjects(result, expectedResult));
         } finally {
@@ -2674,10 +2674,10 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect number of results returned.", result.size() == 1);
-            assertTrue("Incorrect Employee returned", ((Employee)result.get(0)).getFirstName().equals("Bob"));
+            assertTrue("Incorrect Employee returned", result.get(0).getFirstName().equals("Bob"));
 
         } finally {
             rollbackTransaction(em);
@@ -2701,7 +2701,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Object> result = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect number of results returned.", result.size() == 1);
             assertTrue("Incorrect Employee returned", result.get(0).equals("Bob"));
@@ -2725,10 +2725,10 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect number of results returned.", result.size() == 1);
-            assertTrue("Incorrect Employee returned", ((Employee)result.get(0)).getFirstName().equals("Bob"));
+            assertTrue("Incorrect Employee returned", result.get(0).getFirstName().equals("Bob"));
         } finally {
             rollbackTransaction(em);
             closeEntityManager(em);
@@ -2751,7 +2751,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Object> result = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect number of results returned.", result.size() == 1);
             assertTrue("Incorrect Employee returned", result.get(0).equals("Robert"));
@@ -2780,10 +2780,10 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Employee> result = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect number of results returned.", result.size() == 1);
-            assertTrue("Incorrect Employee returned", ((Employee)result.get(0)).getFirstName().equals("Bob"));
+            assertTrue("Incorrect Employee returned", result.get(0).getFirstName().equals("Bob"));
         } finally {
             rollbackTransaction(em);
             closeEntityManager(em);
@@ -2811,7 +2811,7 @@
 
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq).getResultList();
+            List<Object> result = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect number of results returned.", result.size() == 1);
             assertTrue("Incorrect Employee returned", result.get(0).equals("Robert"));
@@ -2845,7 +2845,7 @@
         cq1.where(qb1.equal(exp, 5000));
         beginTransaction(em);
         try {
-            List result = em.createQuery(cq1).getResultList();
+            List<Employee> result = em.createQuery(cq1).getResultList();
             assertTrue("LargeProject cast failed.", comparer.compareObjects(result, expectedResult));
         } finally {
             rollbackTransaction(em);
@@ -2902,7 +2902,7 @@
             jakarta.persistence.criteria.Expression exp = wrapper.get((Path)join.as(BlueLight.class), BlueLight_discount);
             cq1.where(qb1.equal(exp, 10) );
 
-            List result = em.createQuery(cq1).getResultList();
+            List<BeerConsumer> result = em.createQuery(cq1).getResultList();
             assertTrue("LargeProject cast failed.", comparer.compareObjects(result, expectedResult));
         } finally {
             if (isTransactionActive(em)) {
@@ -2956,7 +2956,7 @@
             jakarta.persistence.criteria.Expression exp = wrapper.get((Path)join.as(SportsCar.class), SportsCar_maxSpeed);
             cq1.where(qb1.equal(exp, 200) );
 
-            List result = em.createQuery(cq1).getResultList();
+            List<Person> result = em.createQuery(cq1).getResultList();
             assertTrue("OneToOne cast failed.", comparer.compareObjects(result, expectedResult));
         } finally {
             if (isTransactionActive(em)) {
@@ -2976,7 +2976,7 @@
         CriteriaQuery<Tuple> criteria = qb.createTupleQuery();
 
         Root<Employee> emp = wrapper.from(criteria, Employee.class);
-        jakarta.persistence.criteria.Expression exp = wrapper.get(emp, Employee_lastName);
+        jakarta.persistence.criteria.Expression<Object> exp = wrapper.get(emp, Employee_lastName);
 
         criteria.multiselect(exp, qb.count(exp));
         criteria.where(qb.conjunction());
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaUnitTestSuite.java
index 506f200..40ff3e5 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/criteria/JUnitCriteriaUnitTestSuite.java
@@ -20,7 +20,6 @@
 import java.util.Vector;
 import java.util.Iterator;
 
-import junit.framework.TestCase;
 import org.junit.Assert;
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -178,7 +177,7 @@
             //SELECT OBJECT(employee) FROM Employee employee WHERE employee.firstName = :firstname
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
-            Root from = cq.from(Employee.class);
+            Root<Employee> from = cq.from(Employee.class);
             cq.where(qb.equal(from.get("firstName"), qb.parameter(String.class, "firstname")));
             Query query = em.createQuery(cq);
 
@@ -223,7 +222,7 @@
         cq.from(Employee.class).join("address", JoinType.LEFT);
         cq.distinct(true);
 
-        List result = em.createQuery(cq).getResultList();
+        List<Employee> result = em.createQuery(cq).getResultList();
 
 
         assertTrue("Outer join was not properly added to the query", initialSize + 1 == result.size());
@@ -272,10 +271,10 @@
            CriteriaBuilder qb = em.getCriteriaBuilder();
            CriteriaQuery<String> cq = qb.createQuery(String.class);
            Root<Employee> root = cq.from(Employee.class);
-           Join phone = root.join("phoneNumbers");
+           Join<Object, Object> phone = root.join("phoneNumbers");
            cq.select(phone.get("areaCode"));
            cq.where(qb.equal(phone.get("areaCode"), "613"));
-           List result = em.createQuery(cq).getResultList();
+           List<String> result = em.createQuery(cq).getResultList();
 
            Assert.assertTrue("SimpleSelectPhoneNumberAreaCode test failed !", comparer.compareObjects(result,expectedResult));
         } finally {
@@ -302,7 +301,7 @@
            Join<Employee, PhoneNumber> sqo = sqc.join("phoneNumbers");
            sq.select(sqo);
            cquery.where(qbuilder.not(qbuilder.exists(sq)));
-           List result = em.createQuery(cquery).getResultList();
+           List<Employee> result = em.createQuery(cquery).getResultList();
            Assert.assertTrue("testExistWithJoin test failed !", comparer.compareObjects(result,expected));
       } finally {
           rollbackTransaction(em);
@@ -348,10 +347,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<String> cq = qb.createQuery(String.class);
             Root<Employee> root = cq.from(Employee.class);
-            Join joinedPhone = root.join("phoneNumbers");
+            Join<Object, Object> joinedPhone = root.join("phoneNumbers");
             cq.select(joinedPhone.get("areaCode"));
             cq.where(qb.and(qb.equal(joinedPhone.get("areaCode"), "613")), qb.equal(joinedPhone.get("owner").get("firstName"), firstName));
-            List result = em.createQuery(cq).getResultList();
+            List<String> result = em.createQuery(cq).getResultList();
 
             Assert.assertTrue("SimpleSelectPhoneNumberAreaCodeWithEmployee test failed !", comparer.compareObjects(result,expectedResult));
         } finally {
@@ -395,12 +394,12 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<String> cq = qb.createQuery(String.class);
             Root<Employee> root = cq.from(Employee.class);
-            Join joinedPhone = root.join("phoneNumbers");
+            Join<Object, Object> joinedPhone = root.join("phoneNumbers");
             cq.select(joinedPhone.get("number"));
             //cq.where(qb.equal(joinedPhone.get("areaCode"), areaCode).add(qb.equal(joinedPhone.get("owner").get("id"), root.get("id"))).add(qb.equal(root.get("firstName"), firstName)));
             Predicate firstAnd = qb.and(qb.equal(joinedPhone.get("areaCode"), areaCode), qb.equal(joinedPhone.get("owner").get("id"), root.get("id")));
             cq.where(qb.and( firstAnd, qb.equal(root.get("firstName"), firstName)));
-            List result = em.createQuery(cq).getResultList();
+            List<String> result = em.createQuery(cq).getResultList();
 
             Assert.assertTrue("SimpleSelectPhoneNumberAreaCodeWithEmployee test failed !", comparer.compareObjects(result,expectedResult));
         } finally {
@@ -442,12 +441,12 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<String> cq = qb.createQuery(String.class);
             Root<Employee> root = cq.from(Employee.class);
-            Join joinedPhone = root.join("phoneNumbers");
+            Join<Object, Object> joinedPhone = root.join("phoneNumbers");
             cq.select(joinedPhone.get("number"));
             Predicate firstNameEquality = qb.equal(joinedPhone.get("owner").get("firstName"), firstName);
             Predicate areaCodeEquality =qb.equal(joinedPhone.get("areaCode"), areaCode);
             cq.where( qb.and(firstNameEquality, areaCodeEquality) );
-            List result = em.createQuery(cq).getResultList();
+            List<String> result = em.createQuery(cq).getResultList();
 
             Assert.assertTrue("SimpleSelectPhoneNumberAreaCodeWithEmployee test failed !", comparer.compareObjects(result,expectedResult));
         } finally {
@@ -521,7 +520,7 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Tuple> cq = qb.createTupleQuery();
             Root<Employee> rootEmp = cq.from(Employee.class);
-            Join joinedManager = rootEmp.join("manager", JoinType.LEFT);
+            Join<Object, Object> joinedManager = rootEmp.join("manager", JoinType.LEFT);
             cq.multiselect(rootEmp.get("id"), joinedManager.get("id"));
 
             Query query = em.createQuery(cq);
@@ -554,9 +553,9 @@
             clearCache();
             //"SELECT e.id FROM Employee e group by e.id"
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery(Integer.class);
+            CriteriaQuery<Integer> cq = qb.createQuery(Integer.class);
             Root<Employee> rootEmp = cq.from(Employee.class);
-            Join joinedManager = rootEmp.join("manager", JoinType.LEFT);
+            Join<Object, Object> joinedManager = rootEmp.join("manager", JoinType.LEFT);
             cq.select(rootEmp.get("id"));
 
             Query query = em.createQuery(cq);
@@ -626,7 +625,7 @@
                 cq.multiselect(rootEmp, rootAddress);
                 cq.where(qb.and( qb.equal(rootAddress.get("city"), "Ottawa"), qb.equal(rootEmp.get("address").get("country"), rootAddress.get("country"))));
 
-                List resultList =  em.createQuery(cq).getResultList();
+                List<Tuple> resultList =  em.createQuery(cq).getResultList();
             } finally {
                 rollbackTransaction(em);
                 closeEntityManager(em);
@@ -653,12 +652,12 @@
             em.flush();
             //"SELECT DISTINCT e.address FROM Employee e"
             CriteriaBuilder qb = em.getCriteriaBuilder();
-            CriteriaQuery cq = qb.createQuery();
+            CriteriaQuery<Object> cq = qb.createQuery();
             Root<Employee> rootEmp = cq.from(Employee.class);
             cq.select(rootEmp.get("address"));
             cq.distinct(true);
 
-            List resultList =  em.createQuery(cq).getResultList();
+            List<Object> resultList =  em.createQuery(cq).getResultList();
         }finally{
             rollbackTransaction(em);
         }
@@ -683,7 +682,7 @@
             Root<Employee> from = cq.from(Employee.class);
             EntityType<Employee> Emp_ = em.getMetamodel().entity(Employee.class);
             cq.multiselect( qb.min(from.get(Emp_.getSingularAttribute("salary", int.class))));
-            List resultList =  em.createQuery(cq).getResultList();
+            List<?> resultList =  em.createQuery(cq).getResultList();
             Object resultObject = resultList.get(0);
             assertTrue("constructor expression test expected DataHolder object, got " + resultObject,(resultObject instanceof DataHolder));
             assertEquals("Expected DataHolder to contain int value of -100, Got :" + resultObject, -100, ((DataHolder)resultObject).getPrimitiveInt());
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/EntityManagerJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/EntityManagerJUnitTestSuite.java
index 06d5c5d..c644250 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/EntityManagerJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/EntityManagerJUnitTestSuite.java
@@ -2663,12 +2663,12 @@
         query.setHint(QueryHints.BATCH, "e.manager.phoneNumbers");
 
         ReadAllQuery raq = (ReadAllQuery)query.getDatabaseQuery();
-        List expressions = raq.getBatchReadAttributeExpressions();
+        List<Expression> expressions = raq.getBatchReadAttributeExpressions();
         assertTrue(expressions.size() == 2);
-        Expression exp = (Expression)expressions.get(0);
+        Expression exp = expressions.get(0);
         assertTrue(exp.isQueryKeyExpression());
         assertTrue(exp.getName().equals("phoneNumbers"));
-        exp = (Expression)expressions.get(1);
+        exp = expressions.get(1);
         assertTrue(exp.isQueryKeyExpression());
         assertTrue(exp.getName().equals("phoneNumbers"));
 
@@ -2683,9 +2683,9 @@
 
         beginTransaction(em);
         emp = em.find(Employee.class, id1);
-        Iterator it = emp.getManagedEmployees().iterator();
+        Iterator<Employee> it = emp.getManagedEmployees().iterator();
         while (it.hasNext()){
-            Employee managedEmp = (Employee)it.next();
+            Employee managedEmp = it.next();
             it.remove();
             managedEmp.setManager(null);
             em.remove(managedEmp);
@@ -2759,9 +2759,9 @@
 
         beginTransaction(em);
         emp = em.find(Employee.class, id1);
-        Iterator it = emp.getManagedEmployees().iterator();
+        Iterator<Employee> it = emp.getManagedEmployees().iterator();
         while (it.hasNext()){
-            Employee managedEmp = (Employee)it.next();
+            Employee managedEmp = it.next();
             it.remove();
             managedEmp.setManager(null);
             em.remove(managedEmp);
@@ -5263,13 +5263,13 @@
             // if altering the test, make sure that emp still references (directly or through other objects) all the updated objects, so that all of them are copied.
             Map oldValueMap = copyGroupUpdated.getCopies();
             // using ChangeRecords bring back the original state of the object
-            Iterator itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
+            Iterator<Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet>> itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
             while(itChangeSets.hasNext()) {
-                Map.Entry entry = (Map.Entry)itChangeSets.next();
+                Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet> entry = itChangeSets.next();
                 Object object = entry.getKey();
                 ClassDescriptor descriptor = session.getDescriptor(object);
                 if(!descriptor.isAggregateDescriptor()) {
-                    ObjectChangeSet changeSet = (ObjectChangeSet)entry.getValue();
+                    ObjectChangeSet changeSet = entry.getValue();
                     if(!(deleted.contains(object)) && !changeSet.isNew()) {
                         List<ChangeRecord> changes = changeSet.getChanges();
                         if(changes != null && !changes.isEmpty()) {
@@ -5290,11 +5290,11 @@
             // now compare oldValue objects with corresponding backup objects
             itChangeSets = ((org.eclipse.persistence.internal.sessions.UnitOfWorkChangeSet)listener.uowChangeSet).getCloneToObjectChangeSet().entrySet().iterator();
             while(itChangeSets.hasNext()) {
-                Map.Entry entry = (Map.Entry)itChangeSets.next();
+                Map.Entry<Object, org.eclipse.persistence.internal.sessions.ObjectChangeSet> entry = itChangeSets.next();
                 Object object = entry.getKey();
                 ClassDescriptor descriptor = session.getDescriptor(object);
                 if(!descriptor.isAggregateDescriptor()) {
-                    ObjectChangeSet changeSet = (ObjectChangeSet)entry.getValue();
+                    ObjectChangeSet changeSet = entry.getValue();
                     if(!(deleted.contains(object)) && !changeSet.isNew()) {
                         List<ChangeRecord> changes = changeSet.getChanges();
                         if(changes != null && !changes.isEmpty()) {
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/EntityManagerTLRJUnitTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/EntityManagerTLRJUnitTestSuite.java
index 2085d10..ffc2a65 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/EntityManagerTLRJUnitTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/EntityManagerTLRJUnitTestSuite.java
@@ -2521,12 +2521,12 @@
         query.setHint(QueryHints.BATCH, "e.manager.phoneNumbers");
 
         ReadAllQuery raq = (ReadAllQuery)query.getDatabaseQuery();
-        List expressions = raq.getBatchReadAttributeExpressions();
+        List<Expression> expressions = raq.getBatchReadAttributeExpressions();
         assertTrue(expressions.size() == 2);
-        Expression exp = (Expression)expressions.get(0);
+        Expression exp = expressions.get(0);
         assertTrue(exp.isQueryKeyExpression());
         assertTrue(exp.getName().equals("phoneNumbers"));
-        exp = (Expression)expressions.get(1);
+        exp = expressions.get(1);
         assertTrue(exp.isQueryKeyExpression());
         assertTrue(exp.getName().equals("phoneNumbers"));
 
@@ -2541,9 +2541,9 @@
 
         beginTransaction(em);
         emp = em.find(Employee.class, id1);
-        Iterator it = emp.getManagedEmployees().iterator();
+        Iterator<Employee> it = emp.getManagedEmployees().iterator();
         while (it.hasNext()){
-            Employee managedEmp = (Employee)it.next();
+            Employee managedEmp = it.next();
             it.remove();
             managedEmp.setManager(null);
             em.remove(managedEmp);
@@ -2617,9 +2617,9 @@
 
         beginTransaction(em);
         emp = em.find(Employee.class, id1);
-        Iterator it = emp.getManagedEmployees().iterator();
+        Iterator<Employee> it = emp.getManagedEmployees().iterator();
         while (it.hasNext()){
-            Employee managedEmp = (Employee)it.next();
+            Employee managedEmp = it.next();
             it.remove();
             managedEmp.setManager(null);
             em.remove(managedEmp);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/JoinedAttributeAdvancedJunitTest.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/JoinedAttributeAdvancedJunitTest.java
index fed6cdd..2fd374f 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/JoinedAttributeAdvancedJunitTest.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/fieldaccess/advanced/JoinedAttributeAdvancedJunitTest.java
@@ -394,16 +394,16 @@
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("lastName").equal("Way").or(raq.getExpressionBuilder().get("lastName").equal("Jones")));
         Employee emp = (Employee)((Vector)getDbSession().executeQuery(raq)).firstElement();
         emp.getPhoneNumbers();
-        for (Iterator iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext();){
-            ((PhoneNumber)iterator.next()).getOwner();
+        for (Iterator<PhoneNumber> iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext();){
+            iterator.next().getOwner();
         }
 
         raq = new ReadAllQuery(Address.class);
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
         Address addr = (Address)((Vector)getDbSession().executeQuery(raq)).firstElement();
         addr.getEmployees();
-        for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext();){
-            ((Employee)iterator.next()).getAddress();
+        for (Iterator<Employee> iterator = addr.getEmployees().iterator(); iterator.hasNext();){
+            iterator.next().getAddress();
         }
 
         getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();
@@ -459,16 +459,16 @@
         raq.setSelectionCriteria(raq.getExpressionBuilder().notEmpty("phoneNumbers"));
         Employee emp = (Employee)((Vector)getDbSession().executeQuery(raq)).firstElement();
         emp.getPhoneNumbers();
-        for (Iterator iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext();){
-            ((PhoneNumber)iterator.next()).getOwner();
+        for (Iterator<PhoneNumber> iterator = emp.getPhoneNumbers().iterator(); iterator.hasNext();){
+            iterator.next().getOwner();
         }
 
         raq = new ReadAllQuery(Address.class);
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
         Address addr = (Address)((Vector)getDbSession().executeQuery(raq)).firstElement();
         addr.getEmployees();
-        for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext();){
-            Employee addrEmp = (Employee)iterator.next();
+        for (Iterator<Employee> iterator = addr.getEmployees().iterator(); iterator.hasNext();){
+            Employee addrEmp = iterator.next();
             addrEmp.getAddress();
             addrEmp.getPhoneNumbers().size(); // as the report query will join in all phones to all emps, make sure we can compare.
         }
@@ -540,8 +540,8 @@
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
         Address addr = (Address)((Vector)getDbSession().executeQuery(raq)).firstElement();
         addr.getEmployees();
-        for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext();){
-            ((Employee)iterator.next()).getAddress();
+        for (Iterator<Employee> iterator = addr.getEmployees().iterator(); iterator.hasNext();){
+            iterator.next().getAddress();
         }
 
         getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();
@@ -603,8 +603,8 @@
         raq.setSelectionCriteria(raq.getExpressionBuilder().get("city").like("%ttawa%"));
         Address addr = (Address)((Vector)getDbSession().executeQuery(raq)).firstElement();
         addr.getEmployees();
-        for (Iterator iterator = addr.getEmployees().iterator(); iterator.hasNext();){
-            ((Employee)iterator.next()).getAddress();
+        for (Iterator<Employee> iterator = addr.getEmployees().iterator(); iterator.hasNext();){
+            iterator.next().getAddress();
         }
 
         getDbSession().getIdentityMapAccessor().initializeAllIdentityMaps();
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/inheritance/EntityManagerJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/inheritance/EntityManagerJUnitTestCase.java
index 8802556..8a238ae 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/inheritance/EntityManagerJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/inheritance/EntityManagerJUnitTestCase.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
@@ -120,9 +120,9 @@
         Person p = new Person();
         p.setName("Evil Knievel");
 
-        Car c = new SportsCar();
+        SportsCar c = new SportsCar();
         c.setDescription("Ferrari");
-        ((SportsCar) c).setMaxSpeed(200);
+        c.setMaxSpeed(200);
         p.setCar(c);
 
         try {
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/inheritance/TablePerClassInheritanceJUnitTest.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/inheritance/TablePerClassInheritanceJUnitTest.java
index b8d4b7a..7522f85 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/inheritance/TablePerClassInheritanceJUnitTest.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/inheritance/TablePerClassInheritanceJUnitTest.java
@@ -202,10 +202,10 @@
         assertTrue("The elimination was not a direct elimination", directElimination.isDirectElimination());
 
         // Validate the weapon that was used for the direct elimination.
-        Weapon weapon = ((DirectElimination) directElimination).getDirectWeapon();
+        DirectWeapon weapon = ((DirectElimination) directElimination).getDirectWeapon();
         assertNotNull("The direct elimination's weapon was null", weapon);
         assertTrue("The direct elimination's weapon was not a direct weapon", weapon.isDirectWeapon());
-        assertTrue("The direct elimination's weapon was not a gun", ((DirectWeapon) weapon).isGun());
+        assertTrue("The direct elimination's weapon was not a gun", weapon.isGun());
 
         closeEntityManager(em);
     }
@@ -253,10 +253,10 @@
         assertTrue("The elimination was not an idirect elimination", indirectElimination.isIndirectElimination());
 
         // Validate the weapon that was used for the direct elimination.
-        Weapon weapon = ((IndirectElimination) indirectElimination).getIndirectWeapon();
+        IndirectWeapon weapon = ((IndirectElimination) indirectElimination).getIndirectWeapon();
         assertNotNull("The indirect elimination's weapon was null", weapon);
         assertTrue("The indirect elimination's weapon was not an idirect weapon", weapon.isIndirectWeapon());
-        assertTrue("The indirect elimination's weapon was not a bomb", ((IndirectWeapon) weapon).isBomb());
+        assertTrue("The indirect elimination's weapon was not a bomb", weapon.isBomb());
 
         closeEntityManager(em);
     }
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpaadvancedproperties/JPAAdvPropertiesJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpaadvancedproperties/JPAAdvPropertiesJUnitTestCase.java
index 6c5560d..84d5fcf 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpaadvancedproperties/JPAAdvPropertiesJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpaadvancedproperties/JPAAdvPropertiesJUnitTestCase.java
@@ -28,6 +28,7 @@
 import junit.framework.TestSuite;
 import org.eclipse.persistence.expressions.Expression;
 import org.eclipse.persistence.expressions.ExpressionBuilder;
+import org.eclipse.persistence.sessions.SessionEventListener;
 import org.eclipse.persistence.sessions.server.ServerSession;
 import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
 import org.eclipse.persistence.testing.models.jpa.jpaadvancedproperties.Customer;
@@ -98,7 +99,7 @@
             em.remove(em.find(org.eclipse.persistence.testing.models.jpa.jpaadvancedproperties.Customer.class, customerId));
             commitTransaction(em);
 
-            List listeners = session.getEventManager().getListeners();
+            List<SessionEventListener> listeners = session.getEventManager().getListeners();
             boolean doseCustomizedSessionEventListenerExists=false;
             for (int i =0;i<listeners.size();i++){
                 Object aListener = listeners.get(i);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLComplexAggregateTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLComplexAggregateTestSuite.java
index 2325516..c4c5f2d 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLComplexAggregateTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLComplexAggregateTestSuite.java
@@ -550,7 +550,7 @@
 
         // Need to create the expected result manually, because using the
         // TopLink query API would run into the same issue 2497.
-        List expectedResult = Arrays.asList(new Long[] {1L, 0L,
+        List<Long> expectedResult = Arrays.asList(new Long[] {1L, 0L,
                 0L, 1L});
         Collections.sort(expectedResult);
 
@@ -578,7 +578,7 @@
 
         // Need to create the expected result manually, because using the
         // TopLink query API would run into the same issue 2497.
-        List expectedResult = Arrays.asList(new Long[] {2L, 5L, 3L});
+        List<Long> expectedResult = Arrays.asList(new Long[] {2L, 5L, 3L});
         Collections.sort(expectedResult);
 
         String jpql = "SELECT COUNT(p) FROM Employee e LEFT JOIN e.phoneNumbers p WHERE e.lastName LIKE 'S%' GROUP BY e.lastName";
@@ -619,7 +619,7 @@
 
             // Need to create the expected result manually, because using the
             // TopLink query API would run into the same issue 6155093.
-            List expectedResult = Arrays.asList(new Long[] {1L});
+            List<Long> expectedResult = Arrays.asList(new Long[] {1L});
             Collections.sort(expectedResult);
 
             // COUNT DISTINCT with inner join
@@ -676,7 +676,7 @@
 
         EntityManager em = createEntityManager();
 
-        List expectedResult = Arrays.asList(new Long[] { 0L, 1L, 0L, 0L });
+        List<Long> expectedResult = Arrays.asList(new Long[] { 0L, 1L, 0L, 0L });
 
         String jpql = "SELECT COUNT(cc) FROM Customer c LEFT JOIN c.CCustomers cc GROUP BY c.name order by c.name";
         Query q = em.createQuery(jpql);
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 ceb449a..8244e9a 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
@@ -1036,7 +1036,7 @@
         query.setParameter("id1", empWithOutManager.getId());
         query.setParameter("id2", empWithManager.getId());
         List result = query.getResultList();
-        List expectedResult = Arrays.asList(new Employee[] {empWithManager.getManager()});
+        List<Employee> expectedResult = Arrays.asList(new Employee[] {empWithManager.getManager()});
         Assert.assertTrue("Complex Join test failed", comparer.compareObjects(result, expectedResult));
 
         // Select the related manager of empWithOutManager and empWithManager
@@ -1084,7 +1084,7 @@
         query.setParameter("id1", empWithOutManager.getId());
         query.setParameter("id2", empWithManager.getId());
         List result = query.getResultList();
-        List expectedResult = Arrays.asList(new Employee[] {empWithManager.getManager()});
+        List<Employee> expectedResult = Arrays.asList(new Employee[] {empWithManager.getManager()});
         Assert.assertTrue("Complex Join test failed", comparer.compareObjects(result, expectedResult));
 
         // Select the related manager of empWithOutManager and empWithManager
@@ -1363,7 +1363,7 @@
         // find an employee with managed employees
         for (Iterator i = emps.iterator(); i.hasNext();) {
             Employee e = (Employee)i.next();
-            Collection managed = e.getManagedEmployees();
+            Collection<Employee> managed = e.getManagedEmployees();
             if ((managed != null) && (managed.size() > 0)) {
                 emp = e;
                 break;
@@ -1377,13 +1377,13 @@
         LongHolder result = (LongHolder)query.getSingleResult();
 
         // calculate expected result
-        Collection managed = emp.getManagedEmployees();
+        Collection<Employee> managed = emp.getManagedEmployees();
         int count = 0;
         int sum = 0;
         if (managed != null) {
             count = managed.size();
-            for (Iterator i = managed.iterator(); i.hasNext();) {
-                Employee e = (Employee)i.next();
+            for (Iterator<Employee> i = managed.iterator(); i.hasNext();) {
+                Employee e = i.next();
                 sum += e.getSalary();
             }
         }
@@ -1401,7 +1401,7 @@
         List<EmployeeDetail> expectedResult = new ArrayList<EmployeeDetail>();
         for (Iterator i = emps.iterator(); i.hasNext();) {
             Employee e = (Employee)i.next();
-            Collection managed = e.getManagedEmployees();
+            Collection<Employee> managed = e.getManagedEmployees();
             if ((managed != null) && (managed.size() > 0)) {
                 EmployeeDetail d = new EmployeeDetail(
                     e.getFirstName(), e.getLastName(), Long.valueOf(managed.size()));
@@ -1648,7 +1648,7 @@
         // find an employees with projects
         for (Iterator i = allEmps.iterator(); i.hasNext();) {
             Employee e = (Employee)i.next();
-            Collection projects = e.getProjects();
+            Collection<Project> projects = e.getProjects();
             if ((projects != null) && (projects.size() > 0)) {
                 expectedResult.add(e.getId());
             }
@@ -1670,7 +1670,7 @@
         // find an employees with projects
         for (Iterator i = allEmps.iterator(); i.hasNext();) {
             Employee e = (Employee)i.next();
-            Collection projects = e.getProjects();
+            Collection<Project> projects = e.getProjects();
             if ((projects == null) || (projects.size() == 0)) {
                 expectedResult.add(e.getId());
             }
@@ -1712,15 +1712,15 @@
         for (Iterator i = allEmps.iterator(); i.hasNext();) {
             Employee e = (Employee)i.next();
             // Get Dealers
-            Collection dealers = e.getDealers();
+            Collection<Dealer> dealers = e.getDealers();
             if (dealers != null && dealers.size() > 0) {
-                for (Iterator dealerIter = dealers.iterator(); dealerIter.hasNext();) {
-                    Dealer d = (Dealer)dealerIter.next();
+                for (Iterator<Dealer> dealerIter = dealers.iterator(); dealerIter.hasNext();) {
+                    Dealer d = dealerIter.next();
                     // Get Customers.
-                    Collection customers = d.getCustomers();
+                    Collection<Customer> customers = d.getCustomers();
                     if (customers != null && customers.size() > 0) {
-                        for (Iterator custIter = customers.iterator(); custIter.hasNext();) {
-                            Customer c = (Customer)custIter.next();
+                        for (Iterator<Customer> custIter = customers.iterator(); custIter.hasNext();) {
+                            Customer c = custIter.next();
                             // Verify Budget
                             if (c.getBudget() > 0) {
                                 expectedResult.add(e.getId());
@@ -1781,7 +1781,7 @@
         // find an employees with projects
         for (Iterator i = allEmps.iterator(); i.hasNext();) {
             Employee e = (Employee)i.next();
-            Collection projects = e.getProjects();
+            Collection<Project> projects = e.getProjects();
             if ((projects != null) && (projects.size() > 0)) {
                 expectedResult.add(e);
             }
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLParameterTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLParameterTestSuite.java
index 444351a..5dc1265 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLParameterTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/jpql/JUnitJPQLParameterTestSuite.java
@@ -15,23 +15,20 @@
 
 package org.eclipse.persistence.testing.tests.jpa.jpql;
 
-import java.util.Arrays;
 import java.util.List;
 import java.util.Set;
 import java.util.Vector;
 
+import jakarta.persistence.Parameter;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
 import jakarta.persistence.Query;
 import jakarta.persistence.EntityManager;
 
-import org.eclipse.persistence.testing.models.jpa.advanced.Address;
-import org.eclipse.persistence.testing.models.jpa.advanced.Department;
 import org.eclipse.persistence.testing.models.jpa.advanced.Employee;
 import org.eclipse.persistence.testing.models.jpa.advanced.Jigsaw;
 import org.eclipse.persistence.testing.models.jpa.advanced.JigsawPiece;
-import org.eclipse.persistence.testing.models.jpa.advanced.PhoneNumber;
 import org.eclipse.persistence.testing.models.jpa.advanced.EmployeePopulator;
 import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
 import org.eclipse.persistence.sessions.DatabaseSession;
@@ -39,7 +36,7 @@
 import org.eclipse.persistence.config.QueryHints;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.testing.models.jpa.advanced.AdvancedTableCreator;
-import org.eclipse.persistence.testing.models.relationshipmaintenance.Dept;
+
 /**
  * <p>
  * <b>Purpose</b>: Test EJBQL parameter functionality.
@@ -194,7 +191,7 @@
         assertNotNull(em);
         Query query = em.createNamedQuery("findAllEmployeesOrderById");
         assertNotNull(query);
-        Set parameters = query.getParameters();
+        Set<Parameter<?>> parameters = query.getParameters();
         assertNotNull(parameters);
         assertEquals("Parameters size should be 0", 0, parameters.size());
     }
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 c64e259..3006c78 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
@@ -2050,8 +2050,8 @@
     }
 
     public void testDeleteAll(){
-        Map descriptors = getServerSession(m_persistenceUnit).getDescriptors();
-        ClassDescriptor descriptor = (ClassDescriptor)descriptors.get(Department.class);
+        Map<Class<?>, ClassDescriptor> descriptors = getServerSession(m_persistenceUnit).getDescriptors();
+        ClassDescriptor descriptor = descriptors.get(Department.class);
         OneToManyMapping mapping = (OneToManyMapping)descriptor.getMappingForAttributeName("equipment");
         assertFalse("<delete-all> xml did not work correctly", mapping.mustDeleteReferenceObjectsOneByOne());
     }
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsDynamicAdvancedJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsDynamicAdvancedJUnitTestCase.java
index e991d8b..c75a82e 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsDynamicAdvancedJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsDynamicAdvancedJUnitTestCase.java
@@ -54,9 +54,7 @@
 
 import org.eclipse.persistence.jpa.JpaEntityManager;
 import org.eclipse.persistence.jpa.dynamic.JPADynamicHelper;
-import org.eclipse.persistence.mappings.CollectionMapping;
 import org.eclipse.persistence.mappings.DatabaseMapping;
-import org.eclipse.persistence.mappings.DirectCollectionMapping;
 import org.eclipse.persistence.mappings.ForeignReferenceMapping;
 
 import org.eclipse.persistence.queries.DoesExistQuery;
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsMultitenantJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsMultitenantJUnitTestCase.java
index 2df84f1..f04dfa9 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsMultitenantJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/EntityMappingsMultitenantJUnitTestCase.java
@@ -47,7 +47,6 @@
 import org.eclipse.persistence.testing.models.jpa.xml.advanced.multitenant.Contract;
 import org.eclipse.persistence.testing.models.jpa.xml.advanced.multitenant.MafiaFamily;
 import org.eclipse.persistence.testing.models.jpa.xml.advanced.multitenant.Mafioso;
-import org.eclipse.persistence.testing.models.jpa.xml.advanced.multitenant.Mafioso.Gender;
 import org.eclipse.persistence.testing.models.jpa.xml.advanced.multitenant.Mason;
 import org.eclipse.persistence.testing.models.jpa.xml.advanced.multitenant.Party;
 import org.eclipse.persistence.testing.models.jpa.xml.advanced.multitenant.Riding;
@@ -842,7 +841,7 @@
 
     public void testTablePerTenantC() {
         // Set the tenant through EMF properties.
-        Map properties = JUnitTestCaseHelper.getDatabaseProperties();
+        Map<String, String> properties = JUnitTestCaseHelper.getDatabaseProperties();
         properties.put(PersistenceUnitProperties.EXCLUDE_ECLIPSELINK_ORM_FILE, "true");
         properties.put(PersistenceUnitProperties.MULTITENANT_SHARED_EMF, "false");
         properties.put(PersistenceUnitProperties.SESSION_NAME, "extended-multi-tenant-C");
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/fetchgroup/EntityMappingsFetchGroupJunitTest.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/fetchgroup/EntityMappingsFetchGroupJunitTest.java
index 87ac30f..a17a3da 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/fetchgroup/EntityMappingsFetchGroupJunitTest.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/advanced/fetchgroup/EntityMappingsFetchGroupJunitTest.java
@@ -143,8 +143,8 @@
             EntityManager em = createEntityManager(m_persistenceUnit);
             Map properties = new HashMap();
             properties.put(QueryHints.FETCH_GROUP_NAME, "HeightAndWidth");
-            Class PadsClass = Pads.class;
-            Pads pads = (Pads) em.find(PadsClass, padsId, properties);
+            Class<Pads> PadsClass = Pads.class;
+            Pads pads = em.find(PadsClass, padsId, properties);
 
             try {
                 verifyFetchedField(PadsClass.getDeclaredField("height"), pads, 35.5);
@@ -167,8 +167,8 @@
             EntityManager em = createEntityManager(m_persistenceUnit);
             Map properties = new HashMap();
             properties.put(QueryHints.FETCH_GROUP_NAME, "AgeGroup");
-            Class ChestProtecterClass = ChestProtector.class;
-            ChestProtector chestProtector = (ChestProtector) em.find(ChestProtecterClass, chestProtectorId, properties);
+            Class<ChestProtector> ChestProtecterClass = ChestProtector.class;
+            ChestProtector chestProtector = em.find(ChestProtecterClass, chestProtectorId, properties);
 
             try {
                 verifyFetchedField(ChestProtecterClass.getField("ageGroup"), chestProtector, AgeGroup.INTERMEDIATE);
@@ -189,8 +189,8 @@
             EntityManager em = createEntityManager(m_persistenceUnit);
             Map properties = new HashMap();
             properties.put(QueryHints.FETCH_GROUP_NAME, "MSRP");
-            Class PadsClass = Pads.class;
-            Pads pads = (Pads) em.find(PadsClass, padsId, properties);
+            Class<Pads> PadsClass = Pads.class;
+            Pads pads = em.find(PadsClass, padsId, properties);
 
             try {
                 verifyFetchedField(PadsClass.getField("msrp"), pads, 999.99);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/inherited/EntityMappingsInheritedJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/inherited/EntityMappingsInheritedJUnitTestCase.java
index cf9495d..284c60b 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/inherited/EntityMappingsInheritedJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/inherited/EntityMappingsInheritedJUnitTestCase.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,6 +29,7 @@
 import java.sql.Date;
 import java.sql.Timestamp;
 import java.util.Calendar;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
@@ -41,7 +42,6 @@
 import org.eclipse.persistence.sessions.DatabaseSession;
 
 import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
-import org.eclipse.persistence.testing.models.jpa.xml.inherited.Consumer;
 import org.eclipse.persistence.testing.models.jpa.xml.inherited.Official;
 import org.eclipse.persistence.testing.models.jpa.xml.inherited.Accredidation;
 import org.eclipse.persistence.testing.models.jpa.xml.inherited.Birthday;
@@ -732,10 +732,10 @@
             beginTransaction(em);
 
             BeerConsumer cm = em.find(BeerConsumer.class, beerConsumerId);
-            java.util.Collection phones = cm.getTelephoneNumbers().values();
+            Collection<TelephoneNumber> phones = cm.getTelephoneNumbers().values();
             assertTrue("Wrong phonenumbers associated with BeerConsumer", phones.size() == 2);
-            for (Iterator iterator = phones.iterator(); iterator.hasNext();){
-                    TelephoneNumber phone = (TelephoneNumber)(iterator.next());
+            for (Iterator<TelephoneNumber> iterator = phones.iterator(); iterator.hasNext();){
+                    TelephoneNumber phone = iterator.next();
                     assertTrue("Wrong owner of the telephone",phone.getBeerConsumer().getId() == beerConsumerId);
             }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/merge/advanced/EntityMappingsMergeAdvancedJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/merge/advanced/EntityMappingsMergeAdvancedJUnitTestCase.java
index f91bebf..369ed24 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/merge/advanced/EntityMappingsMergeAdvancedJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/merge/advanced/EntityMappingsMergeAdvancedJUnitTestCase.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,24 +92,24 @@
     // The test compares the mappings's types for each class with the corresponding class from packageToCompare.
     // The test should be altered accordingly in case the two classes are no longer use the same mappings types.
     public void testMappingsTypes() throws ClassNotFoundException {
-        Map descriptors = getServerSession().getDescriptors();
+        Map<Class<?>, ClassDescriptor> descriptors = getServerSession().getDescriptors();
         String errorMsg = "";
         for (int i=0; i<classNames.length; i++) {
             String classErrorMsg = "";
             String className = packageName + classNames[i];
             String classToCompareName = packageToCompareName + classNames[i];
-            Class cls = Class.forName(className);
-            Class clsToCompare = Class.forName(classToCompareName);
-            ClassDescriptor desc = (ClassDescriptor)descriptors.get(cls);
-            ClassDescriptor descToCompare = (ClassDescriptor)descriptors.get(clsToCompare);
-            Vector mappings = desc.getMappings();
-            Vector mappingsToCompare = descToCompare.getMappings();
+            Class<?> cls = Class.forName(className);
+            Class<?> clsToCompare = Class.forName(classToCompareName);
+            ClassDescriptor desc = descriptors.get(cls);
+            ClassDescriptor descToCompare = descriptors.get(clsToCompare);
+            Vector<DatabaseMapping> mappings = desc.getMappings();
+            Vector<DatabaseMapping> mappingsToCompare = descToCompare.getMappings();
             if(mappings.size() != mappingsToCompare.size()) {
                 classErrorMsg = classErrorMsg +  "Number of mappings is different; ";
                 continue;
             }
             for(int j=0; j<mappings.size(); j++) {
-                DatabaseMapping mapping = (DatabaseMapping)mappings.elementAt(j);
+                DatabaseMapping mapping = mappings.elementAt(j);
                 String attributeName = mapping.getAttributeName();
                 DatabaseMapping mappingToCompare = descToCompare.getMappingForAttributeName(attributeName);
                 if(!mapping.getClass().equals(mappingToCompare.getClass())) {
@@ -126,8 +126,8 @@
     }
 
     public void testIgnoredTransientAnnotation(){
-        Map descriptors = getServerSession().getDescriptors();
-        ClassDescriptor descriptor = (ClassDescriptor)descriptors.get(Employee.class);
+        Map<Class<?>, ClassDescriptor> descriptors = getServerSession().getDescriptors();
+        ClassDescriptor descriptor = descriptors.get(Employee.class);
         DatabaseMapping mapping = descriptor.getMappingForAttributeName("lastName");
         assertTrue("No mapping for attribute that was set as @Transient, in a metadata complete entity.", mapping !=null);
         assertTrue("Incorrect mapping for attribute that was set as @Transient, in a metadata complete entity.", mapping.isDirectToFieldMapping());
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/merge/inherited/EntityMappingsMergeInheritedJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/merge/inherited/EntityMappingsMergeInheritedJUnitTestCase.java
index ed73fbb..c8ebb8f 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/merge/inherited/EntityMappingsMergeInheritedJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/merge/inherited/EntityMappingsMergeInheritedJUnitTestCase.java
@@ -19,6 +19,7 @@
 package org.eclipse.persistence.testing.tests.jpa.xml.merge.inherited;
 
 import java.sql.Date;
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 
@@ -239,10 +240,10 @@
             beginTransaction(em);
 
             BeerConsumer cm = em.find(BeerConsumer.class, beerConsumerId);
-            java.util.Collection phones = cm.getTelephoneNumbers().values();
+            Collection<TelephoneNumber> phones = cm.getTelephoneNumbers().values();
             assertTrue("Wrong phonenumbers associated with BeerConsumer", phones.size() == 2);
-            for (Iterator iterator = phones.iterator(); iterator.hasNext();){
-                    TelephoneNumber phone = (TelephoneNumber)(iterator.next());
+            for (Iterator<TelephoneNumber> iterator = phones.iterator(); iterator.hasNext();){
+                    TelephoneNumber phone = iterator.next();
                     assertTrue("Wrong owner of the telephone",phone.getBeerConsumer().getId() == beerConsumerId);
             }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/relationships/unidirectional/EntityMappingsUnidirectionalRelationshipsJUnitTestCase.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/relationships/unidirectional/EntityMappingsUnidirectionalRelationshipsJUnitTestCase.java
index a043ea1..00c96c8 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/relationships/unidirectional/EntityMappingsUnidirectionalRelationshipsJUnitTestCase.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/xml/relationships/unidirectional/EntityMappingsUnidirectionalRelationshipsJUnitTestCase.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
@@ -187,11 +187,11 @@
         EntityManager em = createEntityManager();
         Employee employee = em.find(Employee.class, otmEmployeeId);
         assertTrue("Error reading Employee", employee.getId() == otmEmployeeId);
-        Collection phones = employee.getPhoneNumbers();
+        Collection<PhoneNumber> phones = employee.getPhoneNumbers();
         assertTrue("Employee didn't have correct number of phone numbers", phones.size()==2);
         boolean phonesMatched = true;
-        for(Iterator ite = phones.iterator(); ite.hasNext();){
-          PhoneNumber phone = (PhoneNumber)ite.next();
+        for(Iterator<PhoneNumber> ite = phones.iterator(); ite.hasNext();){
+          PhoneNumber phone = ite.next();
           if(phone.getId()!=otmPhone1Id && phone.getId()!=otmPhone2Id)
           {
             phonesMatched = false;
@@ -344,11 +344,11 @@
         EntityManager em = createEntityManager();
         Employee employee = em.find(Employee.class, mtmEmployeeId);
         assertTrue("Error reading Employee", employee.getId() == mtmEmployeeId);
-        Collection projects = employee.getProjects();
+        Collection<Project> projects = employee.getProjects();
         assertTrue("Employee didn't have correct number of projects", projects.size()==2);
         boolean projectsMatched = true;
-        for(Iterator ite = projects.iterator(); ite.hasNext();){
-          Project project = (Project)ite.next();
+        for(Iterator<Project> ite = projects.iterator(); ite.hasNext();){
+          Project project = ite.next();
           if(project.getId()!=mtmProject1Id && project.getId()!=mtmProject2Id)
           {
             projectsMatched = false;
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/CriteriaQueryCastTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/CriteriaQueryCastTestSuite.java
index 179e238..0da30e5 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/CriteriaQueryCastTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/CriteriaQueryCastTestSuite.java
@@ -170,11 +170,11 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Company> cq = qb.createQuery(Company.class);
             Root<Company> root = cq.from(Company.class);
-            Join vehicleJoin = root.join("vehicles");
-            Join boatJoin = qb.treat(vehicleJoin, Boat.class);
+            Join<Object, Object> vehicleJoin = root.join("vehicles");
+            Join<Object, Boat> boatJoin = qb.treat(vehicleJoin, Boat.class);
             cq.where(qb.equal(boatJoin.get("model"), "speed"));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Company> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned, expected 1 but returned "+resultList.size(), resultList.size() == 1);
         } finally {
@@ -226,11 +226,11 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Company> cq = qb.createQuery(Company.class);
             Root<Company> root = cq.from(Company.class);
-            Join vehicleJoin = root.join("vehicles");
-            Join nonFueledJoin = qb.treat(vehicleJoin, NonFueledVehicle.class);
+            Join<Object, Object> vehicleJoin = root.join("vehicles");
+            Join<Object, NonFueledVehicle> nonFueledJoin = qb.treat(vehicleJoin, NonFueledVehicle.class);
             cq.where(qb.equal(nonFueledJoin.get("color"), "Blue"));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Company> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -280,11 +280,11 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
             Root<Employee> root = cq.from(Employee.class);
-            Join projectsJoin = root.join("projects");
-            Join largeProjectJoin = qb.treat(projectsJoin, LargeProject.class);
+            Join<Object, Object> projectsJoin = root.join("projects");
+            Join<Object, LargeProject> largeProjectJoin = qb.treat(projectsJoin, LargeProject.class);
             cq.where(qb.gt(largeProjectJoin.get("budget"), 100));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Employee> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -332,10 +332,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Vehicle> cq = qb.createQuery(Vehicle.class);
             Root<Vehicle> root = cq.from(Vehicle.class);
-            Root boatRoot = qb.treat(root, Boat.class);
+            Root<Boat> boatRoot = qb.treat(root, Boat.class);
             cq.where(qb.equal(boatRoot.get("model"), "speed"));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Vehicle> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -391,7 +391,7 @@
             Root<NonFueledVehicle> nonFueledVehicleRoot = qb.treat(root, NonFueledVehicle.class);
             cq.where(qb.equal(nonFueledVehicleRoot.get("color"), "Blue"));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Vehicle> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 2);
         } finally {
@@ -441,10 +441,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Project> cq = qb.createQuery(Project.class);
             Root<Project> root = cq.from(Project.class);
-            Root largeProjectRoot = qb.treat(root, LargeProject.class);
+            Root<LargeProject> largeProjectRoot = qb.treat(root, LargeProject.class);
             cq.where(qb.gt(largeProjectRoot.get("budget"), 100));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Project> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -477,10 +477,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Project> cq = qb.createQuery(Project.class);
             Root<Project> root = cq.from(Project.class);
-            Root largeProjectRoot = qb.treat(root, LargeProject.class);
+            Root<LargeProject> largeProjectRoot = qb.treat(root, LargeProject.class);
             cq.select(largeProjectRoot.get("budget"));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Project> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -536,10 +536,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<BeerConsumer> cq = qb.createQuery(BeerConsumer.class);
             Root<BeerConsumer> root = cq.from(BeerConsumer.class);
-            Join blueLightJoin = qb.treat(root.join("blueBeersToConsume"), BlueLight.class);
+            Join<Object, BlueLight> blueLightJoin = qb.treat(root.join("blueBeersToConsume"), BlueLight.class);
             cq.where(qb.equal(blueLightJoin.get("discount"), 10));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<BeerConsumer> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -587,10 +587,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Company> cq = qb.createQuery(Company.class);
             Root<Company> root = cq.from(Company.class);
-            Join boatJoin = qb.treat(root.join("vehicles"), Boat.class);
+            Join<Object, Boat> boatJoin = qb.treat(root.join("vehicles"), Boat.class);
             cq.where(qb.or(qb.equal(boatJoin.get("model"), "speed"), qb.equal(boatJoin.get("model"), "fishing")));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Company> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 2);
         } finally {
@@ -638,11 +638,11 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Company> cq = qb.createQuery(Company.class);
             Root<Company> root = cq.from(Company.class);
-            Join b = qb.treat(root.join("vehicles", JoinType.LEFT), Boat.class);
-            Join f = qb.treat(root.join("vehicles", JoinType.LEFT), FueledVehicle.class);
+            Join<Object, Boat> b = qb.treat(root.join("vehicles", JoinType.LEFT), Boat.class);
+            Join<Object, FueledVehicle> f = qb.treat(root.join("vehicles", JoinType.LEFT), FueledVehicle.class);
             cq.where(qb.or(qb.equal(b.get("model"), "fishing"), qb.equal(f.get("fuelType"), "unleaded")));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Company> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 2);
         } finally {
@@ -702,10 +702,10 @@
             CriteriaQuery<Company> cq = qb.createQuery(Company.class);
             cq.distinct(true);
             Root<Company> root = cq.from(Company.class);
-            Join b = qb.treat(root.join("vehicles", JoinType.LEFT), Bus.class);
+            Join<Object, Bus> b = qb.treat(root.join("vehicles", JoinType.LEFT), Bus.class);
             cq.where(qb.equal(b.get("busDriver").get("name"), "Driver"));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Company> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -751,11 +751,11 @@
             CriteriaQuery<Person> cq = qb.createQuery(Person.class);
             cq.distinct(true);
             Root<Person> root = cq.from(Person.class);
-            Join s = qb.treat(root.join("car", JoinType.LEFT), SportsCar.class);
-            Join j = qb.treat(root.join("car", JoinType.LEFT), Jalopy.class);
+            Join<Object, SportsCar> s = qb.treat(root.join("car", JoinType.LEFT), SportsCar.class);
+            Join<Object, Jalopy> j = qb.treat(root.join("car", JoinType.LEFT), Jalopy.class);
             cq.where(qb.or(qb.equal(s.get("maxSpeed"), 200), qb.equal(j.get("percentRust"), 20)));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Person> resultList = em.createQuery(cq).getResultList();
             assertTrue("Incorrect results returned", resultList.size() == 2);
         } finally {
             if (this.isTransactionActive(em)){
@@ -803,10 +803,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Number> cq = qb.createQuery(Number.class);
             Root<Employee> root = cq.from(Employee.class);
-            Join l = qb.treat(root.join("projects"), LargeProject.class);
+            Join<Object, LargeProject> l = qb.treat(root.join("projects"), LargeProject.class);
             cq.select(qb.max(l.get("budget")));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Number> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect result size returned", resultList.size() == 1);
             assertTrue("Incorrect results returned", (Double)resultList.get(0) == 1000);
@@ -860,11 +860,11 @@
             Root<Employee> root = cq.from(Employee.class);
             Subquery<Number> sq = cq.subquery(Number.class);
             Root<Employee> sRoot = sq.from(Employee.class);
-            Join l = qb.treat(root.join("projects"), LargeProject.class);
+            Join<Object, LargeProject> l = qb.treat(root.join("projects"), LargeProject.class);
             sq.select(qb.max(l.get("budget")));
             cq.where(qb.gt(root.<Number>get("salary"), sq));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Employee> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect result size returned", resultList.size() == 1);
         } finally {
@@ -907,11 +907,11 @@
             CriteriaQuery<Person> cq = qb.createQuery(Person.class);
             Root<Person> root = cq.from(Person.class);
             root.fetch("car");
-            Join s = qb.treat(root.join("car"), SportsCar.class);
+            Join<Object, SportsCar> s = qb.treat(root.join("car"), SportsCar.class);
             cq.where(qb.equal(s.get("maxSpeed"), 200));
 
-            List resultList = em.createQuery(cq).getResultList();
-            Person person = (Person)resultList.get(0);
+            List<Person> resultList = em.createQuery(cq).getResultList();
+            Person person = resultList.get(0);
             assertTrue("Incorrect result size returned", resultList.size() == 1);
             assertNotNull("The car was not fetched.", person.car);
         } finally {
@@ -957,7 +957,7 @@
             Root<Car> root = cq.from(Car.class);
             cq.where(qb.or(qb.equal( qb.treat(root, SportsCar.class).get("maxSpeed"), 200), qb.equal( qb.treat(root, Jalopy.class).get("percentRust"), 20)));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Car> resultList = em.createQuery(cq).getResultList();
             assertTrue("Incorrect results returned", resultList.size() == 2);
         } finally {
             if (this.isTransactionActive(em)){
@@ -997,7 +997,7 @@
             Root<TireInfo> root = cq.from(TireInfo.class);
             cq.where(qb.or(qb.equal( qb.treat(root, PerformanceTireInfo.class).get("speedRating"), 110), qb.equal( qb.treat(root, PassengerPerformanceTireInfo.class).get("speedRating"), 120)));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<TireInfo> resultList = em.createQuery(cq).getResultList();
             assertTrue("Incorrect results returned", resultList.size() == 2);
         } finally {
             if (this.isTransactionActive(em)){
@@ -1044,10 +1044,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Person> cq = qb.createQuery(Person.class);
             Root<Person> root = cq.from(Person.class);
-            Join s = qb.treat(root.join("car"), SportsCar.class);
+            Join<Object, SportsCar> s = qb.treat(root.join("car"), SportsCar.class);
             cq.select(s.get("maxSpeed"));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Person> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -1092,10 +1092,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Bus> cq = qb.createQuery(Bus.class);
             Root<Bus> root = cq.from(Bus.class);
-            Join b = qb.treat(root.join("tires"), PerformanceTireInfo.class);
+            Join<Object, PerformanceTireInfo> b = qb.treat(root.join("tires"), PerformanceTireInfo.class);
             cq.select(b.get("speedRating"));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Bus> resultList = em.createQuery(cq).getResultList();
             assertTrue("Incorrect results returned", resultList.size() == 2);
         } finally {
             if (this.isTransactionActive(em)){
@@ -1144,7 +1144,7 @@
             Root<Person> root = cq.from(Person.class);
             cq.where(qb.equal(qb.treat(root.get("car"), SportsCar.class).get("maxSpeed"), 200));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Person> resultList = em.createQuery(cq).getResultList();
 
             assertTrue("Incorrect results returned", resultList.size() == 1);
         } finally {
@@ -1189,10 +1189,10 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Bus> cq = qb.createQuery(Bus.class);
             Root<Bus> root = cq.from(Bus.class);
-            Join b = qb.treat(root.join("tires"), PerformanceTireInfo.class);
+            Join<Object, PerformanceTireInfo> b = qb.treat(root.join("tires"), PerformanceTireInfo.class);
             cq.where(qb.greaterThan(qb.treat(root.get("tires"), PerformanceTireInfo.class).<Integer>get("speedRating"), 100));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Bus> resultList = em.createQuery(cq).getResultList();
             assertTrue("Incorrect results returned", resultList.size() == 2);
         } finally {
             if (this.isTransactionActive(em)){
@@ -1248,14 +1248,14 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Person> cq = qb.createQuery(Person.class);
             Root<Person> root = cq.from(Person.class);
-            Join c = root.join("car");
+            Join<Object, Object> c = root.join("car");
             cq.where(qb.and( qb.equal(c.get("color"), "Red"),
                              qb.or( qb.equal(qb.treat(c, SportsCar.class).get("maxSpeed"), 200),
                                      qb.equal(qb.treat(c, Jalopy.class).get("percentRust"), 20)
                                    )
                             ));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Person> resultList = em.createQuery(cq).getResultList();
             assertEquals("Incorrect results returned", 2, resultList.size());
         } finally {
             if (this.isTransactionActive(em)){
@@ -1298,14 +1298,14 @@
             CriteriaBuilder qb = em.getCriteriaBuilder();
             CriteriaQuery<Bus> cq = qb.createQuery(Bus.class);
             Root<Bus> root = cq.from(Bus.class);
-            Join t = root.join("tires");
+            Join<Object, Object> t = root.join("tires");
             cq.where(qb.and( qb.gt(t.get("pressure"), 0),
                              qb.or( qb.equal(qb.treat(t, PassengerPerformanceTireInfo.class).get("maxSpeed"), 200),
                                      qb.equal(qb.treat(t, OffRoadTireInfo.class).get("name"), "doesNotExist")
                                    )
                             ));
 
-            List resultList = em.createQuery(cq).getResultList();
+            List<Bus> resultList = em.createQuery(cq).getResultList();
             assertEquals("Incorrect results returned", 1, resultList.size());
         } finally {
             if (this.isTransactionActive(em)){
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/CriteriaQueryTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/CriteriaQueryTestSuite.java
index 9cc7c3d..7433fa9 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/CriteriaQueryTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/CriteriaQueryTestSuite.java
@@ -36,7 +36,6 @@
 import jakarta.persistence.metamodel.EntityType;
 
 import junit.framework.Test;
-import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
 import org.eclipse.persistence.internal.jpa.EJBQueryImpl;
@@ -123,9 +122,9 @@
         CriteriaBuilder qb = em.getCriteriaBuilder();
         CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
         Root<Employee> root = cq.from(Employee.class);
-        Join address = root.join("address");
+        Join<Object, Object> address = root.join("address");
         address.on(qb.equal(address.get("city"), "Ottawa"));
-        List testResult = em.createQuery(cq).getResultList();
+        List<Employee> testResult = em.createQuery(cq).getResultList();
 
         clearCache();
         closeEntityManager(em);
@@ -144,9 +143,9 @@
         CriteriaBuilder qb = em.getCriteriaBuilder();
         CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
         Root<Employee> root = cq.from(Employee.class);
-        Join phoneNumber = root.join("phoneNumbers");
+        Join<Object, Object> phoneNumber = root.join("phoneNumbers");
         phoneNumber.on(qb.equal(phoneNumber.get("areaCode"), "613"));
-        List testResult = em.createQuery(cq).getResultList();
+        List<Employee> testResult = em.createQuery(cq).getResultList();
 
         clearCache();
         closeEntityManager(em);
@@ -166,10 +165,10 @@
         CriteriaBuilder qb = em.getCriteriaBuilder();
         CriteriaQuery<Employee>cq = qb.createQuery(Employee.class);
         Root<Employee> root = cq.from(Employee.class);
-        Join address = root.join("address", JoinType.LEFT);
+        Join<Object, Object> address = root.join("address", JoinType.LEFT);
         address.on(qb.equal(address.get("city"), "Ottawa"));
         cq.where(qb.isNotNull(address.get("postalCode")));
-        List testResult = em.createQuery(cq).getResultList();
+        List<Employee> testResult = em.createQuery(cq).getResultList();
 
         clearCache();
         closeEntityManager(em);
@@ -196,7 +195,7 @@
         CriteriaBuilder qb = jpaEM.getCriteriaBuilder();
         CriteriaQuery<Employee>cq = qb.createQuery(Employee.class);
         Root<Employee> root = cq.from(Employee.class);
-        Join address = root.join("manager", JoinType.LEFT).join("address", JoinType.LEFT);
+        Join<Object, Object> address = root.join("manager", JoinType.LEFT).join("address", JoinType.LEFT);
         address.on(qb.equal(address.get("city"), "Ottawa"));
         cq.where(qb.isNotNull(address.get("postalCode")));
         EJBQueryImpl testQuery = (EJBQueryImpl)jpaEM.createQuery(cq);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/EntityGraphTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/EntityGraphTestSuite.java
index f99a3dd..ebe77dd 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/EntityGraphTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/EntityGraphTestSuite.java
@@ -38,7 +38,7 @@
 
 public class EntityGraphTestSuite extends JUnitTestCase {
     protected boolean m_reset = false;
-    protected Map guaranteedIds = new HashMap<Class, Object>();
+    protected Map<Class, Object> guaranteedIds = new HashMap<Class, Object>();
 
     public EntityGraphTestSuite() {}
 
@@ -101,7 +101,7 @@
 
     public void testsubclassSubgraphs(){
         EntityManager em = createEntityManager();
-        EntityGraph employeeGraph = em.createEntityGraph(Project.class);
+        EntityGraph<Project> employeeGraph = em.createEntityGraph(Project.class);
         employeeGraph.addSubclassSubgraph(LargeProject.class).addAttributeNodes("budget");
         employeeGraph.addAttributeNodes("description");
         List<Project> result = em.createQuery("Select p from Project p where type(p) = LargeProject").setHint(QueryHints.JPA_FETCH_GRAPH, employeeGraph).getResultList();
@@ -115,7 +115,7 @@
 
     public void testEmbeddedFetchGroup(){
         EntityManager em = createEntityManager();
-        EntityGraph employeeGraph = em.createEntityGraph(Employee.class);
+        EntityGraph<Employee> employeeGraph = em.createEntityGraph(Employee.class);
         employeeGraph.addSubgraph("period").addAttributeNodes("startDate");
         Employee result = (Employee) em.createQuery("Select e from Employee e").setMaxResults(1).setHint(QueryHints.JPA_FETCH_GRAPH, employeeGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
@@ -130,7 +130,7 @@
 
     public void testNestedEmbeddedFetchGroup(){
         EntityManager em = createEntityManager();
-        EntityGraph fetchGraph = em.createEntityGraph(Runner.class);
+        EntityGraph<Runner> fetchGraph = em.createEntityGraph(Runner.class);
         fetchGraph.addSubgraph("info").addSubgraph("status").addAttributeNodes("runningStatus");
         Runner result = (Runner)em.createQuery("Select r from Runner r").setMaxResults(1).setHint(QueryHints.JPA_FETCH_GRAPH, fetchGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
@@ -146,7 +146,7 @@
 
     public void testLoadGroup(){
         EntityManager em = createEntityManager();
-        EntityGraph employeeGraph = em.createEntityGraph(Employee.class);
+        EntityGraph<Employee> employeeGraph = em.createEntityGraph(Employee.class);
         employeeGraph.addAttributeNodes("address");
         Employee result = (Employee) em.createQuery("Select e from Employee e").setMaxResults(1).setHint(QueryHints.JPA_LOAD_GRAPH, employeeGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
@@ -157,7 +157,7 @@
 
     public void testEmbeddedFetchGroupRefresh(){
         EntityManager em = createEntityManager();
-        EntityGraph employeeGraph = em.createEntityGraph(Employee.class);
+        EntityGraph<Employee> employeeGraph = em.createEntityGraph(Employee.class);
         employeeGraph.addSubgraph("period").addAttributeNodes("startDate");
         Employee result = (Employee) em.createQuery("Select e from Employee e order by e.salary desc").setMaxResults(1).setHint(QueryHints.JPA_FETCH_GRAPH, employeeGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
@@ -169,7 +169,7 @@
 
     public void testMapKeyFetchGroupRefresh(){
         EntityManager em = createEntityManager();
-        EntityGraph runnerGraph = em.createEntityGraph(Runner.class);
+        EntityGraph<Runner> runnerGraph = em.createEntityGraph(Runner.class);
         runnerGraph.addKeySubgraph("shoes");
         Runner result = (Runner) em.createQuery("Select r from Runner r join r.shoes s").setHint(QueryHints.JPA_FETCH_GRAPH, runnerGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/QueryTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/QueryTestSuite.java
index 9d99597..b65b098 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/QueryTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/QueryTestSuite.java
@@ -21,9 +21,7 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import jakarta.persistence.ColumnResult;
 import jakarta.persistence.EntityManager;
-import jakarta.persistence.EntityManagerFactory;
 import jakarta.persistence.LockModeType;
 import jakarta.persistence.Parameter;
 import jakarta.persistence.PersistenceException;
@@ -31,19 +29,18 @@
 import jakarta.persistence.TypedQuery;
 import jakarta.persistence.criteria.CriteriaBuilder;
 import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Expression;
 import jakarta.persistence.criteria.From;
 import jakarta.persistence.criteria.JoinType;
 import jakarta.persistence.criteria.Root;
 
 import junit.framework.Test;
-import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
 import org.eclipse.persistence.exceptions.QueryException;
 import org.eclipse.persistence.testing.framework.junit.JUnitTestCase;
 import org.eclipse.persistence.testing.models.jpa21.advanced.AdvancedTableCreator;
 import org.eclipse.persistence.testing.models.jpa21.advanced.Employee;
-import org.eclipse.persistence.testing.models.jpa21.advanced.EmployeePopulator;
 import org.eclipse.persistence.testing.models.jpa21.advanced.Item;
 import org.eclipse.persistence.testing.models.jpa21.advanced.Order;
 
@@ -132,7 +129,7 @@
     public void testTypedQueryParameter(){
         EntityManager em = createEntityManager();
         TypedQuery<Employee> query = em.createQuery("select e from Employee e where e.firstName = :firstName", Employee.class);
-        Parameter parameter = query.getParameter("firstName");
+        Parameter<?> parameter = query.getParameter("firstName");
         assertTrue("Parameter did not return correct type", parameter.getParameterType().equals(String.class));
     }
 
@@ -219,8 +216,8 @@
     public void testCriteriaGetGroupList(){
         EntityManager em = createEntityManager();
         CriteriaBuilder qb = em.getCriteriaBuilder();
-        CriteriaQuery query = qb.createQuery(Employee.class);
-        List groupList = query.getGroupList();
+        CriteriaQuery<Employee> query = qb.createQuery(Employee.class);
+        List<Expression<?>> groupList = query.getGroupList();
         assertNotNull("getGroupList returned null.", groupList);
     }
 
@@ -244,7 +241,7 @@
     public void testCriteriaGetJoinType(){
         EntityManager em = createEntityManager();
         CriteriaBuilder qbuilder = em.getCriteriaBuilder();
-        CriteriaQuery query = qbuilder.createQuery(Employee.class);
+        CriteriaQuery<Employee> query = qbuilder.createQuery(Employee.class);
         Root<Employee> employee = query.from(Employee.class);
         JoinType jt =  employee.join("phoneNumbers", JoinType.LEFT).getJoinType();
         assertEquals("The join type was incorect.", jt, JoinType.LEFT);
@@ -253,7 +250,7 @@
     public void testCriteriaIsCorelated(){
         EntityManager em = createEntityManager();
         CriteriaBuilder qbuilder = em.getCriteriaBuilder();
-        CriteriaQuery query = qbuilder.createQuery(Employee.class);
+        CriteriaQuery<Employee> query = qbuilder.createQuery(Employee.class);
         From<Employee, Employee> employee = query.from(Employee.class);
         boolean isCorr = employee.isCorrelated();
         assertFalse(isCorr);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/StoredProcedureQueryTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/StoredProcedureQueryTestSuite.java
index 93dbd87..556768f 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/StoredProcedureQueryTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa21/advanced/StoredProcedureQueryTestSuite.java
@@ -16,7 +16,6 @@
 package org.eclipse.persistence.testing.tests.jpa21.advanced;
 
 import java.util.List;
-import java.util.Set;
 
 import jakarta.persistence.EntityManager;
 import jakarta.persistence.Parameter;
@@ -27,12 +26,7 @@
 import junit.framework.TestSuite;
 import junit.framework.Test;
 
-import org.eclipse.persistence.internal.helper.DatabaseField;
-import org.eclipse.persistence.internal.jpa.StoredProcedureQueryImpl;
-import org.eclipse.persistence.jpa.JpaEntityManager;
-
 import org.eclipse.persistence.queries.ResultSetMappingQuery;
-import org.eclipse.persistence.queries.SQLCall;
 import org.eclipse.persistence.queries.ColumnResult;
 import org.eclipse.persistence.queries.ConstructorResult;
 import org.eclipse.persistence.queries.EntityResult;
@@ -241,8 +235,8 @@
                 query.setParameter("old_p_code_v", postalCodeTypo);
 
                 // Make these calls to test the getParameter call with a name.
-                Parameter paramNew = query.getParameter("new_p_code_v");
-                Parameter paramOld = query.getParameter("old_p_code_v");
+                Parameter<?> paramNew = query.getParameter("new_p_code_v");
+                Parameter<?> paramOld = query.getParameter("old_p_code_v");
 
                 Object results = query.getSingleResult();
             } catch (IllegalStateException e) {
@@ -953,9 +947,9 @@
                 query.setParameter(2, 2);
 
                 // Make this call to test the getParameter call with a position.
-                Parameter param1 = query.getParameter(1);
-                Parameter param2 = query.getParameter(2);
-                Parameter param3 = query.getParameter(3);
+                Parameter<?> param1 = query.getParameter(1);
+                Parameter<?> param2 = query.getParameter(2);
+                Parameter<?> param3 = query.getParameter(3);
 
             } catch (IllegalArgumentException e) {
                 if (isTransactionActive(em)){
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/CriteriaQueryTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/CriteriaQueryTestSuite.java
index ceccf1b..7f4cbef 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/CriteriaQueryTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/CriteriaQueryTestSuite.java
@@ -36,7 +36,6 @@
 import jakarta.persistence.metamodel.EntityType;
 
 import junit.framework.Test;
-import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
 import org.eclipse.persistence.internal.jpa.EJBQueryImpl;
@@ -123,9 +122,9 @@
         CriteriaBuilder qb = em.getCriteriaBuilder();
         CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
         Root<Employee> root = cq.from(Employee.class);
-        Join address = root.join("address");
+        Join<Object, Object> address = root.join("address");
         address.on(qb.equal(address.get("city"), "Ottawa"));
-        List testResult = em.createQuery(cq).getResultList();
+        List<Employee> testResult = em.createQuery(cq).getResultList();
 
         clearCache();
         closeEntityManager(em);
@@ -144,9 +143,9 @@
         CriteriaBuilder qb = em.getCriteriaBuilder();
         CriteriaQuery<Employee> cq = qb.createQuery(Employee.class);
         Root<Employee> root = cq.from(Employee.class);
-        Join phoneNumber = root.join("phoneNumbers");
+        Join<Object, Object> phoneNumber = root.join("phoneNumbers");
         phoneNumber.on(qb.equal(phoneNumber.get("areaCode"), "613"));
-        List testResult = em.createQuery(cq).getResultList();
+        List<Employee> testResult = em.createQuery(cq).getResultList();
 
         clearCache();
         closeEntityManager(em);
@@ -166,10 +165,10 @@
         CriteriaBuilder qb = em.getCriteriaBuilder();
         CriteriaQuery<Employee>cq = qb.createQuery(Employee.class);
         Root<Employee> root = cq.from(Employee.class);
-        Join address = root.join("address", JoinType.LEFT);
+        Join<Object, Object> address = root.join("address", JoinType.LEFT);
         address.on(qb.equal(address.get("city"), "Ottawa"));
         cq.where(qb.isNotNull(address.get("postalCode")));
-        List testResult = em.createQuery(cq).getResultList();
+        List<Employee> testResult = em.createQuery(cq).getResultList();
 
         clearCache();
         closeEntityManager(em);
@@ -196,7 +195,7 @@
         CriteriaBuilder qb = jpaEM.getCriteriaBuilder();
         CriteriaQuery<Employee>cq = qb.createQuery(Employee.class);
         Root<Employee> root = cq.from(Employee.class);
-        Join address = root.join("manager", JoinType.LEFT).join("address", JoinType.LEFT);
+        Join<Object, Object> address = root.join("manager", JoinType.LEFT).join("address", JoinType.LEFT);
         address.on(qb.equal(address.get("city"), "Ottawa"));
         cq.where(qb.isNotNull(address.get("postalCode")));
         EJBQueryImpl testQuery = (EJBQueryImpl)jpaEM.createQuery(cq);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/EntityGraphTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/EntityGraphTestSuite.java
index c15dfb1..0e634fd 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/EntityGraphTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/EntityGraphTestSuite.java
@@ -38,7 +38,7 @@
 
 public class EntityGraphTestSuite extends JUnitTestCase {
     protected boolean m_reset = false;
-    protected Map guaranteedIds = new HashMap<>();
+    protected Map<Object, Object> guaranteedIds = new HashMap<>();
 
     public EntityGraphTestSuite() {}
 
@@ -101,7 +101,7 @@
 
     public void testsubclassSubgraphs(){
         EntityManager em = createEntityManager();
-        EntityGraph employeeGraph = em.createEntityGraph(Project.class);
+        EntityGraph<Project> employeeGraph = em.createEntityGraph(Project.class);
         employeeGraph.addSubclassSubgraph(LargeProject.class).addAttributeNodes("budget");
         employeeGraph.addAttributeNodes("description");
         List<Project> result = em.createQuery("Select p from Project p where type(p) = LargeProject").setHint(QueryHints.JPA_FETCH_GRAPH, employeeGraph).getResultList();
@@ -115,7 +115,7 @@
 
     public void testEmbeddedFetchGroup(){
         EntityManager em = createEntityManager();
-        EntityGraph employeeGraph = em.createEntityGraph(Employee.class);
+        EntityGraph<Employee> employeeGraph = em.createEntityGraph(Employee.class);
         employeeGraph.addSubgraph("period").addAttributeNodes("startDate");
         Employee result = (Employee) em.createQuery("Select e from Employee e").setMaxResults(1).setHint(QueryHints.JPA_FETCH_GRAPH, employeeGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
@@ -130,7 +130,7 @@
 
     public void testNestedEmbeddedFetchGroup(){
         EntityManager em = createEntityManager();
-        EntityGraph fetchGraph = em.createEntityGraph(Runner.class);
+        EntityGraph<Runner> fetchGraph = em.createEntityGraph(Runner.class);
         fetchGraph.addSubgraph("info").addSubgraph("status").addAttributeNodes("runningStatus");
         Runner result = (Runner)em.createQuery("Select r from Runner r").setMaxResults(1).setHint(QueryHints.JPA_FETCH_GRAPH, fetchGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
@@ -146,7 +146,7 @@
 
     public void testLoadGroup(){
         EntityManager em = createEntityManager();
-        EntityGraph employeeGraph = em.createEntityGraph(Employee.class);
+        EntityGraph<Employee> employeeGraph = em.createEntityGraph(Employee.class);
         employeeGraph.addAttributeNodes("address");
         Employee result = (Employee) em.createQuery("Select e from Employee e").setMaxResults(1).setHint(QueryHints.JPA_LOAD_GRAPH, employeeGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
@@ -157,7 +157,7 @@
 
     public void testEmbeddedFetchGroupRefresh(){
         EntityManager em = createEntityManager();
-        EntityGraph employeeGraph = em.createEntityGraph(Employee.class);
+        EntityGraph<Employee> employeeGraph = em.createEntityGraph(Employee.class);
         employeeGraph.addSubgraph("period").addAttributeNodes("startDate");
         Employee result = (Employee) em.createQuery("Select e from Employee e order by e.salary desc").setMaxResults(1).setHint(QueryHints.JPA_FETCH_GRAPH, employeeGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
@@ -169,7 +169,7 @@
 
     public void testMapKeyFetchGroupRefresh(){
         EntityManager em = createEntityManager();
-        EntityGraph runnerGraph = em.createEntityGraph(Runner.class);
+        EntityGraph<Runner> runnerGraph = em.createEntityGraph(Runner.class);
         runnerGraph.addKeySubgraph("shoes");
         Runner result = (Runner) em.createQuery("Select r from Runner r join r.shoes s").setHint(QueryHints.JPA_FETCH_GRAPH, runnerGraph).getResultList().get(0);
         PersistenceUnitUtil util = em.getEntityManagerFactory().getPersistenceUnitUtil();
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/QueryTestSuite.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/QueryTestSuite.java
index f4fc7b3..438d405 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/QueryTestSuite.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/jpa22/advanced/QueryTestSuite.java
@@ -29,12 +29,12 @@
 import jakarta.persistence.TypedQuery;
 import jakarta.persistence.criteria.CriteriaBuilder;
 import jakarta.persistence.criteria.CriteriaQuery;
+import jakarta.persistence.criteria.Expression;
 import jakarta.persistence.criteria.From;
 import jakarta.persistence.criteria.JoinType;
 import jakarta.persistence.criteria.Root;
 
 import junit.framework.Test;
-import junit.framework.TestCase;
 import junit.framework.TestSuite;
 
 import org.eclipse.persistence.exceptions.QueryException;
@@ -129,7 +129,7 @@
     public void testTypedQueryParameter(){
         EntityManager em = createEntityManager();
         TypedQuery<Employee> query = em.createQuery("select e from Employee e where e.firstName = :firstName", Employee.class);
-        Parameter parameter = query.getParameter("firstName");
+        Parameter<?> parameter = query.getParameter("firstName");
         assertTrue("Parameter did not return correct type", parameter.getParameterType().equals(String.class));
     }
 
@@ -216,8 +216,8 @@
     public void testCriteriaGetGroupList(){
         EntityManager em = createEntityManager();
         CriteriaBuilder qb = em.getCriteriaBuilder();
-        CriteriaQuery query = qb.createQuery(Employee.class);
-        List groupList = query.getGroupList();
+        CriteriaQuery<Employee> query = qb.createQuery(Employee.class);
+        List<Expression<?>> groupList = query.getGroupList();
         assertNotNull("getGroupList returned null.", groupList);
     }
 
@@ -241,7 +241,7 @@
     public void testCriteriaGetJoinType(){
         EntityManager em = createEntityManager();
         CriteriaBuilder qbuilder = em.getCriteriaBuilder();
-        CriteriaQuery query = qbuilder.createQuery(Employee.class);
+        CriteriaQuery<Employee> query = qbuilder.createQuery(Employee.class);
         Root<Employee> employee = query.from(Employee.class);
         JoinType jt =  employee.join("phoneNumbers", JoinType.LEFT).getJoinType();
         assertEquals("The join type was incorect.", jt, JoinType.LEFT);
@@ -250,7 +250,7 @@
     public void testCriteriaIsCorelated(){
         EntityManager em = createEntityManager();
         CriteriaBuilder qbuilder = em.getCriteriaBuilder();
-        CriteriaQuery query = qbuilder.createQuery(Employee.class);
+        CriteriaQuery<Employee> query = qbuilder.createQuery(Employee.class);
         From<Employee, Employee> employee = query.from(Employee.class);
         boolean isCorr = employee.isCorrelated();
         assertFalse(isCorr);
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/weaving/EmployeeWeavingTestModel.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/weaving/EmployeeWeavingTestModel.java
index 020af85..78572a5 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/weaving/EmployeeWeavingTestModel.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/weaving/EmployeeWeavingTestModel.java
@@ -96,9 +96,9 @@
         suite.setName("EmployeeWeavedReadObjectTestSuite");
         suite.setDescription("This suite test the reading of each object in the employee weaved performance model.");
 
-        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")));
@@ -123,9 +123,9 @@
         suite.setName("EmployeeWeavedUpdateTestSuite");
         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 UnitOfWorkBasicUpdateObjectTest(manager.getObject(employeeClass, "0001")));
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/weaving/SimpleWeavingTestModel.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/weaving/SimpleWeavingTestModel.java
index 0e3fa01..81c6de3 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/weaving/SimpleWeavingTestModel.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/tests/weaving/SimpleWeavingTestModel.java
@@ -18,6 +18,7 @@
 import java.util.*;
 
 // TopLink Testing Framework
+import junit.framework.Test;
 import org.eclipse.persistence.testing.framework.*;
 
 public class SimpleWeavingTestModel extends TestModel {
@@ -29,7 +30,7 @@
     @Override
     public void addTests() {
         junit.framework.TestSuite testsuite = (junit.framework.TestSuite)SimpleWeaverTestSuite.suite();
-        for (Enumeration e = testsuite.tests(); e.hasMoreElements();) {
+        for (Enumeration<Test> e = testsuite.tests(); e.hasMoreElements();) {
             junit.framework.TestCase testcase =    (junit.framework.TestCase)e.nextElement();
             addTest(new JUnitTestCase(testcase));
         }
diff --git a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/query/TestJoinFetch.java b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/query/TestJoinFetch.java
index d531a2d..d0877f0 100644
--- a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/query/TestJoinFetch.java
+++ b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/query/TestJoinFetch.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2005, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2005, 2021 Oracle and/or its affiliates. All rights reserved.
  * Copyright (c) 2005, 2015 SAP. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -217,8 +217,8 @@
                         "fetch-joined hobbies were not attached to the entity after query execution.");
             }
 
-            for (Object emp : result) {
-                Employee emp1 = (Employee) emp;
+            for (Employee emp : result) {
+                Employee emp1 = emp;
                 Employee compareEmp = employeeStore.get(emp1.getId());
 
                 Comparator<Hobby> comp = new Comparator<Hobby>() {
diff --git a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestEmployeePatent.java b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestEmployeePatent.java
index 6e445a8..60731f2 100644
--- a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestEmployeePatent.java
+++ b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestEmployeePatent.java
@@ -172,8 +172,8 @@
         for (final Patent testPatent : testPatents) {
             checkMap.put(testPatent.getId(), testPatent);
         }
-        for (final Iterator iter = patents.iterator(); iter.hasNext();) {
-            final Patent patent = (Patent) iter.next();
+        for (final Iterator<Patent> iter = patents.iterator(); iter.hasNext();) {
+            final Patent patent = iter.next();
             final Patent check = checkMap.get(patent.getId());
             verify(check != null, "retrieved unknown patent with name >>" + patent.getId().getName() + "<<.");
             verify(check.getDescription().equals(patent.getDescription()), "patent with name >>" + patent.getId().getName()
diff --git a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestEmployee_Review.java b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestEmployee_Review.java
index af9f391..bb4fa53 100644
--- a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestEmployee_Review.java
+++ b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestEmployee_Review.java
@@ -61,7 +61,7 @@
             env.beginTransaction(em);
             Employee employee = em.find(Employee.class, 7);
             verify(employee != null, "employee not found");
-            Set reviews = employee.getReviews();
+            Set<Review> reviews = employee.getReviews();
             verify(reviews.size() == 2, "set has wrong size");
             verify(reviews.contains(_review1), "missing review 1");
             verify(reviews.contains(_review2), "missing review 2");
@@ -90,11 +90,11 @@
             env.beginTransaction(em);
             Employee employee = em.find(Employee.class, 7);
             verify(employee != null, "employee not found");
-            Set reviews = employee.getReviews();
+            Set<Review> reviews = employee.getReviews();
             verify(reviews.size() == 2, "set has wrong size");
             verify(reviews.contains(_review1), "missing review 1");
             verify(reviews.contains(_review2), "missing review 2");
-            Iterator iter = reviews.iterator();
+            Iterator<Review> iter = reviews.iterator();
             while (iter.hasNext()) {
                 verify(em.contains(iter.next()), "review in collection not contained in em");
             }
@@ -120,7 +120,7 @@
             }
             Employee employee = em.find(Employee.class, 7);
             verify(employee != null, "employee not found");
-            Set reviews = employee.getReviews();
+            Set<Review> reviews = employee.getReviews();
             try {
                 reviews.size();
                 if (failureExpected) {
@@ -145,7 +145,7 @@
             Employee employee = em.find(Employee.class, 7);
             verify(employee != null, "employee not found");
             employee = AbstractBaseTest.serializeDeserialize(employee);
-            Set reviews = employee.getReviews();
+            Set<Review> reviews = employee.getReviews();
             try {
                 reviews.size();
                 flop("missing persistence exception");
@@ -169,7 +169,7 @@
             env.beginTransaction(em);
             Employee employee = em.find(Employee.class, 7);
             verify(employee != null, "employee not found");
-            Set reviews = employee.getReviews();
+            Set<Review> reviews = employee.getReviews();
             // touch the set
             verify(reviews.size() == 2, "set has wrong size");
             env.rollbackTransactionAndClear(em);
diff --git a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestMultipleRelationships.java b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestMultipleRelationships.java
index 2948c15..00c0492 100644
--- a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestMultipleRelationships.java
+++ b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestMultipleRelationships.java
@@ -117,18 +117,18 @@
         try {
             env.beginTransaction(em);
             Employee hans = em.find(Employee.class, HANS_ID);
-            Set reviews = hans.getReviews();
+            Set<Review> reviews = hans.getReviews();
             verify(reviews != null, "Hans has no reviews");
             verify(reviews.size() == 2, "Hans has wrong number of reviews");
             verify(reviews.contains(PASSION), "Hans has no passion!");
             verify(reviews.contains(PERFORMANCE), "Hans has no performance!");
-            Set projects = hans.getProjects();
+            Set<Project> projects = hans.getProjects();
             verify(projects != null, "Hans has no projects");
             verify(projects.size() == 3, "Hans has wrong number of projects");
             verify(projects.contains(PUHLEN), "Hans misses project " + PUHLEN.getName());
             verify(projects.contains(PINSELN), "Hans misses project " + PINSELN.getName());
             verify(projects.contains(FALTEN), "Hans misses project " + FALTEN.getName());
-            Collection patents = hans.getPatents();
+            Collection<Patent> patents = hans.getPatents();
             verify(patents != null, "Hans has no patens");
             verify(patents.size() == 2, "Hans has wrong number of patents");
             verify(patents.contains(PHONOGRAPGH), "Hans misses patent " + PHONOGRAPGH.getId().getName());
@@ -147,17 +147,17 @@
         try {
             env.beginTransaction(em);
             Employee hans = em.find(Employee.class, HANS_ID);
-            Collection patents = hans.getPatents();
+            Collection<Patent> patents = hans.getPatents();
             patents.remove(PHONOGRAPGH);
             env.commitTransactionAndClear(em);
             env.beginTransaction(em);
             hans = em.find(Employee.class, HANS_ID);
-            Set reviews = hans.getReviews();
+            Set<Review> reviews = hans.getReviews();
             verify(reviews != null, "Hans has no reviews");
             verify(reviews.size() == 2, "Hans has wrong number of reviews");
             verify(reviews.contains(PASSION), "Hans has no passion!");
             verify(reviews.contains(PERFORMANCE), "Hans has no performance!");
-            Set projects = hans.getProjects();
+            Set<Project> projects = hans.getProjects();
             verify(projects != null, "Hans has no projects");
             verify(projects.size() == 3, "Hans has wrong number of projects");
             verify(projects.contains(PUHLEN), "Hans misses project " + PUHLEN.getName());
@@ -185,19 +185,19 @@
             env.commitTransactionAndClear(em);
             env.beginTransaction(em);
             hans = em.find(Employee.class, HANS_ID);
-            Set reviews = hans.getReviews();
+            Set<Review> reviews = hans.getReviews();
             verify(reviews != null, "Hans has no reviews");
             verify(reviews.size() == 3, "Hans has wrong number of reviews");
             verify(reviews.contains(PASSION), "Hans has no passion!");
             verify(reviews.contains(PERFORMANCE), "Hans has no performance!");
             verify(reviews.contains(PROFICIENCY), "Hans has no performance!");
-            Set projects = hans.getProjects();
+            Set<Project> projects = hans.getProjects();
             verify(projects != null, "Hans has no projects");
             verify(projects.size() == 3, "Hans has wrong number of projects");
             verify(projects.contains(PUHLEN), "Hans misses project " + PUHLEN.getName());
             verify(projects.contains(PINSELN), "Hans misses project " + PINSELN.getName());
             verify(projects.contains(FALTEN), "Hans misses project " + FALTEN.getName());
-            Collection patents = hans.getPatents();
+            Collection<Patent> patents = hans.getPatents();
             verify(patents != null, "Hans has no patens");
             verify(patents.size() == 2, "Hans has wrong number of patents");
             verify(patents.contains(PHONOGRAPGH), "Hans misses patent " + PHONOGRAPGH.getId().getName());
diff --git a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestNode.java b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestNode.java
index a2644cb..a79a4f5 100644
--- a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestNode.java
+++ b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestNode.java
@@ -129,7 +129,7 @@
             children = root2.getChildren();
             verify(children.contains(child), "child not contained in set of children");
             root1 = em.find(Node.class, root1Id);
-            Set children1 = root1.getChildren();
+            Set<Node> children1 = root1.getChildren();
             verify(children1 == null || children1.isEmpty(), "children of root1 not null or empty");
             env.rollbackTransactionAndClear(em);
         } finally {
diff --git a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestPatentReview.java b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestPatentReview.java
index f9998d0..fc1e30e 100644
--- a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestPatentReview.java
+++ b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestPatentReview.java
@@ -47,10 +47,10 @@
             em.persist(patent);
             em.persist(patentReview);
             env.commitTransactionAndClear(em);
-            Object found = em.find(PatentReview.class, 17);
+            PatentReview found = em.find(PatentReview.class, 17);
             verify(found != null, "nothing found");
             verify(found instanceof PatentReview, "wrong instance: " + found.getClass().getName());
-            PatentReview review = (PatentReview) found;
+            PatentReview review = found;
             verify(review.getPatent() != null, "patent is null");
             Patent pat = review.getPatent();
             PatentId id = pat.getId();
diff --git a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestUnidirectionalOneToMany.java b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestUnidirectionalOneToMany.java
index 037acbe..5bd0746 100644
--- a/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestUnidirectionalOneToMany.java
+++ b/jpa/eclipselink.jpa.wdf.test/src/it/java/org/eclipse/persistence/testing/tests/wdf/jpa1/relation/TestUnidirectionalOneToMany.java
@@ -160,11 +160,11 @@
             env.beginTransaction(em);
             Employee emp = em.find(Employee.class, EMP_ID);
             verify(emp != null, "employee not found");
-            Set reviews = emp.getReviews();
+            Set<Review> reviews = emp.getReviews();
             verify(reviews != null, "reviews are null");
             verify(reviews.size() == 3, "not exactly 3 reviews but " + reviews.size());
-            Iterator iter = reviews.iterator();
-            Review review = (Review) iter.next();
+            Iterator<Review> iter = reviews.iterator();
+            Review review = iter.next();
             int removedId = review.getId();
             // there are no managed relationships -> we have to remove the reviews on both sides
             em.remove(review);
@@ -224,8 +224,8 @@
             Employee emp = em.find(Employee.class, EMP_ID);
             verify(emp != null, "employee not found");
             Set<Review> reviews = emp.getReviews();
-            Iterator iter = reviews.iterator();
-            Review review = (Review) iter.next();
+            Iterator<Review> iter = reviews.iterator();
+            Review review = iter.next();
             int removedId = review.getId();
             // there are no managed relationships -> we have to remove the reviews on both sides
             em.remove(review);
diff --git a/jpa/org.eclipse.persistence.jpa.modelgen/src/main/java/org/eclipse/persistence/internal/jpa/modelgen/objects/PersistenceUnit.java b/jpa/org.eclipse.persistence.jpa.modelgen/src/main/java/org/eclipse/persistence/internal/jpa/modelgen/objects/PersistenceUnit.java
index 63a5a1e..f7abc4e 100644
--- a/jpa/org.eclipse.persistence.jpa.modelgen/src/main/java/org/eclipse/persistence/internal/jpa/modelgen/objects/PersistenceUnit.java
+++ b/jpa/org.eclipse.persistence.jpa.modelgen/src/main/java/org/eclipse/persistence/internal/jpa/modelgen/objects/PersistenceUnit.java
@@ -372,7 +372,7 @@
     public String getPersistenceUnitProperty(final String name) {
         Object objVal = persistenceUnitProperties.get(name);
         if (objVal instanceof String) {
-            return String.class.cast(objVal);
+            return (String) objVal;
         } else {
             return objVal != null ? objVal.toString() : null;
         }
diff --git a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner1Bean.java b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner1Bean.java
index 16b5906..8fc2d5c 100644
--- a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner1Bean.java
+++ b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner1Bean.java
@@ -59,9 +59,10 @@
         // load the test class and create an instance
         TestCase testInstance = null;
         try {
-            Class testClass = getClass().getClassLoader().loadClass(className);
-            Constructor c = testClass.getConstructor(new Class[] { String.class });
-            testInstance = (TestCase) c.newInstance(new Object[] { test });
+            @SuppressWarnings({"unchecked"})
+            Class<? extends TestCase> testClass = (Class<? extends TestCase>) getClass().getClassLoader().loadClass(className);
+            Constructor<? extends TestCase> c = testClass.getConstructor(new Class[] { String.class });
+            testInstance = c.newInstance(new Object[] { test });
         } catch (ClassNotFoundException e) {
             throw new EJBException(e);
         } catch (NoSuchMethodException e) {
diff --git a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner2Bean.java b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner2Bean.java
index e8e9f54..3d1e4a2 100644
--- a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner2Bean.java
+++ b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner2Bean.java
@@ -59,9 +59,10 @@
         // load the test class and create an instance
         TestCase testInstance = null;
         try {
-            Class testClass = getClass().getClassLoader().loadClass(className);
-            Constructor c = testClass.getConstructor(new Class[] { String.class });
-            testInstance = (TestCase) c.newInstance(new Object[] { test });
+            @SuppressWarnings({"unchecked"})
+            Class<? extends TestCase> testClass = (Class<? extends TestCase>) getClass().getClassLoader().loadClass(className);
+            Constructor<? extends TestCase> c = testClass.getConstructor(new Class[] { String.class });
+            testInstance = c.newInstance(new Object[] { test });
         } catch (ClassNotFoundException e) {
             throw new EJBException(e);
         } catch (NoSuchMethodException e) {
diff --git a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner3Bean.java b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner3Bean.java
index 8657ea7..4dd793e 100644
--- a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner3Bean.java
+++ b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner3Bean.java
@@ -59,9 +59,10 @@
         // load the test class and create an instance
         TestCase testInstance = null;
         try {
-            Class testClass = getClass().getClassLoader().loadClass(className);
-            Constructor c = testClass.getConstructor(new Class[] { String.class });
-            testInstance = (TestCase) c.newInstance(new Object[] { test });
+            @SuppressWarnings({"unchecked"})
+            Class<? extends TestCase> testClass = (Class<? extends TestCase>) getClass().getClassLoader().loadClass(className);
+            Constructor<? extends TestCase> c = testClass.getConstructor(new Class[] { String.class });
+            testInstance = c.newInstance(new Object[] { test });
         } catch (ClassNotFoundException e) {
             throw new EJBException(e);
         } catch (NoSuchMethodException e) {
diff --git a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner4Bean.java b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner4Bean.java
index 9aaaf2a..027951b 100644
--- a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner4Bean.java
+++ b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner4Bean.java
@@ -59,9 +59,10 @@
         // load the test class and create an instance
         TestCase testInstance = null;
         try {
-            Class testClass = getClass().getClassLoader().loadClass(className);
-            Constructor c = testClass.getConstructor(new Class[] { String.class });
-            testInstance = (TestCase) c.newInstance(new Object[] { test });
+            @SuppressWarnings({"unchecked"})
+            Class<? extends TestCase> testClass = (Class<? extends TestCase>) getClass().getClassLoader().loadClass(className);
+            Constructor<? extends TestCase> c = testClass.getConstructor(new Class[] { String.class });
+            testInstance = c.newInstance(new Object[] { test });
         } catch (ClassNotFoundException e) {
             throw new EJBException(e);
         } catch (NoSuchMethodException e) {
diff --git a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner5Bean.java b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner5Bean.java
index fbd1a45..017deb8 100644
--- a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner5Bean.java
+++ b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner5Bean.java
@@ -59,9 +59,10 @@
         // load the test class and create an instance
         TestCase testInstance = null;
         try {
-            Class testClass = getClass().getClassLoader().loadClass(className);
-            Constructor c = testClass.getConstructor(new Class[] { String.class });
-            testInstance = (TestCase) c.newInstance(new Object[] { test });
+            @SuppressWarnings({"unchecked"})
+            Class<? extends TestCase> testClass = (Class<? extends TestCase>) getClass().getClassLoader().loadClass(className);
+            Constructor<? extends TestCase> c = testClass.getConstructor(new Class[] { String.class });
+            testInstance = c.newInstance(new Object[] { test });
         } catch (ClassNotFoundException e) {
             throw new EJBException(e);
         } catch (NoSuchMethodException e) {
diff --git a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner6Bean.java b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner6Bean.java
index 0ae4b96..86eba32 100644
--- a/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner6Bean.java
+++ b/jpa/org.eclipse.persistence.jpa.test.framework/src/main/java/org/eclipse/persistence/testing/framework/server/TestRunner6Bean.java
@@ -59,9 +59,10 @@
         // load the test class and create an instance
         TestCase testInstance = null;
         try {
-            Class testClass = getClass().getClassLoader().loadClass(className);
-            Constructor c = testClass.getConstructor(new Class[] { String.class });
-            testInstance = (TestCase) c.newInstance(new Object[] { test });
+            @SuppressWarnings({"unchecked"})
+            Class<? extends TestCase> testClass = (Class<? extends TestCase>) getClass().getClassLoader().loadClass(className);
+            Constructor<? extends TestCase> c = testClass.getConstructor(new Class[] { String.class });
+            testInstance = c.newInstance(new Object[] { test });
         } catch (ClassNotFoundException e) {
             throw new EJBException(e);
         } catch (NoSuchMethodException e) {
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 a7034d2..bb3feb6 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
@@ -111,7 +111,7 @@
      * @param allMappings
      */
     protected void addReadOnlyMappings(ClassDescriptor aDescriptor, DatabaseField field, List allMappings) {
-        List readOnlyMappings = aDescriptor.getObjectBuilder().getReadOnlyMappingsForField(field);
+        List<DatabaseMapping> readOnlyMappings = aDescriptor.getObjectBuilder().getReadOnlyMappingsForField(field);
 
         if (readOnlyMappings != null) {
             allMappings.addAll(readOnlyMappings);
@@ -261,7 +261,7 @@
                     DatabaseField targetKey = refmapping.getSourceToTargetKeyFields().get(pkElementArray[index].getDatabaseField());
                     CMPPolicy refPolicy = refmapping.getReferenceDescriptor().getCMPPolicy();
                     if (refPolicy.isCMP3Policy()){
-                        Class aPKClass = refPolicy.getPKClass();
+                        Class<Object> aPKClass = refPolicy.getPKClass();
                         if ((aPKClass != null) && (aPKClass != fieldValue.getClass()) && (!aPKClass.isAssignableFrom(fieldValue.getClass()))) {
                             throw new IllegalArgumentException(ExceptionLocalization.buildMessage("invalid_pk_class", new Object[] { aPKClass, fieldValue.getClass() }));
                         }
@@ -363,11 +363,11 @@
         fieldToAccessorMap = new HashMap<DatabaseField,KeyElementAccessor>();
         int numberOfIDFields = aDescriptor.getPrimaryKeyFields().size();
         pkAttributes = new KeyElementAccessor[numberOfIDFields];
-        Iterator attributesIter = aDescriptor.getPrimaryKeyFields().iterator();
+        Iterator<DatabaseField> attributesIter = aDescriptor.getPrimaryKeyFields().iterator();
 
         // Used fields in case it is an embedded class
         for (int i = 0; attributesIter.hasNext(); i++) {
-            DatabaseField field = (DatabaseField)attributesIter.next();
+            DatabaseField field = attributesIter.next();
 
             // We need to check all mappings for this field, not just the writable one and instead of
             // having multiple sections of duplicate code we'll just add the writable mapping directly
@@ -747,7 +747,7 @@
                 DatabaseField targetKey = refmapping.getSourceToTargetKeyFields().get(accessor.getDatabaseField());
                 CMPPolicy refPolicy = refmapping.getReferenceDescriptor().getCMPPolicy();
                 if (refPolicy.isCMP3Policy()){
-                    Class pkClass = refPolicy.getPKClass();
+                    Class<Object> pkClass = refPolicy.getPKClass();
                     if ((pkClass != null) && (pkClass != fieldValue.getClass()) && (!pkClass.isAssignableFrom(fieldValue.getClass()))) {
                         throw new IllegalArgumentException(ExceptionLocalization.buildMessage("invalid_pk_class", new Object[] { refPolicy.getPKClass(), fieldValue.getClass() }));
                     }
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 b85637d..e4cb5f9 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<Object> 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/EntityManagerFactoryDelegate.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryDelegate.java
index 0a7a598..36aa485 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryDelegate.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryDelegate.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, 2019 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
@@ -222,7 +222,7 @@
                     AbstractSession tempSession = setupImpl.deploy(realLoader, serverSessionProperties);
                     // discard all but non server session properties from server
                     // session properties.
-                    Map tempProperties = EntityManagerFactoryProvider.keepSpecifiedProperties(tempSession.getProperties(), supportedNonServerSessionProperties);
+                    Map<String, Object> tempProperties = EntityManagerFactoryProvider.keepSpecifiedProperties(tempSession.getProperties(), supportedNonServerSessionProperties);
                     // keep only non server session properties - the rest will
                     // be either cached in the server session or ignored
                     properties = splitProperties[0];
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 49aee1f..21a9f30 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
@@ -315,7 +315,7 @@
      * @return the target object
      */
     public static <K, V> Map<K, V> keepSpecifiedProperties(Map<K, V> source, Collection<K> keysToBeKept){
-        Map target = new HashMap<>();
+        Map<K, V> target = new HashMap<>();
         if (source != null){
             target.putAll(source);
             Iterator<Map.Entry<K, V>> it = source.entrySet().iterator();
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 b572ab7..48acbca 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
@@ -901,7 +901,7 @@
             primaryKey = id;
         } else {
             CMPPolicy policy = descriptor.getCMPPolicy();
-            Class pkClass = policy.getPKClass();
+            Class<Object> pkClass = policy.getPKClass();
             if ((pkClass != null) && (pkClass != id.getClass()) && (!BasicTypeHelperImpl.getInstance().isStrictlyAssignableFrom(pkClass, id.getClass()))) {
                 throw new IllegalArgumentException(ExceptionLocalization.buildMessage("invalid_pk_class", new Object[] { descriptor.getCMPPolicy().getPKClass(), id.getClass() }));
             }
@@ -2010,7 +2010,7 @@
                 throw new IllegalArgumentException(ExceptionLocalization.buildMessage("not_an_entity", new Object[] { null }));
             }
 
-            UnitOfWork uow = getActivePersistenceContext(checkForTransaction(true)); // Throws TransactionRequiredException if no active transaction.
+            UnitOfWorkImpl uow = getActivePersistenceContext(checkForTransaction(true)); // Throws TransactionRequiredException if no active transaction.
 
             if (!contains(entity, uow)) {
                 throw new IllegalArgumentException(ExceptionLocalization.buildMessage("cant_lock_not_managed_object", new Object[] { entity }));
@@ -2025,7 +2025,7 @@
                     || lockMode.name().equals(ObjectLevelReadQuery.PESSIMISTIC_FORCE_INCREMENT)) {
 
                 // return if the entity has previously been pessimistically locked
-                if (((UnitOfWorkImpl)uow).isPessimisticLocked(entity)) {
+                if (uow.isPessimisticLocked(entity)) {
                     return;
                 }
 
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 48c2c0b..c9ab4c3 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
@@ -2093,7 +2093,7 @@
                 // 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<MetadataClass> 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.
@@ -4480,7 +4480,7 @@
         EntityManagerSetupImpl newSetupImpl = new EntityManagerSetupImpl(uniqueName, sessionName);
         newSetupImpl.setIsInContainerMode(isInContainerMode);
         newSetupImpl.enableWeaving = enableWeaving;
-        Map refreshProperties = new HashMap<>();
+        Map<Object, Object> 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 a3fb2e5..85bd951 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
@@ -767,7 +767,7 @@
             } else if (valueToApply.equals(QueryType.ValueRead)) {
                 newQuery = new ValueReadQuery();
             } else {
-                Class queryClass = loadClass((String)valueToApply, query, loader);
+                Class<?> queryClass = loadClass((String)valueToApply, query, loader);
                 newQuery = (DatabaseQuery)newInstance(queryClass, query, QueryHints.QUERY_TYPE);
             }
             newQuery.copyFromQuery(query);
@@ -2115,7 +2115,7 @@
                 if (valueToApply instanceof Class) {
                     redirector = newInstance((Class)valueToApply, query, QueryHints.QUERY_REDIRECTOR);
                 } else if (valueToApply instanceof String) {
-                    Class redirectorClass = loadClass((String)valueToApply, query, loader);
+                    Class<?> redirectorClass = loadClass((String)valueToApply, query, loader);
                     redirector = newInstance(redirectorClass, query, QueryHints.QUERY_REDIRECTOR);
                 }
                 query.setRedirector((QueryRedirector)redirector);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/ArchiveFactoryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/ArchiveFactoryImpl.java
index 08a5811..31071f5 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/ArchiveFactoryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/ArchiveFactoryImpl.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
@@ -97,7 +97,7 @@
                 result = new JarFileArchive(rootUrl, new JarFile(f), descriptorLocation);
             }
         } else if ("jar".equals(protocol)) { // NOI18N
-            JarURLConnection conn = JarURLConnection.class.cast(rootUrl.openConnection());
+            JarURLConnection conn = (JarURLConnection) rootUrl.openConnection();
             conn.setUseCaches(false);
             JarEntry je = conn.getJarEntry();
             if (je == null) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/DirectoryInsideJarURLArchive.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/DirectoryInsideJarURLArchive.java
index 41fb63d..e615b65 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/DirectoryInsideJarURLArchive.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/DirectoryInsideJarURLArchive.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
@@ -66,7 +66,7 @@
         rootURL = url;
         this.descriptorLocation = descriptorLocation;
         JarURLConnection conn =
-                JarURLConnection.class.cast(url.openConnection());
+                (JarURLConnection) url.openConnection();
         jarFile = conn.getJarFile();
         logger.logp(Level.FINER, "DirectoryInsideJarURLArchive",
                 "DirectoryInsideJarURLArchive", "jarFile = {0}", jarFile);
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 2c04bc0..1729c24 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
@@ -206,7 +206,7 @@
      * that we will be deploying.
      */
     protected Set loadEntityClasses(Collection entityNames, ClassLoader classLoader) {
-        Set entityClasses = new HashSet<>();
+        Set<Object> entityClasses = new HashSet<>();
 
         // Load the classes using the loader passed in
         AbstractSessionLog.getLog().log(SessionLog.FINER, SessionLog.JPA, "cmp_loading_entities_using_loader", classLoader);
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 24a982e..2b0407b 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
@@ -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<TempEntityLoader> 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));
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MetamodelImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MetamodelImpl.java
index 99ec4ee..f5f8713 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MetamodelImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MetamodelImpl.java
@@ -108,7 +108,7 @@
     private boolean isInitialized = false;
 
     /** Default elementType Class when we the type cannot be determined for unsupported mappings such as Transformation and VariableOneToOne */
-    public static final Class DEFAULT_ELEMENT_TYPE_FOR_UNSUPPORTED_MAPPINGS = Object.class;
+    public static final Class<Object> DEFAULT_ELEMENT_TYPE_FOR_UNSUPPORTED_MAPPINGS = Object.class;
 
     public MetamodelImpl(AbstractSession session) {
         this.session = session;
@@ -443,7 +443,7 @@
         // Handle all IdentifiableTypes (after all ManagedTypes have been created)
         // Assign all superType fields on all IdentifiableTypes (only after all managedType objects have been created)
         for(ManagedTypeImpl<?> potentialIdentifiableType : managedTypes.values()) {
-            Class aClass = potentialIdentifiableType.getJavaType(classLoader);
+            Class<?> aClass = potentialIdentifiableType.getJavaType(classLoader);
             /**
              * The superclass for top-level types is Object - however we set [null] as the supertype for root types.
              * 1) We are constrained by the fact that the spec requires that a superType be an IdentifiableType.
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/SingularAttributeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/SingularAttributeImpl.java
index 2d5b699..fb69f05 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/SingularAttributeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/SingularAttributeImpl.java
@@ -34,7 +34,6 @@
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.ForeignReferenceMapping;
 import org.eclipse.persistence.mappings.VariableOneToOneMapping;
-import org.eclipse.persistence.mappings.foundation.AbstractDirectMapping;
 import org.eclipse.persistence.mappings.structures.ReferenceMapping;
 
 /**
@@ -225,7 +224,7 @@
                         // This exception will be warned about below
                         if(null == aJavaType) {
                             AbstractSessionLog.getLog().log(SessionLog.FINEST, SessionLog.METAMODEL, "metamodel_attribute_class_type_is_null", this);
-                            return MetamodelImpl.DEFAULT_ELEMENT_TYPE_FOR_UNSUPPORTED_MAPPINGS;
+                            return (Class<T>) MetamodelImpl.DEFAULT_ELEMENT_TYPE_FOR_UNSUPPORTED_MAPPINGS;
                         }
                     }
                 }
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 406336b..add57cb 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
@@ -62,7 +62,7 @@
         if(null == javaClass && null == javaClassName) {
             AbstractSessionLog.getLog().log(SessionLog.FINEST, SessionLog.METAMODEL, "metamodel_typeImpl_javaClass_should_not_be_null", this, null); // exporting (this) outside the constructor breaks concurrency
             // Default to Object to avoid a NPE - in the case where javaClass is not set or not set yet via Project.convertClassNamesToClasses()
-            this.javaClass = MetamodelImpl.DEFAULT_ELEMENT_TYPE_FOR_UNSUPPORTED_MAPPINGS;
+            this.javaClass = (Class<X>) MetamodelImpl.DEFAULT_ELEMENT_TYPE_FOR_UNSUPPORTED_MAPPINGS;
         } else {
             this.javaClassName = javaClassName;
             this.javaClass = javaClass;
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 0b12f94..79f59b4 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
@@ -556,7 +556,7 @@
                 throw new IllegalArgumentException(ExceptionLocalization.buildMessage("PREDICATE_PASSED_TO_EVALUATION"));
             }
         }
-        List list = new ArrayList<>();
+        List<Expression<?>> list = new ArrayList<>();
         list.add(x);
         return new CompoundExpressionImpl(this.metamodel, ((InternalSelection)x).getCurrentNode().equal(true), list, "equals");
     }
@@ -618,7 +618,7 @@
     @Override
     public Predicate equal(Expression<?> x, Expression<?> y){
 
-        List list = new ArrayList<>();
+        List<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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){
-        List list = new ArrayList<>();
+        List<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> list = new ArrayList<>();
         ExpressionImpl literal = (ExpressionImpl) this.internalLiteral(x);
         list.add(literal);
         list.add(y);
@@ -1308,7 +1308,7 @@
      */
     @Override
     public Expression<Integer> mod(Integer x, Expression<Integer> y){
-        Expression xExp = internalLiteral(x);
+        Expression<Integer> xExp = internalLiteral(x);
         return new FunctionExpressionImpl(this.metamodel, ClassConstants.INTEGER, ExpressionMath.mod(((InternalSelection)xExp).getCurrentNode(),((InternalSelection)y).getCurrentNode()), buildList(xExp,y), "mod");
     }
 
@@ -1800,7 +1800,7 @@
      */
     @Override
     public Predicate notLike(Expression<String> x, String pattern){
-        List list = new ArrayList<>();
+        List<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> list = new ArrayList<>();
         ExpressionImpl literal = (ExpressionImpl) this.internalLiteral(x);
         list.add(literal);
         list.add(y);
@@ -2224,7 +2224,7 @@
      */
     @Override
     public <T> In<T> in(Expression<? extends T> expression){
-        List list = new ArrayList<>();
+        List<Expression<?>> list = new ArrayList<>();
         list.add(expression);
         return new InImpl(metamodel, (ExpressionImpl) expression, new ArrayList<>(), list);
     }
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 1a76351..df2fa38 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
@@ -672,7 +672,7 @@
         } else {
             ReportQuery reportQuery = null;
             if (this.queryResult.equals(ResultType.TUPLE)) {
-                List list = new ArrayList<>();
+                List<Object> list = new ArrayList<>();
                 list.add(this.selection);
                 reportQuery = new TupleQuery(list);
             } else {
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 26955f5..a0fbb47 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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/JoinImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/JoinImpl.java
index 9a17e67..354a951 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<Expression<?>> 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<>();
+                List<Expression<?>> 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/SubQueryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/SubQueryImpl.java
index fac2310..bd8c8f1 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
@@ -476,7 +476,7 @@
 
     @Override
     public Predicate in(Object... values) {
-        List list = new ArrayList<>();
+        List<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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<Expression<?>> 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/transaction/TransactionImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/transaction/TransactionImpl.java
index 8eec1c4..47699a5 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/transaction/TransactionImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/transaction/TransactionImpl.java
@@ -43,7 +43,7 @@
 
     // The transactional connection we use
     Connection connection;
-    static Class proxyClass = Proxy.getProxyClass(Connection.class.getClassLoader(), new Class[] { Connection.class });
+    static Class<?> proxyClass = Proxy.getProxyClass(Connection.class.getClassLoader(), new Class[] { Connection.class });
 
     // The enlisted data source
     DataSourceImpl dataSource;
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 6b3f246..9943cf5 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
@@ -193,7 +193,7 @@
 
                 classDetails.getVirtualAccessMethods().addAll(descriptor.getVirtualAttributeMethods());
 
-                List unMappedAttributes = storeAttributeMappings(metaClass, classDetails, descriptor.getMappings(), weaveValueHoldersForClass);
+                List<DatabaseMapping> unMappedAttributes = storeAttributeMappings(metaClass, classDetails, descriptor.getMappings(), weaveValueHoldersForClass);
                 classDetailsMap.put(classDetails.getClassName() ,classDetails);
 
                 classDetails.setShouldWeaveConstructorOptimization((classDetails.getDescribedClass().getFields().size() - (descriptor.getMappings().size() - unMappedAttributes.size()))<=0);
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 a2cd1a4..82227aa 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
@@ -112,7 +112,7 @@
             if (persistenceUnitsList==null) {
                 throw PersistenceUnitLoadingException.couldNotGetUnitInfoFromUrl(inputArchiveURL);
             }
-            Map emptyMap = new HashMap<>(0);
+            Map<Object, Object> emptyMap = new HashMap<>(0);
             Iterator<SEPersistenceUnitInfo> persistenceUnitsIterator = persistenceUnitsList.iterator();
             while (persistenceUnitsIterator.hasNext()) {
                 SEPersistenceUnitInfo unitInfo = persistenceUnitsIterator.next();
diff --git a/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/internal/AuctionPersistenceContextTests.java b/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/internal/AuctionPersistenceContextTests.java
index 91f1c02..5fe75eb 100644
--- a/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/internal/AuctionPersistenceContextTests.java
+++ b/jpa/org.eclipse.persistence.jpars/src/it/java/org/eclipse/persistence/jpars/test/internal/AuctionPersistenceContextTests.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,8 +20,8 @@
 import java.util.Map;
 
 import jakarta.persistence.EntityManagerFactory;
-import jakarta.xml.bind.JAXBContext;
 
+import org.eclipse.persistence.jaxb.JAXBContext;
 import org.eclipse.persistence.jpa.JpaHelper;
 import org.eclipse.persistence.jpa.rs.PersistenceContext;
 import org.eclipse.persistence.jpa.rs.PersistenceFactoryBase;
@@ -59,7 +59,7 @@
         JAXBContext jaxbContext = context.getJAXBContext();
         assertNotNull(jaxbContext);
 
-        org.eclipse.persistence.jaxb.JAXBContext contextImpl = (org.eclipse.persistence.jaxb.JAXBContext) jaxbContext;
+        org.eclipse.persistence.jaxb.JAXBContext contextImpl = jaxbContext;
 
         assertEquals(4, contextImpl.getXMLContext().getSession(0).getDescriptors().size());
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/AccessorFactoryWrapper.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/AccessorFactoryWrapper.java
index a8f3338..917918a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/AccessorFactoryWrapper.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/AccessorFactoryWrapper.java
@@ -41,7 +41,7 @@
 
     public AccessorFactoryWrapper(Object factory) {
         this.accessorFactory = factory;
-        Class accessorClass = factory.getClass();
+        Class<? extends Object> accessorClass = factory.getClass();
         try {
             createPropertyAccessorMethod = PrivilegedAccessHelper.getDeclaredMethod(accessorClass, ACCESSOR_FACTORY_CREATE_PROPERTY_ACCESSOR, new Class[]{Class.class, Method.class, Method.class});
             createFieldAccessorMethod = PrivilegedAccessHelper.getDeclaredMethod(accessorClass, ACCESSOR_FACTORY_CREATE_FIELD_ACCESSOR, new Class[]{Class.class, Field.class, boolean.class});
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/DomHandlerConverter.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/DomHandlerConverter.java
index a984216..2e8ab6b 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/DomHandlerConverter.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/DomHandlerConverter.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,8 +70,8 @@
             ConversionManager cMgr = session.getDatasourcePlatform().getConversionManager();
             Class<? extends DomHandler> domHandlerClass = PrivilegedAccessHelper.getClassForName(domHandlerClassName, true, cMgr.getLoader());
 
-            Constructor cons = PrivilegedAccessHelper.getDeclaredConstructorFor(domHandlerClass, new Class[]{}, true);
-            this.domHandler = (DomHandler)PrivilegedAccessHelper.invokeConstructor(cons, new Object[]{});
+            Constructor<? extends DomHandler> cons = PrivilegedAccessHelper.getDeclaredConstructorFor(domHandlerClass, new Class[]{}, true);
+            this.domHandler = PrivilegedAccessHelper.invokeConstructor(cons, new Object[]{});
 
             Method createUnmarshallerMethod = PrivilegedAccessHelper.getDeclaredMethod(domHandlerClass, "createUnmarshaller", new Class[]{ValidationEventHandler.class});
             resultType = PrivilegedAccessHelper.getMethodReturnType(createUnmarshallerMethod);
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 6a40d82..ae91903 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
@@ -49,7 +49,7 @@
 
     public IDResolverWrapper(Object sunResolver) {
         this.resolver = sunResolver;
-        Class resolverClass = sunResolver.getClass();
+        Class<? extends Object> resolverClass = sunResolver.getClass();
 
         try {
             this.bindMethod = PrivilegedAccessHelper.getMethod(resolverClass, BIND_METHOD_NAME, BIND_PARAMS, false);
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JAXBSetMethodAttributeAccessor.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JAXBSetMethodAttributeAccessor.java
index 2a3a733..8647016 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JAXBSetMethodAttributeAccessor.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JAXBSetMethodAttributeAccessor.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
@@ -38,7 +38,7 @@
 public class JAXBSetMethodAttributeAccessor extends MethodAttributeAccessor {
     String parameterTypeAsString;
     ClassLoader loader;
-    Class attributeClassification = CoreClassConstants.OBJECT;
+    Class<Object> attributeClassification = CoreClassConstants.OBJECT;
 
     /**
      * This constructor sets the set method input parameter type (as string) as
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JaxbClassLoader.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JaxbClassLoader.java
index 4fa2933..c92de7e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JaxbClassLoader.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JaxbClassLoader.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
@@ -124,7 +124,7 @@
     }
 
     public Class generateClass(String className, byte[] bytes) {
-        Class theClass = this.defineClass(className, bytes, 0, bytes.length);
+        Class<?> theClass = this.defineClass(className, bytes, 0, bytes.length);
         generatedClasses.put(className, theClass);
         return theClass;
     }
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 675d9ef..2eb1aa2 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
@@ -49,8 +49,8 @@
  * @see jakarta.xml.bind.annotation.adapters.XmlAdapter
  */
 public class XMLJavaTypeConverter extends org.eclipse.persistence.oxm.mappings.converters.XMLConverterAdapter {
-    protected Class boundType = Object.class;
-    protected Class valueType = Object.class;
+    protected Class<Object> boundType = Object.class;
+    protected Class<Object> valueType = Object.class;
     protected Class<?> xmlAdapterClass;
     protected String xmlAdapterClassName;
     protected XmlAdapter xmlAdapter;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/json/schema/JsonSchemaGenerator.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/json/schema/JsonSchemaGenerator.java
index 316e56b..dca1c3f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/json/schema/JsonSchemaGenerator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/json/schema/JsonSchemaGenerator.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
@@ -144,7 +144,7 @@
         if(rootClass.isArray() || isCollection(rootClass)) {
             schema.setType(JsonType.ARRAY);
             schema.setItems(new Property());
-            Class itemType = Object.class;
+            Class<Object> itemType = Object.class;
 
             if(rootClass.isArray()) {
                 itemType = rootClass.getComponentType();
@@ -454,7 +454,7 @@
                     String propertyName = getNameForFragment(frag);
 
                     XMLField targetField = (XMLField) mapping.getSourceToTargetKeyFieldAssociations().get(nextField);
-                    Class type = CoreClassConstants.STRING;
+                    Class<String> type = CoreClassConstants.STRING;
                     if(reference != null) {
                         type = getTypeForTargetField(targetField, reference);
                     }
@@ -627,7 +627,7 @@
                     XPathFragment frag = nextField.getXPathFragment();
                     String propName = getNameForFragment(frag);
                     XMLField targetField = (XMLField) mapping.getSourceToTargetKeyFieldAssociations().get(nextField);
-                    Class type = CoreClassConstants.STRING;
+                    Class<String> type = CoreClassConstants.STRING;
                     if(reference != null) {
                         type = getTypeForTargetField(targetField, reference);
                     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/many/MultiDimensionalArrayValue.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/many/MultiDimensionalArrayValue.java
index 2da76b1..8436aa2 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/many/MultiDimensionalArrayValue.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/many/MultiDimensionalArrayValue.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
@@ -46,9 +46,9 @@
             int arraySize = Array.getLength(array);
             adaptedValue = new ArrayList<T>(arraySize);
             for(int x=0; x<arraySize; x++) {
-                ManyValue<?, Object> manyValue = PrivilegedAccessHelper.newInstanceFromClass(componentClass());
+                T manyValue = PrivilegedAccessHelper.newInstanceFromClass(componentClass());
                 manyValue.setItem(Array.get(array, x));
-                adaptedValue.add((T) manyValue);
+                adaptedValue.add(manyValue);
             }
         } catch(Exception e) {
             throw new RuntimeException(e);
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/many/MultiDimensionalCollectionValue.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/many/MultiDimensionalCollectionValue.java
index e2f5bfd..4f8a1e9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/many/MultiDimensionalCollectionValue.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/many/MultiDimensionalCollectionValue.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
@@ -54,9 +54,9 @@
             Collection<T> collection = (Collection<T>) item;
             adaptedValue = new ArrayList<T>(collection.size());
             for(Object stringArray : collection) {
-                ManyValue<?, Object> stringArrayValue = PrivilegedAccessHelper.newInstanceFromClass(componentClass());
+                T stringArrayValue = PrivilegedAccessHelper.newInstanceFromClass(componentClass());
                 stringArrayValue.setItem(stringArray);
-                adaptedValue.add((T) stringArrayValue);
+                adaptedValue.add(stringArrayValue);
             }
         } catch(Exception e) {
             throw new RuntimeException(e);
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 4a97ca5..7c99942 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
@@ -63,6 +63,7 @@
 import org.eclipse.persistence.exceptions.JAXBException;
 import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 import org.eclipse.persistence.internal.helper.ConversionManager;
+import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.jaxb.JAXBSchemaOutputResolver;
 import org.eclipse.persistence.internal.jaxb.JaxbClassLoader;
 import org.eclipse.persistence.internal.jaxb.ObjectGraphImpl;
@@ -723,7 +724,7 @@
     public ObjectGraph createObjectGraph(String typeName) {
         ClassLoader loader = this.contextInput.classLoader;
         try {
-            Class cls = PrivilegedAccessHelper.getClassForName(typeName, true, loader);
+            Class<Object> cls = PrivilegedAccessHelper.getClassForName(typeName, true, loader);
             return createObjectGraph(cls);
         } catch (Exception ex) {
             throw ConversionException.couldNotBeConvertedToClass(typeName, Class.class, ex);
@@ -878,7 +879,7 @@
             while (tokenizer.hasMoreElements()) {
                 String path = tokenizer.nextToken();
                 try {
-                    Class objectFactory = classLoader.loadClass(path + ".ObjectFactory");
+                    Class<?> objectFactory = classLoader.loadClass(path + ".ObjectFactory");
                     if (isJAXB2ObjectFactory(objectFactory, classLoader)) {
                         classes.add(objectFactory);
                         foundMetadata = true;
@@ -1022,7 +1023,7 @@
                 }
             }
 
-            XMLPlatform platform = new SAXPlatform();
+            XMLPlatform<org.eclipse.persistence.internal.oxm.XMLUnmarshaller> platform = new SAXPlatform();
             platform.getConversionManager().setLoader(loader);
             XMLContext xmlContext = new XMLContext((Project) proj, loader, sessionEventListeners());
 
@@ -1054,7 +1055,7 @@
             if (jTypes != null) {
                 for (JavaType javaType : jTypes.getJavaType()) {
                     try {
-                        Class jClass = classLoader.loadClass(getQualifiedJavaTypeName(javaType.getName(), xmlBindings.getPackageName()));
+                        Class<?> jClass = classLoader.loadClass(getQualifiedJavaTypeName(javaType.getName(), xmlBindings.getPackageName()));
                         if (!additionalClasses.contains(jClass)) {
                             additionalClasses.add(jClass);
                         }
@@ -1068,7 +1069,7 @@
 
         private boolean isJAXB2ObjectFactory(Class objectFactoryClass, ClassLoader classLoader) {
             try {
-                Class xmlRegistry = PrivilegedAccessHelper.getClassForName("jakarta.xml.bind.annotation.XmlRegistry", false, classLoader);
+                Class<Object> xmlRegistry = PrivilegedAccessHelper.getClassForName("jakarta.xml.bind.annotation.XmlRegistry", false, classLoader);
                 if (objectFactoryClass.isAnnotationPresent(xmlRegistry)) {
                     return true;
                 }
@@ -1205,7 +1206,7 @@
                 }
             }
 
-            XMLPlatform platform = new SAXPlatform();
+            XMLPlatform<org.eclipse.persistence.internal.oxm.XMLUnmarshaller> platform = new SAXPlatform();
             platform.getConversionManager().setLoader(loader);
             XMLContext xmlContext = new XMLContext((Project) proj, loader, sessionEventListeners());
 
@@ -1254,7 +1255,7 @@
 
                 for (JavaType javaType : jTypes.getJavaType()) {
                     try {
-                        Class nextClass = classLoader.loadClass(getQualifiedJavaTypeName(javaType.getName(), xmlBindings.getPackageName()));
+                        Class<?> nextClass = classLoader.loadClass(getQualifiedJavaTypeName(javaType.getName(), xmlBindings.getPackageName()));
                         if (!(existingClasses.contains(nextClass))) {
                             TypeMappingInfo typeMappingInfo = new TypeMappingInfo();
                             typeMappingInfo.setType(nextClass);
@@ -1348,11 +1349,11 @@
         }
 
         private Class getBoundTypeForXmlAdapterClass(Class adapterClass) {
-            Class boundType = Object.class;
+            Class<Object> boundType = Object.class;
 
             for (Method method : PrivilegedAccessHelper.getDeclaredMethods(adapterClass)) {
                 if (method.getName().equals("marshal")) {
-                    Class returnType = PrivilegedAccessHelper.getMethodReturnType(method);
+                    Class<Object> returnType = PrivilegedAccessHelper.getMethodReturnType(method);
                     if (!returnType.getName().equals(boundType.getName())) {
                         boundType = returnType;
                         break;
@@ -1364,7 +1365,7 @@
 
         private void updateNamespaces() {
 
-            Collection descriptors = xmlContext.getSession().getDescriptors().values();
+            Collection<ClassDescriptor> descriptors = xmlContext.getSession().getDescriptors().values();
 
             for (Object descriptor : descriptors) {
                 Descriptor desc = (Descriptor) descriptor;
@@ -1393,7 +1394,7 @@
 
             for (Object mapping : mappings) {
                 DatabaseMapping nextMapping = (DatabaseMapping) mapping;
-                Vector fields = nextMapping.getFields();
+                Vector<DatabaseField> fields = nextMapping.getFields();
                 updateResolverForFields(fields, nr);
                 Descriptor refDesc = (Descriptor) nextMapping.getReferenceDescriptor();
                 if (refDesc != null && !processed.contains(refDesc)) {
@@ -1412,7 +1413,7 @@
 
         private void updateResolverForFields(Collection fields, org.eclipse.persistence.internal.oxm.NamespaceResolver nr) {
             for (Object field1 : fields) {
-                Field field = (XMLField) field1;
+                Field<XMLConversionManager, NamespaceResolver> field = (XMLField) field1;
                 XPathFragment currentFragment = field.getXPathFragment();
 
                 while (currentFragment != null) {
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 fef80cf..26cba23 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
@@ -74,6 +74,7 @@
 import jakarta.xml.bind.annotation.XmlType;
 import jakarta.xml.bind.annotation.XmlType.DEFAULT;
 import jakarta.xml.bind.annotation.XmlValue;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapters;
 import javax.xml.namespace.QName;
@@ -508,7 +509,7 @@
         typeMappingInfosToGeneratedClasses = new HashMap<TypeMappingInfo, Class>();
         typeMappingInfosToSchemaTypes = new HashMap<TypeMappingInfo, QName>();
         elementDeclarations = new HashMap<String, Map<QName, ElementDeclaration>>();
-        Map globalElements = new HashMap<QName, ElementDeclaration>();
+        Map<QName, ElementDeclaration> globalElements = new HashMap<>();
         elementDeclarations.put(XmlElementDecl.GLOBAL.class.getName(), globalElements);
         localElements = new ArrayList<ElementDeclaration>();
 
@@ -815,17 +816,17 @@
                     info.setXmlNameTransformer(nsInfoXmlNameTransformer);
                 } else if (helper.isAnnotationPresent(javaClass, XmlNameTransformer.class)) {
                     XmlNameTransformer xmlNameTransformer = (XmlNameTransformer) helper.getAnnotation(javaClass, XmlNameTransformer.class);
-                    Class nameTransformerClass = xmlNameTransformer.value();
+                    Class<? extends XMLNameTransformer> nameTransformerClass = xmlNameTransformer.value();
                     try {
-                        info.setXmlNameTransformer((XMLNameTransformer) nameTransformerClass.getConstructor().newInstance());
+                        info.setXmlNameTransformer(nameTransformerClass.getConstructor().newInstance());
                     } catch (ReflectiveOperationException ex) {
                         throw JAXBException.exceptionWithNameTransformerClass(nameTransformerClass.getName(), ex);
                     }
                 } else if (helper.isAnnotationPresent(javaClass.getPackage(), XmlNameTransformer.class)) {
                     XmlNameTransformer xmlNameTransformer = (XmlNameTransformer) helper.getAnnotation(javaClass.getPackage(), XmlNameTransformer.class);
-                    Class nameTransformerClass = xmlNameTransformer.value();
+                    Class<? extends XMLNameTransformer> nameTransformerClass = xmlNameTransformer.value();
                     try {
-                        info.setXmlNameTransformer((XMLNameTransformer) nameTransformerClass.getConstructor().newInstance());
+                        info.setXmlNameTransformer(nameTransformerClass.getConstructor().newInstance());
                     } catch (ReflectiveOperationException ex) {
                         throw JAXBException.exceptionWithNameTransformerClass(nameTransformerClass.getName(), ex);
                     }
@@ -2064,7 +2065,7 @@
         if (helper.isAnnotationPresent(javaHasAnnotations, XmlPath.class)) {
             XmlPath xmlPath = (XmlPath) helper.getAnnotation(javaHasAnnotations, XmlPath.class);
             property.setXmlPath(xmlPath.value());
-            Field tempField = new XMLField(xmlPath.value());
+            Field<XMLConversionManager, NamespaceResolver> tempField = new XMLField(xmlPath.value());
             boolean isAttribute = tempField.getLastXPathFragment().isAttribute();
             property.setIsAttribute(isAttribute);
             // set schema name
@@ -3215,8 +3216,8 @@
     public HashMap<String, Property> getPropertyMapFromArrayList(ArrayList<Property> props) {
         HashMap propMap = new HashMap(props.size());
 
-        for (Object next : props) {
-            propMap.put(((Property)next).getPropertyName(), next);
+        for (Property next : props) {
+            propMap.put(next.getPropertyName(), next);
         }
         return propMap;
     }
@@ -3286,7 +3287,7 @@
         }
 
         info.setClassName(javaClass.getQualifiedName());
-        Class restrictionClass = String.class;
+        Class<?> restrictionClass = String.class;
         QName restrictionBase = getSchemaTypeFor(helper.getJavaClass(restrictionClass));
 
         if (helper.isAnnotationPresent(javaClass, XmlEnum.class)) {
@@ -3808,7 +3809,7 @@
             String url;
             String localName;
             String defaultValue = null;
-            Class scopeClass = jakarta.xml.bind.annotation.XmlElementDecl.GLOBAL.class;
+            Class<XmlElementDecl.GLOBAL> scopeClass = jakarta.xml.bind.annotation.XmlElementDecl.GLOBAL.class;
 
             if (xmlEltDecl != null) {
                 url = xmlEltDecl.getNamespace();
@@ -3884,7 +3885,7 @@
 
             if (helper.isAnnotationPresent(next, XmlJavaTypeAdapter.class)) {
                 XmlJavaTypeAdapter typeAdapter = (XmlJavaTypeAdapter) helper.getAnnotation(next, XmlJavaTypeAdapter.class);
-                Class typeAdapterClass = typeAdapter.value();
+                Class<? extends XmlAdapter> typeAdapterClass = typeAdapter.value();
                 declaration.setJavaTypeAdapterClass(typeAdapterClass);
 
                 Class declJavaType = CompilerHelper.getTypeFromAdapterClass(typeAdapterClass);
@@ -4011,12 +4012,12 @@
         if(elem == null){
             return false;
         }
-        List annotations = (List<JavaAnnotation>) elem.getAnnotations();
+        List<JavaAnnotation> annotations = (List<JavaAnnotation>) elem.getAnnotations();
         if (annotations == null || annotations.isEmpty()) {
             return false;
         }
-        for (Object annotation : annotations) {
-            String nextName = ((JavaAnnotation) annotation).getName();
+        for (JavaAnnotation annotation : annotations) {
+            String nextName = annotation.getName();
             if (nextName.startsWith(JAVAX_XML_BIND_ANNOTATION)
                     || nextName.startsWith(OXM_ANNOTATIONS)
                     || nextName.equals(CompilerHelper.XML_LOCATION_ANNOTATION_NAME)
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/CompilerHelper.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/CompilerHelper.java
index ebece96..e7fcb90 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/CompilerHelper.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/CompilerHelper.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
@@ -31,6 +31,7 @@
 import jakarta.xml.bind.Unmarshaller;
 import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlList;
+import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 import jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
 
 import org.eclipse.persistence.internal.jaxb.AccessorFactoryWrapper;
@@ -334,13 +335,13 @@
      */
     static Class getTypeFromAdapterClass(Class adapterClass) {
         if (adapterClass != null) {
-            Class declJavaType = Object.class;
+            Class<Object> declJavaType = Object.class;
             // look for marshal method
             Method[] tacMethods = PrivilegedAccessHelper.getMethods(adapterClass);
             for (int i = 0; i < tacMethods.length; i++) {
                 Method method = tacMethods[i];
                 if (method.getName().equals("marshal")) {
-                    Class returnType = PrivilegedAccessHelper.getMethodReturnType(method);
+                    Class<Object> returnType = PrivilegedAccessHelper.getMethodReturnType(method);
                     if (!(returnType == declJavaType)) {
                         declJavaType = returnType;
                         return declJavaType;
@@ -413,7 +414,7 @@
                             if (nextAnnotation instanceof XmlJavaTypeAdapter) {
                                 Class typeClass = ((XmlJavaTypeAdapter) nextAnnotation).type();
                                 if (typeClass.getName().equals("jakarta.xml.bind.annotation.adapters.XmlJavaTypeAdapter$DEFAULT")) {
-                                    Class adapterClass = ((XmlJavaTypeAdapter) nextAnnotation).value();
+                                    Class<? extends XmlAdapter> adapterClass = ((XmlJavaTypeAdapter) nextAnnotation).value();
                                     return getTypeFromAdapterClass(adapterClass);
                                 }
                                 return typeClass;
@@ -462,7 +463,7 @@
                         return PrivilegedAccessHelper.getClassForName(actualType);
                     } else {
                         String adapterClassName = element.getXmlJavaTypeAdapter().getValue();
-                        Class adapterClass = PrivilegedAccessHelper.getClassForName(adapterClassName);
+                        Class<Object> adapterClass = PrivilegedAccessHelper.getClassForName(adapterClassName);
                         return getTypeFromAdapterClass(adapterClass);
                     }
                 }
@@ -472,7 +473,7 @@
 
                     final Type tmiType = tmi.getType();
                     if (isCollectionType(tmiType)) {
-                        final Class itemType = PrivilegedAccessHelper.getClassForName(actualType);
+                        final Class<Object> itemType = PrivilegedAccessHelper.getClassForName(actualType);
                         Type parameterizedType = new ParameterizedType() {
                             Type[] typeArgs = { itemType };
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/Generator.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/Generator.java
index 5f3209b..1ecdd16 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/Generator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/Generator.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
@@ -28,6 +28,7 @@
 import javax.xml.namespace.QName;
 
 import org.eclipse.persistence.core.sessions.CoreProject;
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.internal.oxm.Constants;
 import org.eclipse.persistence.internal.oxm.mappings.Descriptor;
 import org.eclipse.persistence.internal.oxm.schema.SchemaModelProject;
@@ -44,6 +45,8 @@
 import org.eclipse.persistence.oxm.NamespaceResolver;
 import org.eclipse.persistence.oxm.XMLContext;
 import org.eclipse.persistence.oxm.XMLMarshaller;
+import org.eclipse.persistence.sessions.DatabaseSession;
+import org.eclipse.persistence.sessions.Login;
 import org.eclipse.persistence.sessions.Project;
 
 /**
@@ -205,8 +208,8 @@
         processAdditionalElements(additionalGlobalElements, annotationsProcessor);
 
         schemaGenerator.generateSchema(annotationsProcessor.getTypeInfoClasses(), annotationsProcessor.getTypeInfos(), annotationsProcessor.getUserDefinedSchemaTypes(), annotationsProcessor.getPackageToPackageInfoMappings(), annotationsProcessor.getGlobalElements(), annotationsProcessor.getArrayClassesToGeneratedClasses());
-        CoreProject proj = new SchemaModelProject();
-        XMLContext context = new XMLContext((Project)proj);
+        Project proj = new SchemaModelProject();
+        XMLContext context = new XMLContext(proj);
         XMLMarshaller marshaller = context.createMarshaller();
         Descriptor schemaDescriptor = (Descriptor)proj.getDescriptor(Schema.class);
 
@@ -226,8 +229,8 @@
         processAdditionalElements(additionalGlobalElements, annotationsProcessor);
 
         schemaGenerator.generateSchema(annotationsProcessor.getTypeInfoClasses(), annotationsProcessor.getTypeInfos(), annotationsProcessor.getUserDefinedSchemaTypes(), annotationsProcessor.getPackageToPackageInfoMappings(), annotationsProcessor.getGlobalElements(), annotationsProcessor.getArrayClassesToGeneratedClasses(), outputResolver);
-        CoreProject proj = new SchemaModelProject();
-        XMLContext context = new XMLContext((Project)proj);
+        Project proj = new SchemaModelProject();
+        XMLContext context = new XMLContext(proj);
         XMLMarshaller marshaller = context.createMarshaller();
 
         Descriptor schemaDescriptor = (Descriptor)proj.getDescriptor(Schema.class);
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 30100f5..7b32eb8 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
@@ -51,6 +51,8 @@
 import org.eclipse.persistence.core.mappings.converters.CoreConverter;
 import org.eclipse.persistence.core.queries.CoreAttributeGroup;
 import org.eclipse.persistence.core.sessions.CoreProject;
+import org.eclipse.persistence.descriptors.ClassDescriptor;
+import org.eclipse.persistence.descriptors.InheritancePolicy;
 import org.eclipse.persistence.dynamic.DynamicClassLoader;
 import org.eclipse.persistence.exceptions.DescriptorException;
 import org.eclipse.persistence.exceptions.JAXBException;
@@ -58,7 +60,10 @@
 import org.eclipse.persistence.internal.descriptors.InstanceVariableAttributeAccessor;
 import org.eclipse.persistence.internal.descriptors.InstantiationPolicy;
 import org.eclipse.persistence.internal.descriptors.MethodAttributeAccessor;
+import org.eclipse.persistence.internal.descriptors.ObjectBuilder;
 import org.eclipse.persistence.internal.descriptors.VirtualAttributeAccessor;
+import org.eclipse.persistence.internal.helper.DatabaseField;
+import org.eclipse.persistence.internal.helper.DatabaseTable;
 import org.eclipse.persistence.internal.jaxb.AccessorFactoryWrapper;
 import org.eclipse.persistence.internal.jaxb.CustomAccessorAttributeAccessor;
 import org.eclipse.persistence.internal.jaxb.DefaultElementConverter;
@@ -103,9 +108,12 @@
 import org.eclipse.persistence.internal.oxm.mappings.VariableXPathCollectionMapping;
 import org.eclipse.persistence.internal.oxm.mappings.VariableXPathObjectMapping;
 import org.eclipse.persistence.internal.oxm.mappings.XMLContainerMapping;
+import org.eclipse.persistence.internal.oxm.record.UnmarshalRecord;
+import org.eclipse.persistence.internal.oxm.record.XMLTransformationRecord;
 import org.eclipse.persistence.internal.queries.ContainerPolicy;
 import org.eclipse.persistence.internal.security.PrivilegedAccessHelper;
 import org.eclipse.persistence.internal.security.PrivilegedClassForName;
+import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.jaxb.JAXBEnumTypeConverter;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.javamodel.Helper;
@@ -126,12 +134,16 @@
 import org.eclipse.persistence.jaxb.xmlmodel.XmlTransformation.XmlWriteTransformer;
 import org.eclipse.persistence.logging.AbstractSessionLog;
 import org.eclipse.persistence.logging.SessionLog;
+import org.eclipse.persistence.mappings.AttributeAccessor;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.converters.Converter;
 import org.eclipse.persistence.oxm.XMLConstants;
 import org.eclipse.persistence.oxm.XMLDescriptor;
 import org.eclipse.persistence.oxm.XMLField;
+import org.eclipse.persistence.oxm.XMLMarshaller;
+import org.eclipse.persistence.oxm.XMLUnmarshaller;
 import org.eclipse.persistence.oxm.mappings.FixedMimeTypePolicy;
+import org.eclipse.persistence.oxm.mappings.MimeTypePolicy;
 import org.eclipse.persistence.oxm.mappings.UnmarshalKeepAsElementPolicy;
 import org.eclipse.persistence.oxm.mappings.XMLAnyAttributeMapping;
 import org.eclipse.persistence.oxm.mappings.XMLAnyCollectionMapping;
@@ -151,15 +163,18 @@
 import org.eclipse.persistence.oxm.mappings.XMLTransformationMapping;
 import org.eclipse.persistence.oxm.mappings.XMLVariableXPathCollectionMapping;
 import org.eclipse.persistence.oxm.mappings.XMLVariableXPathObjectMapping;
+import org.eclipse.persistence.oxm.mappings.converters.XMLConverter;
 import org.eclipse.persistence.oxm.mappings.converters.XMLListConverter;
 import org.eclipse.persistence.oxm.mappings.nullpolicy.AbstractNullPolicy;
 import org.eclipse.persistence.oxm.mappings.nullpolicy.IsSetNullPolicy;
 import org.eclipse.persistence.oxm.mappings.nullpolicy.NullPolicy;
 import org.eclipse.persistence.oxm.mappings.nullpolicy.XMLNullRepresentationType;
+import org.eclipse.persistence.oxm.record.XMLRecord;
 import org.eclipse.persistence.oxm.schema.XMLSchemaClassPathReference;
 import org.eclipse.persistence.oxm.schema.XMLSchemaReference;
 import org.eclipse.persistence.queries.AttributeGroup;
 import org.eclipse.persistence.sessions.Project;
+import org.eclipse.persistence.sessions.Session;
 
 /**
  * INTERNAL:
@@ -265,7 +280,7 @@
             if (tInfo.getXmlCustomizer() != null) {
                 String customizerClassName = tInfo.getXmlCustomizer();
                 try {
-                    Class customizerClass = PrivilegedAccessHelper.getClassForName(customizerClassName, true, helper.getClassLoader());
+                    Class<Object> customizerClass = PrivilegedAccessHelper.getClassForName(customizerClassName, true, helper.getClassLoader());
                     DescriptorCustomizer descriptorCustomizer = (DescriptorCustomizer) PrivilegedAccessHelper.newInstanceFromClass(customizerClass);
                     descriptorCustomizer.customize((XMLDescriptor)tInfo.getDescriptor());
                 } catch (IllegalAccessException iae) {
@@ -892,7 +907,7 @@
             if(componentType.isArray()) {
                 JavaClass baseComponentType = getBaseComponentType(componentType);
                 if (baseComponentType.isPrimitive()){
-                    Class primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
+                    Class<Object> primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
                     accessor.setComponentClass(primitiveClass);
                 } else {
                     accessor.setComponentClassName(baseComponentType.getQualifiedName());
@@ -1014,7 +1029,7 @@
     }
 
     private InverseReferenceMapping generateInverseReferenceMapping(Property property, Descriptor descriptor, NamespaceInfo namespace) {
-        InverseReferenceMapping invMapping = new XMLInverseReferenceMapping();
+        InverseReferenceMapping<AbstractSession, AttributeAccessor, ContainerPolicy, ClassDescriptor, DatabaseField, DatabaseMapping, org.eclipse.persistence.internal.oxm.record.XMLRecord> invMapping = new XMLInverseReferenceMapping();
         boolean isCollection = helper.isCollectionType(property.getType());
 
         if (isCollection) {
@@ -1063,7 +1078,7 @@
      * @return
      */
     public TransformationMapping generateTransformationMapping(Property property, Descriptor descriptor, NamespaceInfo namespace) {
-        TransformationMapping mapping = new XMLTransformationMapping();
+        TransformationMapping<AbstractSession, AttributeAccessor, ContainerPolicy, ClassDescriptor, DatabaseField, XMLTransformationRecord, XMLRecord> mapping = new XMLTransformationMapping();
         if (property.isMethodProperty()) {
             if (property.getGetMethodName() == null) {
                 // handle case of set with no get method
@@ -1107,8 +1122,8 @@
     }
 
     public ChoiceObjectMapping generateChoiceMapping(Property property, Descriptor descriptor, NamespaceInfo namespace) {
-        ChoiceObjectMapping mapping = new XMLChoiceObjectMapping();
-        initializeXMLMapping((XMLChoiceObjectMapping)mapping, property);
+        XMLChoiceObjectMapping mapping = new XMLChoiceObjectMapping();
+        initializeXMLMapping(mapping, property);
 
         boolean isIdRef = property.isXmlIdRef();
         Iterator<Property> choiceProperties = property.getChoiceProperties().iterator();
@@ -1130,8 +1145,8 @@
             }
             if (next.getXmlJoinNodes() != null) {
                 // handle XmlJoinNodes
-                List<Field> srcFlds = new ArrayList<>();
-                List<Field> tgtFlds = new ArrayList<>();
+                List<XMLField> srcFlds = new ArrayList<>();
+                List<XMLField> tgtFlds = new ArrayList<>();
                 for (XmlJoinNode xmlJoinNode: next.getXmlJoinNodes().getXmlJoinNode()) {
                     srcFlds.add(new XMLField(xmlJoinNode.getXmlPath()));
                     tgtFlds.add(new XMLField(xmlJoinNode.getReferencedXmlPath()));
@@ -1154,11 +1169,11 @@
                 }
                 mapping.addChoiceElement(srcXPath.getXPath(), type.getQualifiedName(), tgtXPath);
             } else {
-                Field xpath;
+                XMLField xpath;
                 if (next.getXmlPath() != null) {
                     xpath = new XMLField(next.getXmlPath());
                 } else {
-                    xpath = getXPathForField(next, namespace, (!(this.typeInfo.containsKey(type.getQualifiedName()))) || next.isMtomAttachment() || type.isEnum(), false);
+                    xpath = (XMLField) getXPathForField(next, namespace, (!(this.typeInfo.containsKey(type.getQualifiedName()))) || next.isMtomAttachment() || type.isEnum(), false);
                 }
                 mapping.addChoiceElement(xpath, type.getQualifiedName());
                 if(!originalType.getQualifiedName().equals(type.getQualifiedName())) {
@@ -1167,7 +1182,7 @@
                     }
                     mapping.addConverter(xpath, converter);
                 }
-                Mapping nestedMapping = (Mapping) mapping.getChoiceElementMappings().get(xpath);
+                XMLMapping nestedMapping = mapping.getChoiceElementMappings().get(xpath);
                 if(nestedMapping instanceof BinaryDataMapping){
                     ((BinaryDataMapping)nestedMapping).getNullPolicy().setNullRepresentedByEmptyNode(false);
                 }
@@ -1193,7 +1208,7 @@
             if(componentType.isArray()) {
                 JavaClass baseComponentType = getBaseComponentType(componentType);
                 if (baseComponentType.isPrimitive()){
-                    Class primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
+                    Class<?> primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
                     accessor.setComponentClass(primitiveClass);
                 } else {
                     accessor.setComponentClassName(baseComponentType.getQualifiedName());
@@ -1567,7 +1582,7 @@
             if(componentType.isArray()) {
                 JavaClass baseComponentType = getBaseComponentType(componentType);
                 if (baseComponentType.isPrimitive()){
-                    Class primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
+                    Class<Object> primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
                     accessor.setComponentClass(primitiveClass);
                 } else {
                     accessor.setComponentClassName(baseComponentType.getQualifiedName());
@@ -1795,7 +1810,7 @@
         JavaClass itemType = property.getActualType();
         if(collectionType != null && helper.isCollectionType(collectionType)){
             try{
-                Class declaredClass = PrivilegedAccessHelper.getClassForName(itemType.getQualifiedName(), false, helper.getClassLoader());
+                Class<Object> declaredClass = PrivilegedAccessHelper.getClassForName(itemType.getQualifiedName(), false, helper.getClassLoader());
                 mapping.setAttributeElementClass(declaredClass);
             }catch (Exception e) {
             }
@@ -1870,8 +1885,8 @@
         return mapping;
     }
     public AnyAttributeMapping generateAnyAttributeMapping(Property property, Descriptor descriptor, NamespaceInfo namespaceInfo) {
-        AnyAttributeMapping mapping = new XMLAnyAttributeMapping();
-        initializeXMLMapping((XMLAnyAttributeMapping)mapping, property);
+        XMLAnyAttributeMapping mapping = new XMLAnyAttributeMapping();
+        initializeXMLMapping(mapping, property);
         initializeXMLContainerMapping(mapping, property.getType().isArray());
 
         // if the XPath is set (via xml-path) use it
@@ -1891,7 +1906,7 @@
     }
 
     public AnyObjectMapping generateAnyObjectMapping(Property property, Descriptor descriptor, NamespaceInfo namespaceInfo)  {
-        AnyObjectMapping mapping = new XMLAnyObjectMapping();
+        AnyObjectMapping<AbstractSession, AttributeAccessor, ContainerPolicy, XMLConverter, ClassDescriptor, DatabaseField, XMLMarshaller, Session, UnmarshalKeepAsElementPolicy, XMLUnmarshaller, XMLRecord> mapping = new XMLAnyObjectMapping();
         initializeXMLMapping((XMLMapping)mapping, property);
 
         // if the XPath is set (via xml-path) use it
@@ -2104,11 +2119,11 @@
                         directCollectionMapping.getContainerPolicy(), helper.getClassLoader());
                 String componentClassName = theType.getComponentType().getQualifiedName();
                 if (theType.getComponentType().isPrimitive()){
-                    Class primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(componentClassName);
+                    Class<Object> primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(componentClassName);
                     accessor.setComponentClass(primitiveClass);
                     directCollectionMapping.setAttributeAccessor(accessor);
 
-                    Class declaredClass = XMLConversionManager.getObjectClass(primitiveClass);
+                    Class<Object> declaredClass = XMLConversionManager.getObjectClass(primitiveClass);
                     directCollectionMapping.setAttributeElementClass(declaredClass);
                 } else {
                     accessor.setComponentClassName(componentClassName);
@@ -2178,7 +2193,7 @@
 
     public CompositeCollectionMapping generateCompositeCollectionMapping(Property property, Descriptor descriptor, JavaClass javaClass, NamespaceInfo namespaceInfo, String referenceClassName) {
         boolean nestedArray = false;
-        CompositeCollectionMapping mapping = new XMLCompositeCollectionMapping();
+        CompositeCollectionMapping<AbstractSession, AttributeAccessor, ContainerPolicy, Converter, ClassDescriptor, DatabaseField, XMLMarshaller, Session, UnmarshalKeepAsElementPolicy, XMLUnmarshaller, XMLRecord> mapping = new XMLCompositeCollectionMapping();
         initializeXMLMapping((XMLMapping)mapping, property);
         initializeXMLContainerMapping(mapping, property.getType().isArray());
 
@@ -2210,7 +2225,7 @@
                 accessor.setAdaptedClassName(referenceClassName);
                 JavaClass baseComponentType = getBaseComponentType(componentType);
                 if (baseComponentType.isPrimitive()){
-                    Class primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
+                    Class<Object> primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
                     accessor.setComponentClass(primitiveClass);
                 } else {
                     accessor.setComponentClassName(baseComponentType.getQualifiedName());
@@ -2278,11 +2293,11 @@
             JAXBArrayAttributeAccessor accessor = new JAXBArrayAttributeAccessor(mapping.getAttributeAccessor(), mapping.getContainerPolicy(), helper.getClassLoader());
             String componentClassName = collectionType.getComponentType().getQualifiedName();
             if (collectionType.getComponentType().isPrimitive()){
-                Class primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(componentClassName);
+                Class<?> primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(componentClassName);
                 accessor.setComponentClass(primitiveClass);
                 mapping.setAttributeAccessor(accessor);
 
-                Class declaredClass = XMLConversionManager.getObjectClass(primitiveClass);
+                Class<?> declaredClass = XMLConversionManager.getObjectClass(primitiveClass);
                 mapping.setAttributeElementClass(declaredClass);
             } else {
                 accessor.setComponentClassName(componentClassName);
@@ -2290,7 +2305,7 @@
 
                 JavaClass componentType = collectionType.getComponentType();
                 try{
-                    Class declaredClass = PrivilegedAccessHelper.getClassForName(componentType.getRawName(), false, helper.getClassLoader());
+                    Class<?> declaredClass = PrivilegedAccessHelper.getClassForName(componentType.getRawName(), false, helper.getClassLoader());
                     mapping.setAttributeElementClass(declaredClass);
                 }catch (Exception e) {}
             }
@@ -2299,7 +2314,7 @@
             if (args.size() >0){
                 JavaClass itemType = (JavaClass)args.iterator().next();
                 try {
-                    Class declaredClass = PrivilegedAccessHelper.getClassForName(itemType.getRawName(), false, helper.getClassLoader());
+                    Class<?> declaredClass = PrivilegedAccessHelper.getClassForName(itemType.getRawName(), false, helper.getClassLoader());
                     if(declaredClass != String.class){
                         mapping.setAttributeElementClass(declaredClass);
                     }
@@ -2509,9 +2524,9 @@
     }
 
     public void generateMappings() {
-        Iterator javaClasses = this.typeInfo.keySet().iterator();
+        Iterator<String> javaClasses = this.typeInfo.keySet().iterator();
         while (javaClasses.hasNext()) {
-            String next = (String)javaClasses.next();
+            String next = javaClasses.next();
             JavaClass javaClass = helper.getJavaClass(next);
             TypeInfo info = this.typeInfo.get(next);
             if (info.isEnumerationType()) {
@@ -2650,7 +2665,7 @@
      * @param referenceClass
      */
     public CollectionReferenceMapping generateXMLCollectionReferenceMapping(Property property, Descriptor descriptor, NamespaceInfo namespaceInfo, JavaClass referenceClass) {
-        CollectionReferenceMapping mapping = new XMLCollectionReferenceMapping();
+        CollectionReferenceMapping<AbstractSession, AttributeAccessor, ContainerPolicy, ClassDescriptor, DatabaseField, UnmarshalRecord, XMLField, XMLRecord> mapping = new XMLCollectionReferenceMapping();
         initializeXMLMapping((XMLMapping)mapping, property);
 
         initializeXMLContainerMapping(mapping, property.getType().isArray());
@@ -2668,7 +2683,7 @@
                 accessor.setAdaptedClassName(referenceClassName);
                 JavaClass baseComponentType = getBaseComponentType(componentType);
                 if (baseComponentType.isPrimitive()){
-                    Class primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
+                    Class<Object> primitiveClass = XMLConversionManager.getDefaultManager().convertClassNameToClass(baseComponentType.getRawName());
                     accessor.setComponentClass(primitiveClass);
                 } else {
                     accessor.setComponentClassName(baseComponentType.getQualifiedName());
@@ -2736,7 +2751,7 @@
      * @param referenceClass
      */
     public ObjectReferenceMapping generateXMLObjectReferenceMapping(Property property, Descriptor descriptor, NamespaceInfo namespaceInfo, JavaClass referenceClass) {
-        ObjectReferenceMapping mapping = new XMLObjectReferenceMapping();
+        ObjectReferenceMapping<AbstractSession, AttributeAccessor, ContainerPolicy, ClassDescriptor, DatabaseField, UnmarshalRecord, XMLField, XMLRecord> mapping = new XMLObjectReferenceMapping();
         initializeXMLMapping((XMLMapping)mapping, property);
         mapping.setReferenceClassName(referenceClass.getQualifiedName());
 
@@ -3004,7 +3019,7 @@
                              typeMappingInfoToGeneratedClasses.put(nextElement.getTypeMappingInfo(), generatedClass);
                          }
                          try{
-                             Class declaredClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
+                             Class<Object> declaredClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
                              this.qNamesToDeclaredClasses.put(next, declaredClass);
                          }catch(Exception e){
                          }
@@ -3018,7 +3033,7 @@
                                 typeMappingInfoToGeneratedClasses.put(nextElement.getTypeMappingInfo(), generatedClass);
                             }
                             try{
-                                Class declaredClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
+                                Class<Object> declaredClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
                                 this.qNamesToDeclaredClasses.put(next, declaredClass);
                             }catch(Exception ex) {
 
@@ -3035,7 +3050,7 @@
                     this.classToGeneratedClasses.put(type.getJavaClassName(), generatedClass);
                 }
                 try{
-                    Class declaredClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
+                    Class<Object> declaredClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
                     this.qNamesToDeclaredClasses.put(next, declaredClass);
                 }catch(Exception e){
 
@@ -3099,7 +3114,7 @@
 
           this.qNamesToGeneratedClasses.put(next, generatedClass);
           try{
-              Class declaredClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
+              Class<Object> declaredClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
               this.qNamesToDeclaredClasses.put(next, declaredClass);
           }catch(Exception e){
 
@@ -3113,7 +3128,7 @@
 
 
               if(nextElement.isList()){
-                  DirectCollectionMapping mapping = new XMLCompositeDirectCollectionMapping();
+                  DirectCollectionMapping<AbstractSession, AttributeAccessor, ContainerPolicy, Converter, ClassDescriptor, DatabaseField, XMLMarshaller, Session, XMLUnmarshaller, XMLRecord> mapping = new XMLCompositeDirectCollectionMapping();
                   mapping.setAttributeName("value");
                   mapping.setXPath("text()");
                   mapping.setUsesSingleNode(true);
@@ -3123,7 +3138,7 @@
                       mapping.setValueConverter(buildJAXBEnumTypeConverter(mapping, (EnumTypeInfo)type));
                   }else{
                       try{
-                          Class fieldElementClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
+                          Class<Object> fieldElementClass = PrivilegedAccessHelper.getClassForName(nextClassName, false, helper.getClassLoader());
                           mapping.setFieldElementClass(fieldElementClass);
                       }catch(ClassNotFoundException e){
                       }
@@ -3138,7 +3153,7 @@
                   desc.addMapping((CoreMapping)mapping);
               } else{
                   if(nextElement.getJavaTypeName().equals(OBJECT_CLASS_NAME)){
-                      CompositeObjectMapping mapping = new XMLCompositeObjectMapping();
+                      CompositeObjectMapping<AbstractSession, AttributeAccessor, ContainerPolicy, Converter, ClassDescriptor, DatabaseField, XMLMarshaller, Session, UnmarshalKeepAsElementPolicy, XMLUnmarshaller, XMLRecord> mapping = new XMLCompositeObjectMapping();
                       mapping.setAttributeName("value");
                       mapping.setSetMethodName("setValue");
                       mapping.setGetMethodName("getValue");
@@ -3148,7 +3163,7 @@
 
                       desc.addMapping((CoreMapping)mapping);
                   }else if(isBinaryData(nextElement.getJavaType())){
-                        BinaryDataMapping mapping = new XMLBinaryDataMapping();
+                        BinaryDataMapping<AbstractSession, AttributeAccessor, ContainerPolicy, Converter, ClassDescriptor, DatabaseField, XMLMarshaller, MimeTypePolicy, Session, XMLUnmarshaller, XMLRecord> mapping = new XMLBinaryDataMapping();
                         mapping.setAttributeName("value");
                         mapping.setXPath(".");
                       ((Field)mapping.getField()).setSchemaType(Constants.BASE_64_BINARY_QNAME);
@@ -3168,7 +3183,7 @@
                       desc.addMapping((CoreMapping)mapping);
 
                   }else{
-                      DirectMapping mapping = new XMLDirectMapping();
+                      DirectMapping<AbstractSession, AttributeAccessor, ContainerPolicy, Converter, ClassDescriptor, DatabaseField, XMLMarshaller, Session, XMLUnmarshaller, XMLRecord> mapping = new XMLDirectMapping();
                       mapping.setNullValueMarshalled(true);
                       mapping.setAttributeName("value");
                       mapping.setXPath("text()");
@@ -3421,7 +3436,7 @@
                 XMLConversionManager mgr = new XMLConversionManager();
                 mgr.setLoader(helper.getClassLoader());
                 // handle parameter type
-                Class typeClass = mgr.convertClassNameToClass(typeStr);
+                Class<Object> typeClass = mgr.convertClassNameToClass(typeStr);
                 // handle parameter value
                 Object parameterValue = mgr.convertObject(valueStr, typeClass);
                 parameters.add(parameterValue);
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/Property.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/Property.java
index 3fc9a11..7ca65dc 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/Property.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/Property.java
@@ -29,6 +29,7 @@
 import jakarta.xml.bind.annotation.adapters.XmlAdapter;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.internal.oxm.XMLConversionManager;
 import org.eclipse.persistence.jaxb.compiler.facets.Facet;
 import org.eclipse.persistence.internal.jaxb.GenericsClassHelper;
 import org.eclipse.persistence.internal.oxm.XPathFragment;
@@ -43,6 +44,7 @@
 import org.eclipse.persistence.jaxb.xmlmodel.XmlJoinNodes;
 import org.eclipse.persistence.jaxb.xmlmodel.XmlMarshalNullRepresentation;
 import org.eclipse.persistence.jaxb.xmlmodel.XmlTransformation;
+import org.eclipse.persistence.oxm.NamespaceResolver;
 import org.eclipse.persistence.oxm.XMLField;
 
 /**
@@ -1124,7 +1126,7 @@
         if (getXmlPath() == null) {
             return false;
         }
-        Field field = new XMLField(getXmlPath());
+        Field<XMLConversionManager, NamespaceResolver> field = new XMLField(getXmlPath());
         XPathFragment frag = field.getXPathFragment();
         // loop until we have the last non-null, non-attribute, non-text fragment
         while (true) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/SchemaGenerator.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/SchemaGenerator.java
index dcea6d8..d9128c5 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/SchemaGenerator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/SchemaGenerator.java
@@ -42,6 +42,7 @@
 import org.eclipse.persistence.internal.jaxb.many.MapValue;
 import org.eclipse.persistence.internal.oxm.Constants;
 import org.eclipse.persistence.internal.oxm.Namespace;
+import org.eclipse.persistence.internal.oxm.XMLConversionManager;
 import org.eclipse.persistence.internal.oxm.XPathFragment;
 import org.eclipse.persistence.internal.oxm.mappings.Field;
 import org.eclipse.persistence.internal.oxm.schema.model.All;
@@ -1550,7 +1551,7 @@
             return null;
         }
         // create the XPathFragment(s) for the path
-        Field xfld = new XMLField(property.getXmlPath());
+        Field<XMLConversionManager, NamespaceResolver> xfld = new XMLField(property.getXmlPath());
         xfld.setNamespaceResolver(schema.getNamespaceResolver());
         xfld.initialize();
         // build the schema components for the xml-path
@@ -2322,7 +2323,7 @@
     private void addXmlJoinNodesToSchema(Property property, TypeDefParticle compositor, Schema schema, ComplexType type) {
         for (XmlJoinNode xmlJoinNode : property.getXmlJoinNodes().getXmlJoinNode()) {
             // create the XPathFragment(s) for the path
-            Field xfld = new XMLField(xmlJoinNode.getXmlPath());
+            Field<XMLConversionManager, NamespaceResolver> xfld = new XMLField(xmlJoinNode.getXmlPath());
             xfld.setNamespaceResolver(schema.getNamespaceResolver());
             xfld.initialize();
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/XMLProcessor.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/XMLProcessor.java
index 82252c4..55ddd68 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/XMLProcessor.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/XMLProcessor.java
@@ -142,7 +142,7 @@
         // process each XmlBindings in the map
         XmlBindings xmlBindings;
         for (String packageName : xmlBindingMap.keySet()) {
-            ArrayList classesToProcess = pkgToClassMap.get(packageName);
+            ArrayList<JavaClass> classesToProcess = pkgToClassMap.get(packageName);
             if (classesToProcess == null) {
                 getLogger().logWarning("jaxb_metadata_warning_no_classes_to_process", new Object[] { packageName });
                 continue;
@@ -176,7 +176,7 @@
             }
 
             // build an array of JavaModel classes to process
-            JavaClass[] javaClasses = (JavaClass[]) classesToProcess.toArray(new JavaClass[classesToProcess.size()]);
+            JavaClass[] javaClasses = classesToProcess.toArray(new JavaClass[classesToProcess.size()]);
 
             // handle xml-enums
             // build a map of enum class names to XmlEnum objects
@@ -379,14 +379,14 @@
 
         }
         for (String packageName : xmlBindingMap.keySet()) {
-            ArrayList classesToProcess = pkgToClassMap.get(packageName);
+            ArrayList<JavaClass> classesToProcess = pkgToClassMap.get(packageName);
             if (classesToProcess == null) {
                 getLogger().logWarning("jaxb_metadata_warning_no_classes_to_process", new Object[] { packageName });
                 continue;
             }
 
             xmlBindings = xmlBindingMap.get(packageName);
-            JavaClass[] javaClasses = (JavaClass[]) classesToProcess.toArray(new JavaClass[classesToProcess.size()]);
+            JavaClass[] javaClasses = classesToProcess.toArray(new JavaClass[classesToProcess.size()]);
             // post-build the TypeInfo objects
             javaClasses = aProcessor.postBuildTypeInfo(javaClasses);
 
@@ -1086,8 +1086,8 @@
         }
         // handle null policy
         if (xmlAttribute.getXmlAbstractNullPolicy() != null) {
-            JAXBElement jaxbElt = xmlAttribute.getXmlAbstractNullPolicy();
-            oldProperty.setNullPolicy((XmlAbstractNullPolicy) jaxbElt.getValue());
+            JAXBElement<? extends XmlAbstractNullPolicy> jaxbElt = xmlAttribute.getXmlAbstractNullPolicy();
+            oldProperty.setNullPolicy(jaxbElt.getValue());
         }
         // set user-defined properties
         if (xmlAttribute.getXmlProperties() != null  && xmlAttribute.getXmlProperties().getXmlProperty().size() > 0) {
@@ -1300,8 +1300,8 @@
         }
         // handle null policy
         if (xmlElement.getXmlAbstractNullPolicy() != null) {
-            JAXBElement jaxbElt = xmlElement.getXmlAbstractNullPolicy();
-            oldProperty.setNullPolicy((XmlAbstractNullPolicy) jaxbElt.getValue());
+            JAXBElement<? extends XmlAbstractNullPolicy> jaxbElt = xmlElement.getXmlAbstractNullPolicy();
+            oldProperty.setNullPolicy(jaxbElt.getValue());
         }
         // set user-defined properties
         if (xmlElement.getXmlProperties() != null  && xmlElement.getXmlProperties().getXmlProperty().size() > 0) {
@@ -1567,8 +1567,8 @@
         }
         // handle null policy
         if (xmlValue.getXmlAbstractNullPolicy() != null) {
-            JAXBElement jaxbElt = xmlValue.getXmlAbstractNullPolicy();
-            oldProperty.setNullPolicy((XmlAbstractNullPolicy) jaxbElt.getValue());
+            JAXBElement<? extends XmlAbstractNullPolicy> jaxbElt = xmlValue.getXmlAbstractNullPolicy();
+            oldProperty.setNullPolicy(jaxbElt.getValue());
         }
         // set user-defined properties
         if (xmlValue.getXmlProperties() != null  && xmlValue.getXmlProperties().getXmlProperty().size() > 0) {
@@ -1700,7 +1700,7 @@
         XmlBindings xmlBindings;
         for (String packageName : xmlBindingMap.keySet()) {
             xmlBindings = xmlBindingMap.get(packageName);
-            ArrayList classes = new ArrayList<JavaClass>();
+            ArrayList<JavaClass> classes = new ArrayList<JavaClass>();
             // add binding classes - the Java Model will be used to get a
             // JavaClass via class name
             JavaTypes jTypes = xmlBindings.getJavaTypes();
@@ -1737,7 +1737,7 @@
                 if (allExistingClasses != null) {
                     allExistingClasses.add(jClass);
                 } else {
-                    ArrayList classes = new ArrayList<JavaClass>();
+                    ArrayList<JavaClass> classes = new ArrayList<JavaClass>();
                     classes.add(jClass);
                     theMap.put(pkg, classes);
                 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContextFactory.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContextFactory.java
index 4d273ee..011980b 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContextFactory.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/DynamicJAXBContextFactory.java
@@ -18,6 +18,8 @@
 import java.util.Map;
 
 import jakarta.xml.bind.JAXBException;
+
+import javax.xml.namespace.QName;
 import javax.xml.transform.Source;
 
 import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
@@ -357,11 +359,11 @@
     private static void fixDateTimeConversion(DynamicJAXBContext ctx) {
         XMLConversionManager conversionManager = (XMLConversionManager) ctx.getXMLContext().getSession().getDatasourcePlatform().getConversionManager();
 
-        Map defaultXmlTypes = XMLConversionManager.getDefaultXMLTypes();
+        Map<QName, Class<?>> defaultXmlTypes = XMLConversionManager.getDefaultXMLTypes();
         defaultXmlTypes.remove(Constants.DATE_TIME_QNAME);
         defaultXmlTypes.put(Constants.DATE_TIME_QNAME, CoreClassConstants.XML_GREGORIAN_CALENDAR);
 
-        Map defaultJavaTypes = XMLConversionManager.getDefaultJavaTypes();
+        Map<Class<?>, QName> defaultJavaTypes = XMLConversionManager.getDefaultJavaTypes();
         defaultJavaTypes.remove(CoreClassConstants.CALENDAR);
         defaultJavaTypes.put(CoreClassConstants.XML_GREGORIAN_CALENDAR, Constants.DATE_TIME_QNAME);
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/metadata/OXMMetadata.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/metadata/OXMMetadata.java
index aba5f54..97c2e98 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/metadata/OXMMetadata.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/dynamic/metadata/OXMMetadata.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
@@ -79,7 +79,7 @@
                     JavaType type = iterator.next();
                     //Check to see if it's a static class or if should be treated as dynamic
                     try {
-                        Class staticClass = dynamicClassLoader.getParent().loadClass(Helper.getQualifiedJavaTypeName(type.getName(), pkgName));
+                        Class<?> staticClass = dynamicClassLoader.getParent().loadClass(Helper.getQualifiedJavaTypeName(type.getName(), pkgName));
                         oxmJavaClasses.add(new JavaClassImpl(staticClass, null));
                     } catch(Exception ex) {
                         type.setName(Helper.getQualifiedJavaTypeName(type.getName(), pkgName));
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/AnnotationProxy.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/AnnotationProxy.java
index 9a05322..738e5f8 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/AnnotationProxy.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/AnnotationProxy.java
@@ -151,7 +151,7 @@
             return null;
         }
 
-        Class returnType = method.getReturnType();
+        Class<?> returnType = method.getReturnType();
         Object value = getComponents().get(method.getName());
 
         if (value == null && returnType == boolean.class) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/oxm/OXMJavaClassImpl.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/oxm/OXMJavaClassImpl.java
index e0f0bb2..14b048f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/oxm/OXMJavaClassImpl.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/oxm/OXMJavaClassImpl.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
@@ -536,8 +536,8 @@
             // Only try class lookup if this is a JDK class, because
             // we won't ever find classes for dynamically generated types.
             try {
-                Class thisClass = PrivilegedAccessHelper.getClassForName(thisJavaName);
-                Class argClass = PrivilegedAccessHelper.getClassForName(argJavaName);
+                Class<Object> thisClass = PrivilegedAccessHelper.getClassForName(thisJavaName);
+                Class<Object> argClass = PrivilegedAccessHelper.getClassForName(argJavaName);
                 return thisClass.isAssignableFrom(argClass);
             } catch (Exception e) {
                 return false;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaFieldImpl.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaFieldImpl.java
index 2b7a518..7d1dbc6 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaFieldImpl.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaFieldImpl.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
@@ -101,7 +101,7 @@
 
     @Override
     public JavaClass getResolvedType() {
-        Class fieldType = jField.getType();
+        Class<?> fieldType = jField.getType();
         Type genericType = jField.getGenericType();
 
         if (genericType instanceof ParameterizedType) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaMethodImpl.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaMethodImpl.java
index e2149f8..d4b4071 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaMethodImpl.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaMethodImpl.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
@@ -116,14 +116,14 @@
     }
 
     public JavaClass getResolvedType() {
-        Class returnType = PrivilegedAccessHelper.getMethodReturnType(jMethod);
+        Class<Object> returnType = PrivilegedAccessHelper.getMethodReturnType(jMethod);
         return javaModelImpl.getClass(returnType);
     }
 
     @Override
     public JavaClass getReturnType() {
         Type type = jMethod.getGenericReturnType();
-        Class returnType = PrivilegedAccessHelper.getMethodReturnType(jMethod);
+        Class<Object> returnType = PrivilegedAccessHelper.getMethodReturnType(jMethod);
         if (type instanceof ParameterizedType) {
             ParameterizedType pType = (ParameterizedType) type;
             return new JavaClassImpl(pType, returnType, javaModelImpl);
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelImpl.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelImpl.java
index 40cb698..19440c8 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelImpl.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -93,12 +93,12 @@
     public JavaClass getClass(String className) {
         try {
             if (className.contains("[")) {
-                Class clazz = Class.forName(className);
+                Class<?> clazz = Class.forName(className);
                 if (clazz != null) {
                     return getClass(clazz);
                 }
             }
-            Class clazz = this.classLoader.loadClass(className);
+            Class<?> clazz = this.classLoader.loadClass(className);
             return getClass(clazz);
         } catch(ClassNotFoundException e) {
             throw JAXBException.classNotFoundException(className);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/JAXBWithJSONTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/JAXBWithJSONTestCases.java
index ca9e4cf..a2c82e7 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/JAXBWithJSONTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/JAXBWithJSONTestCases.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
@@ -36,7 +36,6 @@
 import jakarta.json.stream.JsonParser;
 import jakarta.xml.bind.JAXBElement;
 import jakarta.xml.bind.Marshaller;
-import jakarta.xml.bind.PropertyException;
 import jakarta.xml.bind.Unmarshaller;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.Source;
@@ -519,7 +518,7 @@
     public void generateJSONSchema(List<InputStream> controlSchemas) throws Exception {
         MyStreamSchemaOutputResolver outputResolver = new MyStreamSchemaOutputResolver();
 
-        Class theClass = getWriteControlObject().getClass();
+        Class<? extends Object> theClass = getWriteControlObject().getClass();
         if(getWriteControlObject() instanceof JAXBElement){
              theClass = ((JAXBElement) getWriteControlObject()).getValue().getClass();
         }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/PropertyTypeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/PropertyTypeTestCases.java
index 68f61de..529acde 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/PropertyTypeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/PropertyTypeTestCases.java
@@ -65,7 +65,7 @@
         testObject.booleanListTest.add(Boolean.TRUE);
 
         QName rootQName = new QName("root");
-        JAXBElement jaxbElement = new JAXBElement<Object>(rootQName,Object.class, testObject);
+        JAXBElement<Object> jaxbElement = new JAXBElement<Object>(rootQName,Object.class, testObject);
         return jaxbElement;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlelementdecl/emptystringns/EmptyStringNSTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlelementdecl/emptystringns/EmptyStringNSTestCases.java
index 651a37a..8e060e1 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlelementdecl/emptystringns/EmptyStringNSTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlelementdecl/emptystringns/EmptyStringNSTestCases.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
@@ -35,7 +35,7 @@
     protected Object getControlObject() {
         ObjectFactory objectFactory = new ObjectFactory();
         TestObject testObject = objectFactory.createTestObject();
-        JAXBElement elem = new JAXBElement<TestObject>(new QName("testObject"), TestObject.class, testObject);
+        JAXBElement<TestObject> elem = new JAXBElement<TestObject>(new QName("testObject"), TestObject.class, testObject);
 
         return elem;
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmllocation/Data.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmllocation/Data.java
index 7aa1922..9f1fe47 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmllocation/Data.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmllocation/Data.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
@@ -53,8 +53,8 @@
         }
 
         String subDataS = "\n";
-        for (Iterator iterator = subData.iterator(); iterator.hasNext();) {
-            SubData type = (SubData) iterator.next();
+        for (Iterator<SubData> iterator = subData.iterator(); iterator.hasNext();) {
+            SubData type = iterator.next();
             subDataS += "\t" + type.toString() + "\n";
         }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmllocation/DataNT.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmllocation/DataNT.java
index b8036be..024e5da 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmllocation/DataNT.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmllocation/DataNT.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
@@ -14,14 +14,12 @@
 //  - rbarkhouse - 08 September 2011 - 2.4 - Initial implementation
 package org.eclipse.persistence.testing.jaxb.annotations.xmllocation;
 
-import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
 import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlRootElement;
-import jakarta.xml.bind.annotation.XmlTransient;
 
 import org.eclipse.persistence.oxm.annotations.XmlLocation;
 import org.xml.sax.Locator;
@@ -53,8 +51,8 @@
         }
 
         String subDataS = "\n";
-        for (Iterator iterator = subData.iterator(); iterator.hasNext();) {
-            SubDataNT type = (SubDataNT) iterator.next();
+        for (Iterator<SubDataNT> iterator = subData.iterator(); iterator.hasNext();) {
+            SubDataNT type = iterator.next();
             subDataS += "\t" + type.toString() + "\n";
         }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/BinderTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/BinderTestCases.java
index 8cc8eb1..fb7fc99 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/BinderTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/BinderTestCases.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
@@ -21,13 +21,12 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
-import org.eclipse.persistence.jaxb.JAXBBinder;
 import org.eclipse.persistence.jaxb.JAXBContextFactory;
-import org.eclipse.persistence.oxm.XMLBinder;
 import org.eclipse.persistence.platform.xml.XMLParser;
 import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
 import org.eclipse.persistence.testing.oxm.XMLTestCase;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 
 public class BinderTestCases extends XMLTestCase {
 
@@ -47,7 +46,7 @@
 
     public void testUnmarshal() throws Exception {
         JAXBContext jc = JAXBContextFactory.createContext(new Class[] {Customer.class}, null);
-        Binder binder = jc.createBinder();
+        Binder<Node> binder = jc.createBinder();
         Customer test = (Customer) binder.unmarshal(getControlDocument());
 
         assertEquals(getControlObject(), test);
@@ -55,7 +54,7 @@
 
     public void testMarshal() throws Exception {
         JAXBContext jc = JAXBContextFactory.createContext(new Class[] {Customer.class}, null);
-        Binder binder = jc.createBinder();
+        Binder<Node> binder = jc.createBinder();
 
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/QNameRoot.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/QNameRoot.java
index e2cfff0..87f3ab1 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/QNameRoot.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/QNameRoot.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,7 +65,7 @@
             return false;
         }
 
-        List testNameList = test.getNameList();
+        List<QName> testNameList = test.getNameList();
         int itemsSize = nameList.size();
         if(itemsSize != testNameList.size()) {
             return false;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/XPathsRoot.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/XPathsRoot.java
index b18ab4c..446db90 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/XPathsRoot.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/XPathsRoot.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
@@ -14,7 +14,6 @@
 //     Blaise Doughan - 2.3 - initial implementation
 package org.eclipse.persistence.testing.jaxb.annotations.xmlpath.predicate;
 
-import java.awt.ItemSelectable;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -83,7 +82,7 @@
             return false;
         }
 
-        List testItems = test.getItems();
+        List<Object> testItems = test.getItems();
         int itemsSize = items.size();
         if(itemsSize != testItems.size()) {
             return false;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/BinderTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/BinderTestCases.java
index 8f5a914..d3fdcfe 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/BinderTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/BinderTestCases.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
@@ -24,6 +24,7 @@
 import org.eclipse.persistence.jaxb.JAXBContextFactory;
 import org.eclipse.persistence.testing.oxm.XMLTestCase;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 
 public class BinderTestCases extends XMLTestCase {
 
@@ -43,7 +44,7 @@
 
     public void testUnmarshal() throws Exception {
         JAXBContext jc = JAXBContextFactory.createContext(new Class[] {Customer.class}, null);
-        Binder binder = jc.createBinder();
+        Binder<Node> binder = jc.createBinder();
         Customer test = (Customer) binder.unmarshal(getControlDocument());
 
         assertEquals(getControlObject(), test);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/QNameRoot.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/QNameRoot.java
index bbfe309..cac926f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/QNameRoot.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/QNameRoot.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,7 +65,7 @@
             return false;
         }
 
-        List testNameList = test.getNameList();
+        List<QName> testNameList = test.getNameList();
         int itemsSize = nameList.size();
         if(itemsSize != testNameList.size()) {
             return false;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/XPathsRoot.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/XPathsRoot.java
index 055a853..321bd35 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/XPathsRoot.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/annotations/xmlpath/predicate/ns/XPathsRoot.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
@@ -14,7 +14,6 @@
 //     Blaise Doughan - 2.3 - initial implementation
 package org.eclipse.persistence.testing.jaxb.annotations.xmlpath.predicate.ns;
 
-import java.awt.ItemSelectable;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -83,7 +82,7 @@
             return false;
         }
 
-        List testItems = test.getItems();
+        List<Object> testItems = test.getItems();
         int itemsSize = items.size();
         if(itemsSize != testItems.size()) {
             return false;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/hashcode/BinderWithHashCodeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/hashcode/BinderWithHashCodeTestCases.java
index 158bd5e..a4bd6f6 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/hashcode/BinderWithHashCodeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/hashcode/BinderWithHashCodeTestCases.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
@@ -14,7 +14,6 @@
 //     Matt MacIvor - 2.3 - initial implementation
 package org.eclipse.persistence.testing.jaxb.binder.hashcode;
 
-import java.io.File;
 import java.io.StringReader;
 
 import jakarta.xml.bind.Binder;
@@ -45,7 +44,7 @@
 
         JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{Employee.class}, null);
 
-        Binder binder = ctx.createBinder();
+        Binder<Node> binder = ctx.createBinder();
 
         Employee emp = (Employee)binder.unmarshal(parser.parse(new StringReader(xml)));
 
@@ -54,6 +53,6 @@
         binder.updateXML(emp);
 
         JAXBXMLComparer comparer = new JAXBXMLComparer();
-        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, ((Node)binder.getXMLNode(emp)).getOwnerDocument()));
+        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, binder.getXMLNode(emp).getOwnerDocument()));
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/jaxbelement/BinderWithJAXBElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/jaxbelement/BinderWithJAXBElementTestCases.java
index 1c4dc22..1ff5a5e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/jaxbelement/BinderWithJAXBElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/jaxbelement/BinderWithJAXBElementTestCases.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
@@ -14,7 +14,6 @@
 //     Matt MacIvor - 2.3
 package org.eclipse.persistence.testing.jaxb.binder.jaxbelement;
 
-import java.io.File;
 import java.io.StringReader;
 
 import jakarta.xml.bind.Binder;
@@ -46,13 +45,13 @@
 
         JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{Employee.class}, null);
 
-        Binder binder = ctx.createBinder();
+        Binder<Node> binder = ctx.createBinder();
 
-        JAXBElement emp = binder.unmarshal(parser.parse(new StringReader(xml)), Employee.class);
-        ((Employee)emp.getValue()).id = 456;
+        JAXBElement<Employee> emp = binder.unmarshal(parser.parse(new StringReader(xml)), Employee.class);
+        emp.getValue().id = 456;
         binder.updateXML(emp);
 
         JAXBXMLComparer comparer = new JAXBXMLComparer();
-        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, ((Node)binder.getXMLNode(emp)).getOwnerDocument()));
+        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, binder.getXMLNode(emp).getOwnerDocument()));
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nscollison/NamespaceCollisionTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nscollison/NamespaceCollisionTestCases.java
index d285a0d..95e2f55 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nscollison/NamespaceCollisionTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nscollison/NamespaceCollisionTestCases.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
@@ -14,7 +14,6 @@
 //     Matt MacIvor - 2.3
 package org.eclipse.persistence.testing.jaxb.binder.nscollison;
 
-import java.io.File;
 import java.io.StringReader;
 
 import jakarta.xml.bind.Binder;
@@ -46,15 +45,15 @@
 
         JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{Employee.class}, null);
 
-        Binder binder = ctx.createBinder();
+        Binder<Node> binder = ctx.createBinder();
 
-        JAXBElement elem = binder.unmarshal(parser.parse(new StringReader(xml)), Employee.class);
-        Employee emp = (Employee)elem.getValue();
+        JAXBElement<Employee> elem = binder.unmarshal(parser.parse(new StringReader(xml)), Employee.class);
+        Employee emp = elem.getValue();
         emp.address.city = "Toronto";
 
         binder.updateXML(emp.address);
 
         JAXBXMLComparer comparer = new JAXBXMLComparer();
-        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, ((Node)binder.getXMLNode(emp)).getOwnerDocument()));
+        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, binder.getXMLNode(emp).getOwnerDocument()));
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nullpolicy/BinderWithNullPolicyCompositeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nullpolicy/BinderWithNullPolicyCompositeTestCases.java
index cceca70..135e00b 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nullpolicy/BinderWithNullPolicyCompositeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nullpolicy/BinderWithNullPolicyCompositeTestCases.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
@@ -14,7 +14,6 @@
 //     Matt MacIvor - 2.4 - initial implementation
 package org.eclipse.persistence.testing.jaxb.binder.nullpolicy;
 
-import java.io.File;
 import java.io.StringReader;
 
 import jakarta.xml.bind.Binder;
@@ -47,7 +46,7 @@
 
         JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{EmployeeCompositeA.class}, null);
 
-        Binder binder = ctx.createBinder();
+        Binder<Node> binder = ctx.createBinder();
 
         EmployeeCompositeA emp = (EmployeeCompositeA)binder.unmarshal(parser.parse(new StringReader(xml)));
 
@@ -60,9 +59,9 @@
         XMLTransformer transformer = XMLPlatformFactory.getInstance().getXMLPlatform().newXMLTransformer();
         transformer.transform(controlDocument, System.out);
 
-        transformer.transform((Node)binder.getXMLNode(emp), System.out);
+        transformer.transform(binder.getXMLNode(emp), System.out);
 
         JAXBXMLComparer comparer = new JAXBXMLComparer();
-        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, ((Node)binder.getXMLNode(emp)).getOwnerDocument()));
+        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, binder.getXMLNode(emp).getOwnerDocument()));
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nullpolicy/BinderWithNullPolicyTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nullpolicy/BinderWithNullPolicyTestCases.java
index 33d9135..258ab19 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nullpolicy/BinderWithNullPolicyTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/binder/nullpolicy/BinderWithNullPolicyTestCases.java
@@ -14,15 +14,12 @@
 //     Matt MacIvor - 2.3 - initial implementation
 package org.eclipse.persistence.testing.jaxb.binder.nullpolicy;
 
-import java.io.File;
 import java.io.StringReader;
 
 import jakarta.xml.bind.Binder;
 import jakarta.xml.bind.JAXBContext;
-import javax.xml.transform.stream.StreamResult;
 
 import org.eclipse.persistence.jaxb.JAXBContextFactory;
-import org.eclipse.persistence.oxm.XMLConstants;
 import org.eclipse.persistence.platform.xml.XMLParser;
 import org.eclipse.persistence.platform.xml.XMLPlatform;
 import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
@@ -48,7 +45,7 @@
 
         JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{EmployeeA.class}, null);
 
-        Binder binder = ctx.createBinder();
+        Binder<Node> binder = ctx.createBinder();
 
         EmployeeA emp = (EmployeeA)binder.unmarshal(parser.parse(new StringReader(xml)));
 
@@ -58,7 +55,7 @@
         binder.updateXML(emp);
 
         JAXBXMLComparer comparer = new JAXBXMLComparer();
-        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, ((Node)binder.getXMLNode(emp)).getOwnerDocument()));
+        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, binder.getXMLNode(emp).getOwnerDocument()));
     }
 
     public void testXsiNilNullMarshal() throws Exception {
@@ -68,7 +65,7 @@
 
         JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{EmployeeB.class}, null);
 
-        Binder binder = ctx.createBinder();
+        Binder<Node> binder = ctx.createBinder();
 
         EmployeeB emp = (EmployeeB)binder.unmarshal(parser.parse(new StringReader(xml)));
 
@@ -78,7 +75,7 @@
         binder.updateXML(emp);
 
         JAXBXMLComparer comparer = new JAXBXMLComparer();
-        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, ((Node)binder.getXMLNode(emp)).getOwnerDocument()));
+        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, binder.getXMLNode(emp).getOwnerDocument()));
     }
 
     public void testXsiNilUnmarshalMarshalValue() throws Exception {
@@ -88,7 +85,7 @@
 
         JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{EmployeeB.class}, null);
 
-        Binder binder = ctx.createBinder();
+        Binder<Node> binder = ctx.createBinder();
 
         EmployeeB emp = (EmployeeB)binder.unmarshal(parser.parse(new StringReader(xml)));
 
@@ -98,7 +95,7 @@
         binder.updateXML(emp);
 
         JAXBXMLComparer comparer = new JAXBXMLComparer();
-        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, ((Node)binder.getXMLNode(emp)).getOwnerDocument()));
+        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, binder.getXMLNode(emp).getOwnerDocument()));
     }
 
     public void testEmptyNode() throws Exception {
@@ -108,7 +105,7 @@
 
         JAXBContext ctx = JAXBContextFactory.createContext(new Class[]{EmployeeC.class}, null);
 
-        Binder binder = ctx.createBinder();
+        Binder<Node> binder = ctx.createBinder();
 
         EmployeeC emp = (EmployeeC)binder.unmarshal(parser.parse(new StringReader(xml)));
 
@@ -118,6 +115,6 @@
         binder.updateXML(emp);
 
         JAXBXMLComparer comparer = new JAXBXMLComparer();
-        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, ((Node)binder.getXMLNode(emp)).getOwnerDocument()));
+        assertTrue("Marshalled document does not match the control document.", comparer.isNodeEqual(controlDocument, binder.getXMLNode(emp).getOwnerDocument()));
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/DifferentClassLoaderTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/DifferentClassLoaderTestCases.java
index 27e952d..f7910b1 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/DifferentClassLoaderTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/DifferentClassLoaderTestCases.java
@@ -14,14 +14,12 @@
 // Denise Smith - September 10 /2009
 package org.eclipse.persistence.testing.jaxb.classloader;
 
-import java.io.File;
 import java.net.URL;
 import java.net.URLClassLoader;
 
 import org.eclipse.persistence.jaxb.JAXBContextFactory;
 
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
-import org.eclipse.persistence.testing.jaxb.jaxbcontext.withjaxbindex.ClassA;
 
 public class DifferentClassLoaderTestCases extends JAXBWithJSONTestCases {
 
@@ -43,7 +41,7 @@
         URLClassLoader classLoaderA = new URLClassLoader(urls);
 
 
-        Class classAClass = classLoaderA.loadClass("org.eclipse.persistence.testing.jaxb.classloader.ClassA");
+        Class<?> classAClass = classLoaderA.loadClass("org.eclipse.persistence.testing.jaxb.classloader.ClassA");
         ClassLoader test = classAClass.getClassLoader();
         classes[1] = classAClass;
         rootClass = classAClass;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/InnerClassTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/InnerClassTestCases.java
index 6e10e8c..5be5694 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/InnerClassTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/InnerClassTestCases.java
@@ -14,7 +14,6 @@
 // Oracle = 2.2 - Initial implementation
 package org.eclipse.persistence.testing.jaxb.classloader;
 
-import java.io.File;
 import java.net.URL;
 import java.net.URLClassLoader;
 
@@ -33,7 +32,7 @@
         urls[0] = Thread.currentThread().getContextClassLoader().getResource("org/eclipse/persistence/testing/jaxb/classloader/innerClass.jar");
         URLClassLoader classLoader = new URLClassLoader(urls);
 
-        Class classAClass = classLoader.loadClass("org.eclipse.persistence.testing.jaxb.classloader.ClassWithInnerClass");
+        Class<?> classAClass = classLoader.loadClass("org.eclipse.persistence.testing.jaxb.classloader.ClassWithInnerClass");
 
         classes[0] = classAClass;
         JAXBContext ctx = JAXBContextFactory.createContext(classes, null, Thread.currentThread().getContextClassLoader());
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/XmlElementsEnumTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/XmlElementsEnumTestCases.java
index a51524b..f0bfc7a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/XmlElementsEnumTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/classloader/XmlElementsEnumTestCases.java
@@ -32,7 +32,7 @@
         urls[0] = Thread.currentThread().getContextClassLoader().getResource("org/eclipse/persistence/testing/jaxb/classloader/enum.jar");
         URLClassLoader classLoader = new URLClassLoader(urls);
 
-        Class classAClass = classLoader.loadClass("org.eclipse.persistence.testing.jaxb.classloader.Root");
+        Class<?> classAClass = classLoader.loadClass("org.eclipse.persistence.testing.jaxb.classloader.Root");
 
         classes[0] = classAClass;
         JAXBContext ctx = JAXBContextFactory.createContext(classes, null, classLoader);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/dynamic/DynamicJAXBFromOXMTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/dynamic/DynamicJAXBFromOXMTestCases.java
index 9ee7a3b..b273610 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/dynamic/DynamicJAXBFromOXMTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/dynamic/DynamicJAXBFromOXMTestCases.java
@@ -14,17 +14,13 @@
 //     rbarkhouse - 2.2 - initial implementation
 package org.eclipse.persistence.testing.jaxb.dynamic;
 
-import java.io.File;
-import java.io.IOException;
 import java.io.InputStream;
 import java.lang.reflect.UndeclaredThrowableException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.util.ArrayList;
-import java.util.GregorianCalendar;
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Vector;
 
@@ -35,42 +31,27 @@
 import javax.xml.datatype.DatatypeFactory;
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.stream.XMLInputFactory;
-import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.Source;
 import javax.xml.transform.dom.DOMSource;
 import javax.xml.transform.stream.StreamSource;
 
 import junit.framework.TestCase;
 
-import org.eclipse.persistence.config.DescriptorCustomizer;
-import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.descriptors.ClassExtractor;
 import org.eclipse.persistence.dynamic.DynamicEntity;
 import org.eclipse.persistence.internal.oxm.XMLConversionManager;
-import org.eclipse.persistence.jaxb.JAXBContextFactory;
 import org.eclipse.persistence.jaxb.JAXBContextProperties;
 import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
 import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;
-import org.eclipse.persistence.mappings.transformers.AttributeTransformerAdapter;
-import org.eclipse.persistence.mappings.transformers.FieldTransformerAdapter;
 import org.eclipse.persistence.oxm.XMLConstants;
 import org.eclipse.persistence.oxm.XMLDescriptor;
-import org.eclipse.persistence.oxm.XMLField;
 import org.eclipse.persistence.oxm.mappings.XMLDirectMapping;
-import org.eclipse.persistence.sessions.Record;
-import org.eclipse.persistence.sessions.Session;
 import org.eclipse.persistence.testing.jaxb.dynamic.util.Computer;
-import org.eclipse.persistence.testing.jaxb.dynamic.util.ComputerAdapter;
 import org.eclipse.persistence.testing.jaxb.dynamic.util.LinkAdapter;
 import org.eclipse.persistence.testing.jaxb.dynamic.util.LinkAdapterString;
 import org.w3c.dom.CDATASection;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
 import org.w3c.dom.Node;
-import org.xml.sax.EntityResolver;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
 
 public class DynamicJAXBFromOXMTestCases extends TestCase {
 
@@ -1253,8 +1234,8 @@
         DynamicEntity readCompany = (DynamicEntity) jaxbContext.createUnmarshaller().unmarshal(companyDoc);
 
         ArrayList<DynamicEntity> readEmployees = readCompany.get("employees");
-        for (Iterator iterator = readEmployees.iterator(); iterator.hasNext();) {
-            DynamicEntity emp = (DynamicEntity) iterator.next();
+        for (Iterator<DynamicEntity> iterator = readEmployees.iterator(); iterator.hasNext();) {
+            DynamicEntity emp = iterator.next();
             DynamicEntity add = emp.get("address");
 
             String idString = ((Integer)emp.get("id")).toString();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anyattribute/Employee.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anyattribute/Employee.java
index 61ea2a7..7d2ca5a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anyattribute/Employee.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anyattribute/Employee.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
@@ -18,8 +18,6 @@
 import java.util.Map;
 import javax.xml.namespace.QName;
 
-import org.eclipse.persistence.testing.oxm.mappings.anyattribute.withoutgroupingelement.Root;
-
 public class Employee {
     public Map<QName, String> stuff;
 
@@ -48,8 +46,8 @@
             return false;
         }
 
-        Map thisStuff = this.stuff;
-        Map otherStuff = empObj.stuff;
+        Map<QName, String> thisStuff = this.stuff;
+        Map<QName, String> otherStuff = empObj.stuff;
 
         if (thisStuff == null) {
             return (otherStuff == null || otherStuff.size() == 0);
@@ -63,7 +61,7 @@
             return false;
         }
 
-        Iterator values1 = thisStuff.keySet().iterator();
+        Iterator<QName> values1 = thisStuff.keySet().iterator();
         while(values1.hasNext()) {
             Object key1 = values1.next();
             Object value1 = thisStuff.get(key1);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anyattribute/XmlAnyAttributeSubTypeMapModel.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anyattribute/XmlAnyAttributeSubTypeMapModel.java
index 0e6af94..148d56e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anyattribute/XmlAnyAttributeSubTypeMapModel.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/mappings/anyattribute/XmlAnyAttributeSubTypeMapModel.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
@@ -39,8 +39,8 @@
             return false;
         }
 
-        Map thisChildren = this.children;
-        Map otherChildren = modelObj.children;
+        Map<QName, String> thisChildren = this.children;
+        Map<QName, String> otherChildren = modelObj.children;
 
         if (thisChildren == null) {
             return (otherChildren == null || otherChildren.size() == 0);
@@ -54,7 +54,7 @@
             return false;
         }
 
-        Iterator values1 = thisChildren.keySet().iterator();
+        Iterator<QName> values1 = thisChildren.keySet().iterator();
         while(values1.hasNext()) {
             Object key1 = values1.next();
             Object value1 = thisChildren.get(key1);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlanyelement/xmlelementrefs2/Customer.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlanyelement/xmlelementrefs2/Customer.java
index f17b2fd..49b3bb9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlanyelement/xmlelementrefs2/Customer.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlanyelement/xmlelementrefs2/Customer.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,9 +20,7 @@
 import java.util.ListIterator;
 
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.annotation.XmlAnyElement;
 import jakarta.xml.bind.annotation.XmlAttribute;
-import jakarta.xml.bind.annotation.XmlElement;
 import jakarta.xml.bind.annotation.XmlElementRef;
 import jakarta.xml.bind.annotation.XmlElementRefs;
 import jakarta.xml.bind.annotation.XmlMixed;
@@ -49,7 +47,7 @@
         StringBuffer sb = new StringBuffer();
         sb.append("Employee [" + id + "] " + name + "\n");
 
-        for (Iterator iterator = contacts.iterator(); iterator.hasNext();) {
+        for (Iterator<Object> iterator = contacts.iterator(); iterator.hasNext();) {
             Object o = iterator.next();
             try {
                 JAXBElement e = (JAXBElement) o;
@@ -75,8 +73,8 @@
         if (!(this.name.equals(c.name))) return false;
 
         // Compare contacts
-        ListIterator e1 = this.contacts.listIterator();
-        ListIterator e2 = c.contacts.listIterator();
+        ListIterator<Object> e1 = this.contacts.listIterator();
+        ListIterator<Object> e2 = c.contacts.listIterator();
         while (e1.hasNext() && e2.hasNext()) {
             Object o1 = e1.next();
             Object o2 = e2.next();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlregistry/XmlRegistryNonLocalTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlregistry/XmlRegistryNonLocalTestCases.java
index 9132642..8b8783a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlregistry/XmlRegistryNonLocalTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlregistry/XmlRegistryNonLocalTestCases.java
@@ -25,7 +25,6 @@
 import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
 
-import org.eclipse.persistence.jaxb.JAXBContextFactory;
 import org.eclipse.persistence.jaxb.JAXBContextProperties;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 
@@ -43,7 +42,7 @@
     @Override
     protected Object getControlObject() {
         QName name = new QName("foos");
-        JAXBElement jaxbElement = new JAXBElement<Integer>(name, Integer.class, 5);
+        JAXBElement<Integer> jaxbElement = new JAXBElement<Integer>(name, Integer.class, 5);
         return jaxbElement;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlregistry/XmlRegistryTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlregistry/XmlRegistryTestCases.java
index 9b51632..1f38439 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlregistry/XmlRegistryTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmlregistry/XmlRegistryTestCases.java
@@ -25,7 +25,6 @@
 import javax.xml.transform.Source;
 import javax.xml.transform.stream.StreamSource;
 
-import org.eclipse.persistence.jaxb.JAXBContextFactory;
 import org.eclipse.persistence.jaxb.JAXBContextProperties;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 
@@ -82,7 +81,7 @@
 
         FooBar foobar = new FooBar();
         QName name = new QName("foo");
-        JAXBElement jaxbElement = new JAXBElement<String>(name, String.class, "This is some foo.");
+        JAXBElement<String> jaxbElement = new JAXBElement<String>(name, String.class, "This is some foo.");
         return jaxbElement;
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmltransient/ContactInfo.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmltransient/ContactInfo.java
index 107c43c..96393f2 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmltransient/ContactInfo.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/externalizedmetadata/xmltransient/ContactInfo.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
@@ -51,7 +51,7 @@
             return false;
         }
 
-        List testList = ((ContactInfo)obj).addresses;
+        List<Address> testList = ((ContactInfo)obj).addresses;
 
         if(addresses == null && testList != null){
             return false;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/helper/JAXBHelperTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/helper/JAXBHelperTestCases.java
index b0745bc..84eca2f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/helper/JAXBHelperTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/helper/JAXBHelperTestCases.java
@@ -30,6 +30,7 @@
 import org.eclipse.persistence.oxm.XMLUnmarshaller;
 
 import junit.framework.TestCase;
+import org.w3c.dom.Node;
 
 public class JAXBHelperTestCases extends TestCase {
     private JAXBContext jaxbContext;
@@ -60,7 +61,7 @@
     }
 
     public void testCastToJAXBBinder() throws Exception {
-        Binder binder = jaxbContext.createBinder();
+        Binder<Node> binder = jaxbContext.createBinder();
         assertTrue(JAXBHelper.getBinder(binder) instanceof JAXBBinder);
     }
 
@@ -93,12 +94,12 @@
     }
 
     public void testUnwrapJAXBBinderToJAXBImpl() throws Exception {
-        Binder binder = jaxbContext.createBinder();
+        Binder<Node> binder = jaxbContext.createBinder();
         assertTrue(JAXBHelper.unwrap(binder, JAXBBinder.class) instanceof JAXBBinder);
     }
 
     public void testUnwrapJAXBBinderToXMLBinder() throws Exception {
-        Binder binder = jaxbContext.createBinder();
+        Binder<Node> binder = jaxbContext.createBinder();
         assertTrue(JAXBHelper.unwrap(binder, XMLBinder.class) instanceof XMLBinder);
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/inheritance/JAXBInheritanceTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/inheritance/JAXBInheritanceTestCases.java
index 5ca6d80..d1e5607 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/inheritance/JAXBInheritanceTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/inheritance/JAXBInheritanceTestCases.java
@@ -14,18 +14,14 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.testing.jaxb.inheritance;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.List;
 
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
-import javax.xml.transform.Result;
-import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
 
-import org.eclipse.persistence.jaxb.json.JsonSchemaOutputResolver;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 
 public class JAXBInheritanceTestCases extends JAXBWithJSONTestCases {
@@ -85,7 +81,7 @@
         if(isUnmarshalTest()) {
             InputStream instream = ClassLoader.getSystemResourceAsStream(resourceName);
             StreamSource ss = new StreamSource(instream);
-            JAXBElement testObject = getJAXBUnmarshaller().unmarshal(ss, A.class);
+            JAXBElement<A> testObject = getJAXBUnmarshaller().unmarshal(ss, A.class);
             Object value = testObject.getValue();
             instream.close();
             assertTrue(value instanceof E);
@@ -98,7 +94,7 @@
             log(testObject.toString());
 
             JAXBElement controlObj = (JAXBElement)getControlObject();
-            JAXBElement testObj = testObject;
+            JAXBElement<A> testObj = testObject;
             compareJAXBElementObjects(controlObj, testObj);
         }
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmlattribute/MapCollectionToXmlAttribute.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmlattribute/MapCollectionToXmlAttribute.java
index 9f30ef1..800c810 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmlattribute/MapCollectionToXmlAttribute.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmlattribute/MapCollectionToXmlAttribute.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
@@ -41,8 +41,8 @@
             if(model.items.size() != items.size()) {
                 return false;
             }
-            Iterator items1 = model.items.iterator();
-            Iterator items2 = items.iterator();
+            Iterator<String> items1 = model.items.iterator();
+            Iterator<String> items2 = items.iterator();
             while(items1.hasNext()) {
                 if(!(items1.next().equals(items2.next()))) {
                     System.out.println("returning false");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmlelementwrapper/Hockey.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmlelementwrapper/Hockey.java
index bac3fcc..ad936bb 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmlelementwrapper/Hockey.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmlelementwrapper/Hockey.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
@@ -53,8 +53,8 @@
         if(h.team.size() != team.size()) {
             return false;
         }
-        Iterator teams1 = h.team.iterator();
-        Iterator teams2 = team.iterator();
+        Iterator<String> teams1 = h.team.iterator();
+        Iterator<String> teams2 = team.iterator();
         while(teams1.hasNext()) {
             if(!(teams1.next().equals(teams2.next()))) {
                 System.out.println("returning false");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmllist/Hockey.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmllist/Hockey.java
index f448649..b90ad82 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmllist/Hockey.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/javadoc/xmllist/Hockey.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
@@ -44,8 +44,8 @@
         if(example3.teams.size() != teams.size()) {
             return false;
         }
-        Iterator teams1 = example3.teams.iterator();
-        Iterator teams2 = teams.iterator();
+        Iterator<String> teams1 = example3.teams.iterator();
+        Iterator<String> teams2 = teams.iterator();
         while(teams1.hasNext()) {
             if(!(teams1.next().equals(teams2.next()))) {
                 System.out.println("returning false");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/complex/JAXBElementComplexTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/complex/JAXBElementComplexTestCases.java
index a2bdf88..e1b9104 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/complex/JAXBElementComplexTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/complex/JAXBElementComplexTestCases.java
@@ -31,7 +31,7 @@
     private final static String XML_RESOURCE = "org/eclipse/persistence/testing/jaxb/jaxbelement/complex/employee.xml";
     private final static String JSON_RESOURCE = "org/eclipse/persistence/testing/jaxb/jaxbelement/complex/employee.json";
     private final static String CONTROL_ELEMENT_NAME = "employee";
-    private final static Class targetClass = Object.class;
+    private final static Class<Object> targetClass = Object.class;
 
     public JAXBElementComplexTestCases(String name) throws Exception {
         super(name);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/ElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/ElementTestCases.java
index 2852b20..24d3226 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/ElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/ElementTestCases.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
@@ -40,7 +40,7 @@
             doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
             Element elm = doc.createElementNS("AGroupDef/annotation", "rootchild");
             elm.setTextContent("");
-            JAXBElement  obj = factory.createRoot(elm);
+            JAXBElement<Object> obj = factory.createRoot(elm);
             return obj;
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/TextNodeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/TextNodeTestCases.java
index 2b153da..0e5bc07 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/TextNodeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/TextNodeTestCases.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
@@ -14,7 +14,6 @@
 
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.parsers.DocumentBuilderFactory;
-import javax.xml.parsers.ParserConfigurationException;
 
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 import org.w3c.dom.Document;
@@ -42,7 +41,7 @@
             Element elm = doc.createElementNS(null, "abcdef");
             elm.setTextContent("thetext");
             Object value = elm;
-            JAXBElement  obj = factory.createDoc(value);
+            JAXBElement<Object> obj = factory.createDoc(value);
             return obj;
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/DocumentTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/DocumentTestCases.java
index 9795bcf..76b910b 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/DocumentTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/DocumentTestCases.java
@@ -14,19 +14,12 @@
 //     Denise Smith - October 2012
 package org.eclipse.persistence.testing.jaxb.jaxbelement.dom.nofactory;
 
-import javax.print.Doc;
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.Marshaller;
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilderFactory;
 
-import org.eclipse.persistence.oxm.XMLConstants;
+import javax.xml.namespace.QName;
+
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
-import org.eclipse.persistence.testing.jaxb.jaxbelement.dom.ObjectFactory;
 import org.w3c.dom.Document;
-import org.w3c.dom.Element;
 
 public class DocumentTestCases extends JAXBWithJSONTestCases{
 
@@ -48,7 +41,7 @@
         try {
 
             doc = parser.parse(this.getClass().getClassLoader().getResourceAsStream(XML_RESOURCE_ORIGINAL));
-            JAXBElement  obj = new JAXBElement<Object>(new QName("mynamespace", "mynewname"), Object.class, doc);
+            JAXBElement<Object> obj = new JAXBElement<Object>(new QName("mynamespace", "mynewname"), Object.class, doc);
             return obj;
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementEmptyTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementEmptyTestCases.java
index 8e3712c..138c09e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementEmptyTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementEmptyTestCases.java
@@ -14,10 +14,8 @@
 //     Denise Smith - October 2012
 package org.eclipse.persistence.testing.jaxb.jaxbelement.dom.nofactory;
 
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.Marshaller;
+
 import javax.xml.namespace.QName;
 import javax.xml.parsers.DocumentBuilderFactory;
 
@@ -46,7 +44,7 @@
             doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
             Element elm = doc.createElementNS("AGroupDef/annotation", "rootchild");
             elm.setTextContent("");
-            JAXBElement  obj = new JAXBElement<Object>(new QName("mynamespace", "mynewname"), Object.class, elm);
+            JAXBElement<Object> obj = new JAXBElement<Object>(new QName("mynamespace", "mynewname"), Object.class, elm);
             return obj;
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementFragmentTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementFragmentTestCases.java
index 291d688..5926a35 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementFragmentTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementFragmentTestCases.java
@@ -14,20 +14,12 @@
 //     Denise Smith - October 2012
 package org.eclipse.persistence.testing.jaxb.jaxbelement.dom.nofactory;
 
-import javax.print.Doc;
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
 import jakarta.xml.bind.Marshaller;
 import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilderFactory;
 
-import org.eclipse.persistence.jaxb.MarshallerProperties;
-import org.eclipse.persistence.oxm.XMLConstants;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
-import org.eclipse.persistence.testing.jaxb.jaxbelement.dom.ObjectFactory;
 import org.w3c.dom.Document;
-import org.w3c.dom.Element;
 
 public class ElementFragmentTestCases extends JAXBWithJSONTestCases{
 
@@ -49,7 +41,7 @@
         Document doc;
         try {
             doc = parser.parse(this.getClass().getClassLoader().getResourceAsStream(XML_RESOURCE_ORIGINAL));
-            JAXBElement  obj = new JAXBElement<Object>(new QName("mynamespace", "mynewname"), Object.class, doc.getDocumentElement());
+            JAXBElement<Object> obj = new JAXBElement<Object>(new QName("mynamespace", "mynewname"), Object.class, doc.getDocumentElement());
             return obj;
         } catch (Exception e) {
             fail("An exception was thrown.");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementNoNamespaceTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementNoNamespaceTestCases.java
index a3b68ea..88737d7 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementNoNamespaceTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementNoNamespaceTestCases.java
@@ -14,19 +14,12 @@
 //     Denise Smith - October 2012
 package org.eclipse.persistence.testing.jaxb.jaxbelement.dom.nofactory;
 
-import javax.print.Doc;
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.Marshaller;
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilderFactory;
 
-import org.eclipse.persistence.oxm.XMLConstants;
+import javax.xml.namespace.QName;
+
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
-import org.eclipse.persistence.testing.jaxb.jaxbelement.dom.ObjectFactory;
 import org.w3c.dom.Document;
-import org.w3c.dom.Element;
 
 public class ElementNoNamespaceTestCases extends JAXBWithJSONTestCases{
 
@@ -46,7 +39,7 @@
         Document doc;
         try {
             doc = parser.parse(this.getClass().getClassLoader().getResourceAsStream(XML_RESOURCE_ORIGINAL));
-            JAXBElement  obj = new JAXBElement<Object>(new QName("mynewname"), Object.class, doc.getDocumentElement());
+            JAXBElement<Object> obj = new JAXBElement<Object>(new QName("mynewname"), Object.class, doc.getDocumentElement());
             return obj;
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementSameNamespaceTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementSameNamespaceTestCases.java
index 4851ecb..c921ffb 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementSameNamespaceTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementSameNamespaceTestCases.java
@@ -14,19 +14,12 @@
 //     Denise Smith - October 2012
 package org.eclipse.persistence.testing.jaxb.jaxbelement.dom.nofactory;
 
-import javax.print.Doc;
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.Marshaller;
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilderFactory;
 
-import org.eclipse.persistence.oxm.XMLConstants;
+import javax.xml.namespace.QName;
+
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
-import org.eclipse.persistence.testing.jaxb.jaxbelement.dom.ObjectFactory;
 import org.w3c.dom.Document;
-import org.w3c.dom.Element;
 
 public class ElementSameNamespaceTestCases extends JAXBWithJSONTestCases{
 
@@ -46,7 +39,7 @@
         Document doc;
         try {
             doc = parser.parse(this.getClass().getClassLoader().getResourceAsStream(XML_RESOURCE_ORIGINAL));
-            JAXBElement  obj = new JAXBElement<Object>(new QName("namespace1", "mynewname"), Object.class, doc.getDocumentElement());
+            JAXBElement<Object> obj = new JAXBElement<Object>(new QName("namespace1", "mynewname"), Object.class, doc.getDocumentElement());
             return obj;
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementTestCases.java
index 67bd732..e122ced 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/dom/nofactory/ElementTestCases.java
@@ -14,19 +14,12 @@
 //     Denise Smith - October 2012
 package org.eclipse.persistence.testing.jaxb.jaxbelement.dom.nofactory;
 
-import javax.print.Doc;
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.Marshaller;
-import javax.xml.namespace.QName;
-import javax.xml.parsers.DocumentBuilderFactory;
 
-import org.eclipse.persistence.oxm.XMLConstants;
+import javax.xml.namespace.QName;
+
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
-import org.eclipse.persistence.testing.jaxb.jaxbelement.dom.ObjectFactory;
 import org.w3c.dom.Document;
-import org.w3c.dom.Element;
 
 public class ElementTestCases extends JAXBWithJSONTestCases{
 
@@ -46,7 +39,7 @@
         Document doc;
         try {
             doc = parser.parse(this.getClass().getClassLoader().getResourceAsStream(XML_RESOURCE_ORIGINAL));
-            JAXBElement  obj = new JAXBElement<Object>(new QName("mynamespace", "mynewname"), Object.class, doc.getDocumentElement());
+            JAXBElement<Object> obj = new JAXBElement<Object>(new QName("mynamespace", "mynewname"), Object.class, doc.getDocumentElement());
             return obj;
         } catch (Exception e) {
             e.printStackTrace();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/enumeration/JAXBElementEnumTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/enumeration/JAXBElementEnumTestCases.java
index 923b64d..a3c202e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/enumeration/JAXBElementEnumTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/enumeration/JAXBElementEnumTestCases.java
@@ -27,7 +27,7 @@
 public class JAXBElementEnumTestCases extends JAXBElementTestCases {
     private final static String XML_RESOURCE = "org/eclipse/persistence/testing/jaxb/jaxbelement/enum/coin.xml";
     private final static String JSON_RESOURCE = "org/eclipse/persistence/testing/jaxb/jaxbelement/enum/coin.json";
-    private final static Class targetClass = Coin.class;
+    private final static Class<Coin> targetClass = Coin.class;
 
     public JAXBElementEnumTestCases(String name) throws Exception {
         super(name);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/nil/JAXBElementNilTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/nil/JAXBElementNilTestCases.java
index 0bd3885..019b142 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/nil/JAXBElementNilTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/nil/JAXBElementNilTestCases.java
@@ -25,7 +25,7 @@
     private final static String XML_RESOURCE = "org/eclipse/persistence/testing/jaxb/jaxbelement/nil/employee.xml";
     private final static String JSON_RESOURCE = "org/eclipse/persistence/testing/jaxb/jaxbelement/nil/employee.json";
     private final static String CONTROL_ELEMENT_NAME = "employee-name";
-    private final static Class targetClass = String.class;
+    private final static Class<String> targetClass = String.class;
 
     public JAXBElementNilTestCases(String name) throws Exception {
         super(name);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/simple/JAXBElementSimpleTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/simple/JAXBElementSimpleTestCases.java
index 462c71c..dd38772 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/simple/JAXBElementSimpleTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/jaxbelement/simple/JAXBElementSimpleTestCases.java
@@ -25,7 +25,7 @@
     private final static String XML_RESOURCE = "org/eclipse/persistence/testing/jaxb/jaxbelement/simple/employee.xml";
     private final static String JSON_RESOURCE = "org/eclipse/persistence/testing/jaxb/jaxbelement/simple/employee.json";
     private final static String CONTROL_ELEMENT_NAME = "employee-name";
-    private final static Class targetClass = String.class;
+    private final static Class<String> targetClass = String.class;
 
     public JAXBElementSimpleTestCases(String name) throws Exception {
         super(name);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/JSONMarshalUnmarshalTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/JSONMarshalUnmarshalTestCases.java
index aeb9e8f..34d5f30 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/JSONMarshalUnmarshalTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/JSONMarshalUnmarshalTestCases.java
@@ -146,7 +146,7 @@
     public void generateJSONSchema(List<InputStream> controlSchemas) throws Exception {
         MyStreamSchemaOutputResolver outputResolver = new MyStreamSchemaOutputResolver();
 
-        Class theClass = getWriteControlObject().getClass();
+        Class<? extends Object> theClass = getWriteControlObject().getClass();
         if(theClass == JAXBElement.class){
              theClass = ((JAXBElement) getWriteControlObject()).getValue().getClass();
         }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementInheritanceTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementInheritanceTestCases.java
index 263fc51..63f20c2 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementInheritanceTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementInheritanceTestCases.java
@@ -48,7 +48,7 @@
 
     @Override
     public Object getReadControlObject() {
-        JAXBElement jbe = new JAXBElement<AddressNoRoot>(new QName(""), AddressNoRoot.class, (AddressNoRoot)getControlObject());
+        JAXBElement<AddressNoRoot> jbe = new JAXBElement<AddressNoRoot>(new QName(""), AddressNoRoot.class, (AddressNoRoot)getControlObject());
         return jbe;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementJAXBElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementJAXBElementTestCases.java
index 4a404e9..cbc1464 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementJAXBElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementJAXBElementTestCases.java
@@ -40,20 +40,20 @@
 
     @Override
     public Object getReadControlObject() {
-        JAXBElement jbe = new JAXBElement<AddressNoRoot>(new QName("street"), AddressNoRoot.class, new AddressNoRoot());
+        JAXBElement<AddressNoRoot> jbe = new JAXBElement<AddressNoRoot>(new QName("street"), AddressNoRoot.class, new AddressNoRoot());
         return jbe;
     }
 
 
     @Override
     protected Object getJSONReadControlObject() {
-        JAXBElement jbe = new JAXBElement<AddressNoRoot>(new QName(""), AddressNoRoot.class, getAddress());
+        JAXBElement<AddressNoRoot> jbe = new JAXBElement<AddressNoRoot>(new QName(""), AddressNoRoot.class, getAddress());
         return jbe;
     }
 
     @Override
     protected Object getControlObject() {
-        JAXBElement jbe = new JAXBElement<AddressNoRoot>(new QName(""), AddressNoRoot.class, getAddress());
+        JAXBElement<AddressNoRoot> jbe = new JAXBElement<AddressNoRoot>(new QName(""), AddressNoRoot.class, getAddress());
         return jbe;
 
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementTestCases.java
index 3fc7b9f..9950a81 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/JSONAttributeNoXmlRootElementTestCases.java
@@ -18,7 +18,6 @@
 import javax.xml.namespace.QName;
 import javax.xml.transform.stream.StreamSource;
 
-import org.eclipse.persistence.jaxb.JAXBUnmarshaller;
 import org.eclipse.persistence.jaxb.UnmarshallerProperties;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 
@@ -42,14 +41,14 @@
 
     @Override
     public Object getReadControlObject() {
-        JAXBElement jbe = new JAXBElement<AddressNoRoot>(new QName("street"), AddressNoRoot.class, new AddressNoRoot());
+        JAXBElement<AddressNoRoot> jbe = new JAXBElement<AddressNoRoot>(new QName("street"), AddressNoRoot.class, new AddressNoRoot());
         return jbe;
     }
 
 
     @Override
     protected Object getJSONReadControlObject() {
-        JAXBElement jbe = new JAXBElement<AddressNoRoot>(new QName(""), AddressNoRoot.class, (AddressNoRoot) getControlObject());
+        JAXBElement<AddressNoRoot> jbe = new JAXBElement<AddressNoRoot>(new QName(""), AddressNoRoot.class, (AddressNoRoot) getControlObject());
         return jbe;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/SimpleBeanAttrNullTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/SimpleBeanAttrNullTestCases.java
index ff3d6bd..070f537 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/SimpleBeanAttrNullTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/attribute/SimpleBeanAttrNullTestCases.java
@@ -16,9 +16,7 @@
 
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
-import javax.xml.transform.stream.StreamSource;
 
-import org.eclipse.persistence.jaxb.JAXBUnmarshaller;
 import org.eclipse.persistence.jaxb.MarshallerProperties;
 import org.eclipse.persistence.jaxb.UnmarshallerProperties;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
@@ -47,14 +45,14 @@
 
     @Override
     public Object getReadControlObject() {
-        JAXBElement jbe = new JAXBElement<SimpleBean>(new QName("simpleBean"), SimpleBean.class, new SimpleBean());
+        JAXBElement<SimpleBean> jbe = new JAXBElement<SimpleBean>(new QName("simpleBean"), SimpleBean.class, new SimpleBean());
         return jbe;
     }
 
 
     @Override
     protected Object getJSONReadControlObject() {
-        JAXBElement jbe = new JAXBElement<SimpleBean>(new QName(""), SimpleBean.class,  new SimpleBean());
+        JAXBElement<SimpleBean> jbe = new JAXBElement<SimpleBean>(new QName(""), SimpleBean.class,  new SimpleBean());
         return jbe;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/emptyroot/EmptyNullMarshalUnmarshalTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/emptyroot/EmptyNullMarshalUnmarshalTestCases.java
index fc3cd27..970532f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/emptyroot/EmptyNullMarshalUnmarshalTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/emptyroot/EmptyNullMarshalUnmarshalTestCases.java
@@ -62,7 +62,7 @@
 
     public void testJAXBElementNullValueIncludeRootTrue() throws Exception{
         StringWriter sw = new StringWriter();
-        JAXBElement obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, null );
+        JAXBElement<Object> obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, null );
         Marshaller m = ctx.createMarshaller();
         m.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);
         m.marshal(obj, sw);
@@ -71,7 +71,7 @@
 
     public void testJAXBElementNullValueIncludeRootFalse() throws Exception{
         StringWriter sw = new StringWriter();
-        JAXBElement obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, null );
+        JAXBElement<Object> obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, null );
 
         Marshaller m = ctx.createMarshaller();
         m.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
@@ -81,7 +81,7 @@
 
     public void testJAXBElementEmptyValueIncludeRootTrue() throws Exception{
         StringWriter sw = new StringWriter();
-        JAXBElement obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
+        JAXBElement<Object> obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
         Marshaller m = ctx.createMarshaller();
         m.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);
         m.marshal(obj, sw);
@@ -91,7 +91,7 @@
 
     public void testJAXBElementEmptyValueIncludeRootFalse() throws Exception{
         StringWriter sw = new StringWriter();
-        JAXBElement obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
+        JAXBElement<Object> obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
 
         Marshaller m = ctx.createMarshaller();
         m.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
@@ -102,7 +102,7 @@
 
     public void testJAXBElementEmptyValueNoRootIncludeRootTrue() throws Exception{
         StringWriter sw = new StringWriter();
-        JAXBElement obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new RootNoXmlRootElement() );
+        JAXBElement<Object> obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new RootNoXmlRootElement() );
         Marshaller m = ctxNoRoot.createMarshaller();
         m.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, true);
         m.marshal(obj, sw);
@@ -112,7 +112,7 @@
 
     public void testJAXBElementEmptyValueNoRootIncludeRootFalse() throws Exception{
         StringWriter sw = new StringWriter();
-        JAXBElement obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new RootNoXmlRootElement() );
+        JAXBElement<Object> obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new RootNoXmlRootElement() );
 
         Marshaller m = ctxNoRoot.createMarshaller();
         m.setProperty(MarshallerProperties.JSON_INCLUDE_ROOT, false);
@@ -160,8 +160,8 @@
 
     public void testListJAXBElementIncludeRootTrue() throws Exception{
         StringWriter sw = new StringWriter();
-        JAXBElement obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
-        JAXBElement obj2 = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
+        JAXBElement<Object> obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
+        JAXBElement<Object> obj2 = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
         List theList = new ArrayList();
         theList.add(obj);
         theList.add(obj2);
@@ -174,8 +174,8 @@
 
     public void testListJAXBElementIncludeRootFalse() throws Exception{
         StringWriter sw = new StringWriter();
-        JAXBElement obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
-        JAXBElement obj2 = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
+        JAXBElement<Object> obj = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
+        JAXBElement<Object> obj2 = new JAXBElement<Object>(new QName(XMLConstants.EMPTY_STRING),Object.class, new Root() );
         List theList = new ArrayList();
         theList.add(obj);
         theList.add(obj2);
@@ -308,7 +308,7 @@
         Unmarshaller unmarshaller = ctx.createUnmarshaller();
         unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, true);
         StringReader reader = new StringReader("[{}]");
-        JAXBElement o = unmarshaller.unmarshal(new StreamSource(reader), Root.class);
+        JAXBElement<Root> o = unmarshaller.unmarshal(new StreamSource(reader), Root.class);
         //assertTrue (o instanceof JAXBElement);
         //JAXBElement controlObj = new JAXBElement(new QName(XMLConstants.EMPTY_STRING),Root.class, new Root() );
         //compareJAXBElementObjects(controlObj, (JAXBElement)o);
@@ -329,7 +329,7 @@
         Unmarshaller unmarshaller = ctx.createUnmarshaller();
         unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false);
         StringReader reader = new StringReader("[{}]");
-        JAXBElement o = unmarshaller.unmarshal(new StreamSource(reader),Root.class);
+        JAXBElement<Root> o = unmarshaller.unmarshal(new StreamSource(reader),Root.class);
 
         assertTrue(o.getDeclaredType().equals(Root.class));
         assertTrue(o.getName().equals(new QName("")));
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/IncludeRootFalseWithXMLRootElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/IncludeRootFalseWithXMLRootElementTestCases.java
index 17df0ac..64ff57a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/IncludeRootFalseWithXMLRootElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/IncludeRootFalseWithXMLRootElementTestCases.java
@@ -60,7 +60,7 @@
     @Override
     public Object getReadControlObject(){
         QName name = new QName("");
-        JAXBElement jbe = new JAXBElement<AddressWithRootElement>(name, AddressWithRootElement.class, (AddressWithRootElement)getControlObject());
+        JAXBElement<AddressWithRootElement> jbe = new JAXBElement<AddressWithRootElement>(name, AddressWithRootElement.class, (AddressWithRootElement)getControlObject());
         return jbe;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/IncludeRootTrueWithXMLRootElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/IncludeRootTrueWithXMLRootElementTestCases.java
index f445859..3ed4b80 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/IncludeRootTrueWithXMLRootElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/IncludeRootTrueWithXMLRootElementTestCases.java
@@ -44,7 +44,7 @@
     @Override
     public Object getReadControlObject() {
         QName name = new QName("addressWithRootElement");
-        JAXBElement jbe = new JAXBElement<AddressWithRootElement>(name, AddressWithRootElement.class, (AddressWithRootElement)getControlObject());
+        JAXBElement<AddressWithRootElement> jbe = new JAXBElement<AddressWithRootElement>(name, AddressWithRootElement.class, (AddressWithRootElement)getControlObject());
         return jbe;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/NoRootElementNSTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/NoRootElementNSTestCases.java
index 297b0dd..6122fd3 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/NoRootElementNSTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/NoRootElementNSTestCases.java
@@ -51,7 +51,7 @@
     @Override
     public Object getReadControlObject(){
         QName name = new QName("");
-        JAXBElement jbe = new JAXBElement<Address>(name, Address.class, (Address)getControlObject());
+        JAXBElement<Address> jbe = new JAXBElement<Address>(name, Address.class, (Address)getControlObject());
         return jbe;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/NoRootElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/NoRootElementTestCases.java
index e19d132..4cc0e22 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/NoRootElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/norootelement/NoRootElementTestCases.java
@@ -49,7 +49,7 @@
     @Override
     public Object getReadControlObject(){
         QName name = new QName("addressWithRootElement");
-        JAXBElement jbe = new JAXBElement<Address>(name, Address.class, (Address)getControlObject());
+        JAXBElement<Address> jbe = new JAXBElement<Address>(name, Address.class, (Address)getControlObject());
         return jbe;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/rootlevellist/WithoutXmlRootElementArrayTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/rootlevellist/WithoutXmlRootElementArrayTestCases.java
index deaf6d9..3f6cb30 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/rootlevellist/WithoutXmlRootElementArrayTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/rootlevellist/WithoutXmlRootElementArrayTestCases.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
@@ -19,9 +19,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
-import java.util.LinkedHashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.UUID;
 
 import jakarta.xml.bind.JAXBElement;
@@ -76,7 +74,7 @@
     public void testUnmarshal() throws Exception {
         InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(controlJSONLocation);
         Collection<WithoutXmlRootElementRoot>  test = (Collection<WithoutXmlRootElementRoot>) jsonUnmarshaller.unmarshal(new StreamSource(inputStream), WithoutXmlRootElementRoot.class).getValue();
-        Iterator testIter = test.iterator();
+        Iterator<WithoutXmlRootElementRoot> testIter = test.iterator();
         inputStream.close();
         Collection<WithoutXmlRootElementRoot> control = getReadControlObject().getValue();
         Iterator<WithoutXmlRootElementRoot> controlIter = control.iterator();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/rootlevellist/WithoutXmlRootElementSetTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/rootlevellist/WithoutXmlRootElementSetTestCases.java
index 16969ab..c69d659 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/rootlevellist/WithoutXmlRootElementSetTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/json/rootlevellist/WithoutXmlRootElementSetTestCases.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
@@ -71,7 +71,7 @@
     public void testUnmarshal() throws Exception {
         InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream(controlJSONLocation);
         Collection<WithoutXmlRootElementRoot>  test = (Collection<WithoutXmlRootElementRoot>) jsonUnmarshaller.unmarshal(new StreamSource(inputStream), WithoutXmlRootElementRoot.class).getValue();
-        Iterator testIter = test.iterator();
+        Iterator<WithoutXmlRootElementRoot> testIter = test.iterator();
         inputStream.close();
         Collection<WithoutXmlRootElementRoot> control = getControlObject();
         Iterator<WithoutXmlRootElementRoot> controlIter = control.iterator();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/JAXBListOfObjectsNonRootTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/JAXBListOfObjectsNonRootTestCases.java
index 052cd53..86cd684 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/JAXBListOfObjectsNonRootTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/JAXBListOfObjectsNonRootTestCases.java
@@ -162,7 +162,7 @@
         test.add("ccc");
         listofObjects.setStringMyList(test);
 
-        LinkedList stringQueue = new LinkedList<String>();
+        LinkedList<String> stringQueue = new LinkedList<String>();
         stringQueue.add("ddd");
         stringQueue.add("eee");
         listofObjects.setStringQueue(stringQueue);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullContainerTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullContainerTestCases.java
index c190a4c..9862d74 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullContainerTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullContainerTestCases.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
@@ -26,6 +26,7 @@
 import org.w3c.dom.Document;
 
 import junit.framework.TestCase;
+import org.w3c.dom.Node;
 
 public class NullContainerTestCases extends TestCase {
 
@@ -46,7 +47,7 @@
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
         Document document = db.newDocument();
-        Binder binder = jc.createBinder();
+        Binder<Node> binder = jc.createBinder();
         binder.marshal(ncr, document);
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullIteratorListTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullIteratorListTestCases.java
index b7eefc6..db1bc9f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullIteratorListTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullIteratorListTestCases.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
@@ -26,6 +26,7 @@
 import org.w3c.dom.Document;
 
 import junit.framework.TestCase;
+import org.w3c.dom.Node;
 
 public class NullIteratorListTestCases extends TestCase {
 
@@ -52,7 +53,7 @@
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
         Document document = db.newDocument();
-        Binder binder = jc.createBinder();
+        Binder<Node> binder = jc.createBinder();
         binder.marshal(nilr, document);
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullSetsMapTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullSetsMapTestCases.java
index ec0bce9..4757690 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullSetsMapTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/listofobjects/NullSetsMapTestCases.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
@@ -27,6 +27,7 @@
 import org.w3c.dom.Document;
 
 import junit.framework.TestCase;
+import org.w3c.dom.Node;
 
 public class NullSetsMapTestCases extends TestCase {
 
@@ -49,7 +50,7 @@
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
         Document document = db.newDocument();
-        Binder binder = jc.createBinder();
+        Binder<Node> binder = jc.createBinder();
         binder.marshal(nsmr, document);
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/nomappings/NoMappingsTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/nomappings/NoMappingsTestCases.java
index d638a70..0862ccb 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/nomappings/NoMappingsTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/nomappings/NoMappingsTestCases.java
@@ -45,13 +45,13 @@
 
     @Override
     public Object getJSONReadControlObject() {
-        JAXBElement jbe = new JAXBElement<SomeClass>(new QName(""), SomeClass.class, new SomeClass());
+        JAXBElement<SomeClass> jbe = new JAXBElement<SomeClass>(new QName(""), SomeClass.class, new SomeClass());
         return jbe;
     }
 
     @Override
     public Object getReadControlObject() {
-        JAXBElement jbe = new JAXBElement<SomeClass>(new QName("someClass"), SomeClass.class, new SomeClass());
+        JAXBElement<SomeClass> jbe = new JAXBElement<SomeClass>(new QName("someClass"), SomeClass.class, new SomeClass());
         return jbe;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/rs/JAXBElementsGenericListTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/rs/JAXBElementsGenericListTestCases.java
index 14b991f..9fa7f7d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/rs/JAXBElementsGenericListTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/rs/JAXBElementsGenericListTestCases.java
@@ -28,8 +28,6 @@
 import junit.framework.TestCase;
 
 import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider;
-import org.eclipse.persistence.testing.jaxb.rs.model.Bar;
-import org.eclipse.persistence.testing.jaxb.rs.model.Foo;
 
 /**
  * Tests {@code List<JAXBElement<String>>} marshal/unmarshal via MOXyJsonPrivder.
@@ -81,8 +79,8 @@
         }
 
         for (int i = 0; i < list1.size(); i++) {
-            JAXBElement element1 = list1.get(i);
-            JAXBElement element2 = list2.get(i);
+            JAXBElement<String> element1 = list1.get(i);
+            JAXBElement<String> element2 = list2.get(i);
 
             if (!equalsJAXBElements(element1, element2)) {
                 return false;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentByteArrayTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentByteArrayTestCases.java
index ee6fbf5..3acd495 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentByteArrayTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentByteArrayTestCases.java
@@ -14,7 +14,6 @@
 // mmacivor - April 25/2008 - 1.0M8 - Initial implementation
 package org.eclipse.persistence.testing.jaxb.simpledocument;
 
-import org.eclipse.persistence.testing.jaxb.JAXBTestCases;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 
 import jakarta.xml.bind.JAXBElement;
@@ -39,7 +38,7 @@
 
         @Override
         protected Object getControlObject() {
-            JAXBElement value = new ByteArrayObjectFactory().createBase64Root();
+            JAXBElement<Byte[]> value = new ByteArrayObjectFactory().createBase64Root();
             value.setValue(new Byte[]{(byte) 1, (byte) 2, (byte) 3, (byte) 4, (byte) 5, (byte) 6, (byte) 7});
             return value;
         }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentDateTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentDateTestCases.java
index 9d5e2bc..0678e8e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentDateTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentDateTestCases.java
@@ -17,7 +17,6 @@
 import java.io.StringReader;
 import java.util.Calendar;
 import java.util.Date;
-import java.util.TimeZone;
 
 import jakarta.xml.bind.JAXBElement;
 
@@ -66,7 +65,7 @@
 
         @Override
         protected Object getControlObject() {
-        JAXBElement value = new DateObjectFactory().createDateRoot();
+        JAXBElement<Date> value = new DateObjectFactory().createDateRoot();
 
         Calendar cal = Calendar.getInstance();
         cal.clear();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentIntegerTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentIntegerTestCases.java
index ca306d2..c8d2b40 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentIntegerTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentIntegerTestCases.java
@@ -42,7 +42,7 @@
 
         @Override
         protected Object getControlObject() {
-            JAXBElement value = new IntegerObjectFactory().createIntegerRoot();
+            JAXBElement<Integer> value = new IntegerObjectFactory().createIntegerRoot();
             value.setValue(27);
             return value;
         }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentStringTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentStringTestCases.java
index 4fef127..3421dd2 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentStringTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/SimpleDocumentStringTestCases.java
@@ -42,7 +42,7 @@
 
         @Override
         protected Object getControlObject() {
-            JAXBElement value = new StringObjectFactory().createStringRoot();
+            JAXBElement<String> value = new StringObjectFactory().createStringRoot();
             value.setValue("StringValue");
             return value;
         }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/StringEmptyElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/StringEmptyElementTestCases.java
index 7e7f511..698739c 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/StringEmptyElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/StringEmptyElementTestCases.java
@@ -33,7 +33,7 @@
 
     @Override
     protected Object getControlObject() {
-        JAXBElement value = new StringObjectFactory().createStringRoot();
+        JAXBElement<String> value = new StringObjectFactory().createStringRoot();
         value.setValue("");
         return value;
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/StringNilTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/StringNilTestCases.java
index 8c2ea74..92b883a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/StringNilTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/simpledocument/StringNilTestCases.java
@@ -38,7 +38,7 @@
 
     @Override
     protected Object getControlObject() {
-        JAXBElement value = new StringObjectFactory().createStringRoot();
+        JAXBElement<String> value = new StringObjectFactory().createStringRoot();
         value.setValue(null);
         value.setNil(true);
         return value;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/sun/xmllocation/Data.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/sun/xmllocation/Data.java
index b018a78..0bee8c3 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/sun/xmllocation/Data.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/sun/xmllocation/Data.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
@@ -53,8 +53,8 @@
         }
 
         String subDataS = "\n";
-        for (Iterator iterator = subData.iterator(); iterator.hasNext();) {
-            SubData type = (SubData) iterator.next();
+        for (Iterator<SubData> iterator = subData.iterator(); iterator.hasNext();) {
+            SubData type = iterator.next();
             subDataS += "\t" + type.toString() + "\n";
         }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/sun/xmllocation/DataNT.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/sun/xmllocation/DataNT.java
index 573cca5..32eae49 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/sun/xmllocation/DataNT.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/sun/xmllocation/DataNT.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
@@ -51,8 +51,8 @@
         }
 
         String subDataS = "\n";
-        for (Iterator iterator = subData.iterator(); iterator.hasNext();) {
-            SubDataNT type = (SubDataNT) iterator.next();
+        for (Iterator<SubDataNT> iterator = subData.iterator(); iterator.hasNext();) {
+            SubDataNT type = iterator.next();
             subDataS += "\t" + type.toString() + "\n";
         }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/ByteArrayTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/ByteArrayTestCases.java
index 2f239e2..d8c24ca 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/ByteArrayTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/ByteArrayTestCases.java
@@ -81,7 +81,7 @@
     }
 
     public void testTypeMappingInfoToSchemaType() throws Exception{
-        Map theMap =((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getTypeMappingInfoToSchemaType();
+        Map<TypeMappingInfo, QName> theMap =((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getTypeMappingInfoToSchemaType();
         assertNotNull(theMap);
         assertEquals(1, theMap.size());
         assertNotNull(theMap.get(getTypeMappingInfos()[0]));
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/DefaultTargetNamespaceConflictTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/DefaultTargetNamespaceConflictTestCases.java
index d2a655c..b41f7ad 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/DefaultTargetNamespaceConflictTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/DefaultTargetNamespaceConflictTestCases.java
@@ -89,10 +89,10 @@
         jaxbMarshaller.marshal(otherThing, sw);
 
         InputSource is = new InputSource(new StringReader(sw.toString()));
-        Node doc = parser.parse(is);
+        Document doc = parser.parse(is);
         assertNotNull(doc);
         assertTrue(doc instanceof Document);
-        Element root = ((Document)doc).getDocumentElement();
+        Element root = doc.getDocumentElement();
         assertEquals("namespace1",root.getNamespaceURI());
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/DefaultTargetNamespaceTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/DefaultTargetNamespaceTestCases.java
index 8363431..f7ac488 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/DefaultTargetNamespaceTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/DefaultTargetNamespaceTestCases.java
@@ -21,7 +21,6 @@
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
-import org.eclipse.persistence.jaxb.JAXBContextFactory;
 import org.eclipse.persistence.jaxb.JAXBContextProperties;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
@@ -61,7 +60,7 @@
         cust.lastName = "Doe";
         cust.phoneNumber = "123-456-7890";
 
-        JAXBElement elem = new JAXBElement<Customer>(new QName("overridden/namespace", "customer"), Customer.class, cust);
+        JAXBElement<Customer> elem = new JAXBElement<Customer>(new QName("overridden/namespace", "customer"), Customer.class, cust);
         return elem;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/IntegerArrayTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/IntegerArrayTestCases.java
index 2a4b2e0..c58e3f6 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/IntegerArrayTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/IntegerArrayTestCases.java
@@ -82,7 +82,7 @@
     }
 
     public void testTypeMappingInfoToSchemaType() throws Exception{
-        Map theMap =((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getTypeMappingInfoToSchemaType();
+        Map<TypeMappingInfo, QName> theMap =((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getTypeMappingInfoToSchemaType();
         assertNotNull(theMap);
         assertEquals(1, theMap.size());
         assertNotNull(theMap.get(getTypeMappingInfos()[0]));
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/MapStringIntegerTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/MapStringIntegerTestCases.java
index 4fd980c..b3bf604 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/MapStringIntegerTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/MapStringIntegerTestCases.java
@@ -84,7 +84,7 @@
     }
 
     public void testTypeMappingInfoToSchemaType() throws Exception{
-        Map theMap =((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getTypeMappingInfoToSchemaType();
+        Map<TypeMappingInfo, QName> theMap =((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getTypeMappingInfoToSchemaType();
         assertNotNull(theMap);
         assertEquals(1, theMap.size());
         assertNotNull(theMap.get(getTypeMappingInfos()[0]));
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/PrimitiveByteArrayTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/PrimitiveByteArrayTestCases.java
index a704152..879c00a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/PrimitiveByteArrayTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/PrimitiveByteArrayTestCases.java
@@ -79,7 +79,7 @@
     }
 
     public void testTypeMappingInfoToSchemaType() throws Exception {
-        Map theMap = ((org.eclipse.persistence.jaxb.JAXBContext) jaxbContext).getTypeMappingInfoToSchemaType();
+        Map<TypeMappingInfo, QName> theMap = ((org.eclipse.persistence.jaxb.JAXBContext) jaxbContext).getTypeMappingInfoToSchemaType();
         assertNotNull(theMap);
         assertEquals(1, theMap.size());
         assertNotNull(theMap.get(getTypeMappingInfos()[0]));
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingByteArrayTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingByteArrayTestCases.java
index ccabe03..891796d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingByteArrayTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingByteArrayTestCases.java
@@ -22,6 +22,7 @@
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoWithJSONTestCases;
@@ -96,7 +97,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(1, descriptors.size());
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingCollectionTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingCollectionTestCases.java
index a36aaf6..7e90eac 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingCollectionTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingCollectionTestCases.java
@@ -24,6 +24,7 @@
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.MarshallerProperties;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
@@ -134,7 +135,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(1, descriptors.size());
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListClassAndTypeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListClassAndTypeTestCases.java
index 4d94b63..a2654e1 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListClassAndTypeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListClassAndTypeTestCases.java
@@ -23,6 +23,7 @@
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.Employee;
@@ -108,7 +109,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(2, descriptors.size());
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListObjectsTypeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListObjectsTypeTestCases.java
index 1af72b8..fb884b1 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListObjectsTypeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListObjectsTypeTestCases.java
@@ -23,6 +23,7 @@
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.Employee;
@@ -107,7 +108,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(2, descriptors.size());
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListTypeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListTypeTestCases.java
index 007a813..88ca501 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListTypeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingListTypeTestCases.java
@@ -25,12 +25,11 @@
 import jakarta.xml.bind.annotation.XmlList;
 import javax.xml.namespace.QName;
 
-import org.eclipse.persistence.jaxb.JAXBContextFactory;
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.JAXBContextProperties;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.Employee;
-import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoTestCases;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoWithJSONTestCases;
 import org.w3c.dom.Element;
 
@@ -141,7 +140,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(4, descriptors.size());
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingMapsTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingMapsTestCases.java
index 1dd50ed..3b8cd16 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingMapsTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingMapsTestCases.java
@@ -22,10 +22,10 @@
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoTestCases;
-import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoWithJSONTestCases;
 
 public class ConflictingMapsTestCases extends TypeMappingInfoTestCases{
 
@@ -125,7 +125,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(10, descriptors.size());
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingStringArrayClassesTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingStringArrayClassesTestCases.java
index b51d286..6e23562 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingStringArrayClassesTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingStringArrayClassesTestCases.java
@@ -22,9 +22,9 @@
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
-import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoTestCases;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoWithJSONTestCases;
 
 public class ConflictingStringArrayClassesTestCases extends TypeMappingInfoWithJSONTestCases{
@@ -97,7 +97,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(1, descriptors.size());
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingStringClassTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingStringClassTestCases.java
index 17afe4c..5b13d69 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingStringClassTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/ConflictingStringClassTestCases.java
@@ -22,9 +22,9 @@
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
-import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoTestCases;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoWithJSONTestCases;
 
 public class ConflictingStringClassTestCases extends TypeMappingInfoWithJSONTestCases{
@@ -89,7 +89,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(1, descriptors.size());
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/NonConflictingListClassAndTypeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/NonConflictingListClassAndTypeTestCases.java
index 5356cef..77d3b77 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/NonConflictingListClassAndTypeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/typemappinginfo/collisions/NonConflictingListClassAndTypeTestCases.java
@@ -19,14 +19,13 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.List;
 
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.jaxb.TypeMappingInfo;
 import org.eclipse.persistence.jaxb.TypeMappingInfo.ElementScope;
-import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoTestCases;
 import org.eclipse.persistence.testing.jaxb.typemappinginfo.TypeMappingInfoWithJSONTestCases;
 
 public class NonConflictingListClassAndTypeTestCases extends TypeMappingInfoWithJSONTestCases{
@@ -94,7 +93,7 @@
     }
 
     public void testDescriptorsSize(){
-        List descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
+        List<ClassDescriptor> descriptors = ((org.eclipse.persistence.jaxb.JAXBContext)jaxbContext).getXMLContext().getSession(0).getProject().getOrderedDescriptors();
         assertEquals(2, descriptors.size());
     }
 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/unmarshaller/autodetect/AutoDetectMediaTypeTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/unmarshaller/autodetect/AutoDetectMediaTypeTestCases.java
index 5102a7a..0a6991a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/unmarshaller/autodetect/AutoDetectMediaTypeTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/unmarshaller/autodetect/AutoDetectMediaTypeTestCases.java
@@ -18,22 +18,15 @@
 import java.io.InputStream;
 import java.util.ArrayList;
 
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.JAXBException;
-import jakarta.xml.bind.Unmarshaller;
+
 import javax.xml.namespace.QName;
 import javax.xml.stream.XMLStreamReader;
 import javax.xml.transform.stream.StreamSource;
 
 import org.eclipse.persistence.jaxb.UnmarshallerProperties;
 import org.eclipse.persistence.oxm.MediaType;
-import org.eclipse.persistence.testing.jaxb.JAXBTestCases;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
-import org.eclipse.persistence.testing.oxm.mappings.choicecollection.ref.Address;
-import org.eclipse.persistence.testing.oxm.mappings.choicecollection.ref.Employee;
-import org.eclipse.persistence.testing.oxm.mappings.choicecollection.ref.PhoneNumber;
-import org.eclipse.persistence.testing.oxm.mappings.choicecollection.ref.Root;
 
 public class AutoDetectMediaTypeTestCases extends JAXBWithJSONTestCases {
     private final static String XML_RESOURCE = "org/eclipse/persistence/testing/jaxb/unmarshaller/autodetect/employee-collection.xml";
@@ -117,7 +110,7 @@
         String systemId = file.toURI().toURL().toExternalForm();
 
         StreamSource ss = new StreamSource(systemId);
-        JAXBElement jbe = jaxbUnmarshaller.unmarshal(ss, EmployeeCollection.class);
+        JAXBElement<EmployeeCollection> jbe = jaxbUnmarshaller.unmarshal(ss, EmployeeCollection.class);
 
         jsonToObjectTest(jbe.getValue());
 
@@ -128,7 +121,7 @@
         String systemId = file.toURI().toURL().toExternalForm();
 
         StreamSource ss = new StreamSource(systemId);
-        JAXBElement jbe  = jaxbUnmarshaller.unmarshal(ss, EmployeeCollection.class);
+        JAXBElement<EmployeeCollection> jbe  = jaxbUnmarshaller.unmarshal(ss, EmployeeCollection.class);
         xmlToObjectTest(jbe.getValue());
 
     }
@@ -138,7 +131,7 @@
         String systemId = file.getAbsolutePath();
 
         StreamSource ss = new StreamSource(systemId);
-        JAXBElement jbe = jaxbUnmarshaller.unmarshal(ss, EmployeeCollection.class);
+        JAXBElement<EmployeeCollection> jbe = jaxbUnmarshaller.unmarshal(ss, EmployeeCollection.class);
 
         jsonToObjectTest(jbe.getValue());
 
@@ -149,7 +142,7 @@
         String systemId = file.getAbsolutePath();
 
         StreamSource ss = new StreamSource(systemId);
-        JAXBElement jbe  = jaxbUnmarshaller.unmarshal(ss, EmployeeCollection.class);
+        JAXBElement<EmployeeCollection> jbe  = jaxbUnmarshaller.unmarshal(ss, EmployeeCollection.class);
         xmlToObjectTest(jbe.getValue());
 
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/unmarshaller/space/UnmarshalWithSpaceEventTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/unmarshaller/space/UnmarshalWithSpaceEventTestCases.java
index 0ef9849..21d98be 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/unmarshaller/space/UnmarshalWithSpaceEventTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/unmarshaller/space/UnmarshalWithSpaceEventTestCases.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,7 +18,6 @@
 
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
-import javax.xml.stream.XMLInputFactory;
 import javax.xml.stream.XMLStreamReader;
 
 import org.eclipse.persistence.jaxb.UnmarshallerProperties;
@@ -50,7 +49,7 @@
                 InputStream instream = ClassLoader.getSystemResourceAsStream(resourceName);
                 XMLStreamReader xmlStreamReader = XML_INPUT_FACTORY.createXMLStreamReader(instream);
                 jaxbUnmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/xml");
-                JAXBElement testObject = jaxbUnmarshaller.unmarshal(xmlStreamReader, TestObject.class);
+                JAXBElement<TestObject> testObject = jaxbUnmarshaller.unmarshal(xmlStreamReader, TestObject.class);
                 instream.close();
                 xmlToObjectTest(testObject, getJAXBElementControlObject());
             }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/composite/MyHashMapAdapter.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/composite/MyHashMapAdapter.java
index d411f68..df7e192 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/composite/MyHashMapAdapter.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/composite/MyHashMapAdapter.java
@@ -38,9 +38,9 @@
 
     @Override
     public LinkedHashMap unmarshal(MyHashMapType arg0) throws Exception {
-        LinkedHashMap map = new LinkedHashMap<Integer, String>();
-        for (Iterator typeIt = arg0.entry.iterator(); typeIt.hasNext(); ) {
-            MyHashMapEntryType eType = (MyHashMapEntryType) typeIt.next();
+        LinkedHashMap<Integer, String> map = new LinkedHashMap<Integer, String>();
+        for (Iterator<MyHashMapEntryType> typeIt = arg0.entry.iterator(); typeIt.hasNext(); ) {
+            MyHashMapEntryType eType = typeIt.next();
             map.put(eType.key, eType.value);
         }
         return map;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/map/MyObjectAdapter.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/map/MyObjectAdapter.java
index 0091875..3dc0674 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/map/MyObjectAdapter.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmladapter/map/MyObjectAdapter.java
@@ -41,7 +41,7 @@
 
     @Override
     public HashMap<Integer, String> unmarshal(MyObject arg0) throws Exception {
-        HashMap theMap = new HashMap<Integer, String>();
+        HashMap<Integer, String> theMap = new HashMap<Integer, String>();
         List<String> keys = arg0.getKeys();
         List<String> values = arg0.getValues();
         for(int i=0; i<keys.size(); i++){
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlanyelement/EmployeeLaxCDATA.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlanyelement/EmployeeLaxCDATA.java
index 47c4119..b6495b5 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlanyelement/EmployeeLaxCDATA.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlanyelement/EmployeeLaxCDATA.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
@@ -49,12 +49,12 @@
 
         XMLComparer comparer = new XMLComparer();
 
-        Object next1 = element;
-        Object next2 =  emp.element;
+        Element next1 = element;
+        Element next2 =  emp.element;
 
         if((next1 instanceof Element) && (next2 instanceof Element)) {
-            Element nextElem1 = (Element)next1;
-            Element nextElem2 = (Element)next2;
+            Element nextElem1 = next1;
+            Element nextElem2 = next2;
             if(!(comparer.isNodeEqual(nextElem1, nextElem2))) {
                 return false;
             }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlanyelement/XmlAnyJAXBElementTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlanyelement/XmlAnyJAXBElementTestCases.java
index c776410..d88ff9e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlanyelement/XmlAnyJAXBElementTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlanyelement/XmlAnyJAXBElementTestCases.java
@@ -14,13 +14,10 @@
 //     Denise Smith - May 2013
 package org.eclipse.persistence.testing.jaxb.xmlanyelement;
 
-import java.io.InputStream;
 import java.util.ArrayList;
 
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.Marshaller;
-import jakarta.xml.bind.Unmarshaller;
+
 import javax.xml.namespace.QName;
 
 import org.eclipse.persistence.jaxb.MarshallerProperties;
@@ -63,9 +60,9 @@
         Thing thing3 = new Thing();
         thing3.name = "thing3name";
 
-        JAXBElement jb1 = new JAXBElement<Thing>(new QName("something"), Thing.class, thing1);
-        JAXBElement jb2 = new JAXBElement<Thing>(new QName("address"), Thing.class, thing2);
-        JAXBElement jb3 = new JAXBElement<Thing>(new QName("thing"), Thing.class, thing3);
+        JAXBElement<Thing> jb1 = new JAXBElement<Thing>(new QName("something"), Thing.class, thing1);
+        JAXBElement<Thing> jb2 = new JAXBElement<Thing>(new QName("address"), Thing.class, thing2);
+        JAXBElement<Thing> jb3 = new JAXBElement<Thing>(new QName("thing"), Thing.class, thing3);
 
         r.things.add(jb1);
         r.things.add(jb2);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlbindings/XMLBindingsPopulatedTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlbindings/XMLBindingsPopulatedTestCases.java
index 40e4d5f..317d0a2 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlbindings/XMLBindingsPopulatedTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlbindings/XMLBindingsPopulatedTestCases.java
@@ -167,12 +167,12 @@
         XmlElement javaAttribute = new XmlElement();
         javaAttribute.setName("elementName");
         javaAttribute.setJavaAttribute("theJavaAttributeValue");
-        JAXBElement jbe = new JAXBElement<XmlElement>(new QName("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-element"), XmlElement.class, javaAttribute);
+        JAXBElement<XmlElement> jbe = new JAXBElement<XmlElement>(new QName("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-element"), XmlElement.class, javaAttribute);
 
         XmlElement javaAttribute2 = new XmlElement();
         javaAttribute2.setName("elementName2");
         javaAttribute2.setJavaAttribute("theJavaAttributeValue2");
-        JAXBElement jbe2 = new JAXBElement<XmlElement>(new QName("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-element"), XmlElement.class, javaAttribute2);
+        JAXBElement<XmlElement> jbe2 = new JAXBElement<XmlElement>(new QName("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-element"), XmlElement.class, javaAttribute2);
 
         XmlAttribute javaAttribute3 = new XmlAttribute();
         javaAttribute3.setContainerType("someContainerType");
@@ -182,7 +182,7 @@
         javaAttribute3.setReadOnly(Boolean.TRUE);
         javaAttribute3.setRequired(Boolean.TRUE);
 
-        JAXBElement jbe3 = new JAXBElement<XmlAttribute>(new QName("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-attribute"), XmlAttribute.class, javaAttribute3);
+        JAXBElement<XmlAttribute> jbe3 = new JAXBElement<XmlAttribute>(new QName("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-attribute"), XmlAttribute.class, javaAttribute3);
         javaAttributes.getJavaAttribute().add(jbe);
 
         javaAttributes.getJavaAttribute().add(jbe3);
@@ -212,7 +212,7 @@
         //unmarshal from JSON
         StringReader sr = new StringReader(sw.toString());
         jaxbUnmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json");
-        JAXBElement jbe = jaxbUnmarshaller.unmarshal(new StreamSource(sr), XmlBindings.class);
+        JAXBElement<XmlBindings> jbe = jaxbUnmarshaller.unmarshal(new StreamSource(sr), XmlBindings.class);
         Object unmarshalledJSON = jbe.getValue();
 
         //marshal to XML again
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlbindings/XMLBindingsTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlbindings/XMLBindingsTestCases.java
index f1dc774..7e1dbed 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlbindings/XMLBindingsTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlbindings/XMLBindingsTestCases.java
@@ -53,7 +53,7 @@
         XmlElement javaAttribute = new XmlElement();
         javaAttribute.setName("elementName");
         javaAttribute.setJavaAttribute("theJavaAttributeValue");
-        JAXBElement jbe = new JAXBElement<XmlElement>(new QName("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-element"), XmlElement.class, javaAttribute);
+        JAXBElement<XmlElement> jbe = new JAXBElement<XmlElement>(new QName("http://www.eclipse.org/eclipselink/xsds/persistence/oxm", "xml-element"), XmlElement.class, javaAttribute);
         javaAttributes.getJavaAttribute().add(jbe);
         javaType.setJavaAttributes(javaAttributes);
         types.getJavaType().add(javaType);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelement/order/ElementOrderingTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelement/order/ElementOrderingTestCases.java
index 39c6f5d..f3549a6 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelement/order/ElementOrderingTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelement/order/ElementOrderingTestCases.java
@@ -44,13 +44,13 @@
 
     @Override
     protected Object getJSONReadControlObject() {
-        JAXBElement elem = new JAXBElement<AlbumInfo>(new QName(""), AlbumInfo.class, (AlbumInfo) getWriteControlObject());
+        JAXBElement<AlbumInfo> elem = new JAXBElement<AlbumInfo>(new QName(""), AlbumInfo.class, (AlbumInfo) getWriteControlObject());
         return elem;
     }
 
     @Override
     protected Object getControlObject() {
-        JAXBElement elem = new JAXBElement<AlbumInfo>(new QName("albumInfo"), AlbumInfo.class, (AlbumInfo) getWriteControlObject());
+        JAXBElement<AlbumInfo> elem = new JAXBElement<AlbumInfo>(new QName("albumInfo"), AlbumInfo.class, (AlbumInfo) getWriteControlObject());
         return elem;
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/ByteArrayCollectionTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/ByteArrayCollectionTestCases.java
index e72d1cb..eb1b4c0 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/ByteArrayCollectionTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/ByteArrayCollectionTestCases.java
@@ -17,11 +17,10 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.Unmarshaller;
+
 import javax.xml.namespace.QName;
-import org.eclipse.persistence.testing.jaxb.JAXBTestCases;
+
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 
 public class ByteArrayCollectionTestCases  extends JAXBWithJSONTestCases {
@@ -56,8 +55,8 @@
         byteArrayList2.add(bytes3);
         byteArrayList2.add(bytes4);
 
-        JAXBElement elem1 = new JAXBElement<List>(new QName("things"), List.class, byteArrayList);
-        JAXBElement elem2 = new JAXBElement<List>(new QName("things"), List.class, byteArrayList2);
+        JAXBElement<List> elem1 = new JAXBElement<List>(new QName("things"), List.class, byteArrayList);
+        JAXBElement<List> elem2 = new JAXBElement<List>(new QName("things"), List.class, byteArrayList2);
 
         theList.add(elem1);
         theList.add(elem2);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/EmployeeSingle.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/EmployeeSingle.java
index 4e191a0..9034552 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/EmployeeSingle.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/EmployeeSingle.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,8 +25,8 @@
     public JAXBElement<Integer> intRoot;
 
     public boolean equals(Object emp) {
-        JAXBElement root1 = this.intRoot;
-        JAXBElement root2 = ((EmployeeSingle)emp).intRoot;
+        JAXBElement<Integer> root1 = this.intRoot;
+        JAXBElement<Integer> root2 = ((EmployeeSingle)emp).intRoot;
 
         return root1.getName().equals(root2.getName()) && root1.getValue().equals(root2.getValue()) && root1.getDeclaredType() == root2.getDeclaredType();
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/XMLElementRefConverterTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/XMLElementRefConverterTestCases.java
index ec64b28..db22df0 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/XMLElementRefConverterTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/XMLElementRefConverterTestCases.java
@@ -15,7 +15,6 @@
 package org.eclipse.persistence.testing.jaxb.xmlelementref;
 
 import java.math.BigDecimal;
-import java.util.ArrayList;
 
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
@@ -44,7 +43,7 @@
         ComplexType.TestLocal testLocal = new ComplexType.TestLocal(bd);
         ct.setLocal(testLocal);
         QName qname = new QName("clazz/typeDef", "root");
-        JAXBElement jaxbElement = new JAXBElement<ComplexType>(qname, ComplexType.class, ct);
+        JAXBElement<ComplexType> jaxbElement = new JAXBElement<ComplexType>(qname, ComplexType.class, ct);
 
         return jaxbElement;
      }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/collections/ChoiceCollectionNullTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/collections/ChoiceCollectionNullTestCases.java
index adeea75..87d32eb 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/collections/ChoiceCollectionNullTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/collections/ChoiceCollectionNullTestCases.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,27 +14,20 @@
 //     Denise Smith - February 2012
 package org.eclipse.persistence.testing.jaxb.xmlelementref.collections;
 
-import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import jakarta.activation.DataHandler;
-import jakarta.xml.bind.JAXBContext;
 import jakarta.xml.bind.JAXBElement;
-import jakarta.xml.bind.Marshaller;
-import jakarta.xml.bind.Unmarshaller;
+
 import javax.xml.namespace.QName;
-import javax.xml.transform.stream.StreamSource;
 
 import org.eclipse.persistence.jaxb.MarshallerProperties;
 import org.eclipse.persistence.jaxb.UnmarshallerProperties;
 import org.eclipse.persistence.oxm.XMLConstants;
-import org.eclipse.persistence.testing.jaxb.JAXBTestCases;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
-import org.eclipse.persistence.testing.jaxb.xmlelementref.attachment.Employee;
-import org.eclipse.persistence.testing.jaxb.xmlelementref.attachment.ObjectFactory;
 
 public class ChoiceCollectionNullTestCases extends JAXBWithJSONTestCases{
     private final static String XML_RESOURCE = "org/eclipse/persistence/testing/jaxb/xmlelementref/choicecollectionnull.xml";
@@ -59,9 +52,9 @@
     protected Object getControlObject() {
         Wrapper wrapper = new Wrapper();
         List theList = new ArrayList();
-        JAXBElement jbe = new JAXBElement<DataHandler>(new QName("return"), DataHandler.class, null);
+        JAXBElement<DataHandler> jbe = new JAXBElement<DataHandler>(new QName("return"), DataHandler.class, null);
         theList.add(jbe);
-        JAXBElement jbe2 = new JAXBElement<DataHandler>(new QName("return"), DataHandler.class, null);
+        JAXBElement<DataHandler> jbe2 = new JAXBElement<DataHandler>(new QName("return"), DataHandler.class, null);
         theList.add(jbe2);
         wrapper.content = theList;
         return wrapper;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/collections/ChoiceCollectionTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/collections/ChoiceCollectionTestCases.java
index 632e454..66230d0 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/collections/ChoiceCollectionTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlelementref/collections/ChoiceCollectionTestCases.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 org.eclipse.persistence.jaxb.MarshallerProperties;
 import org.eclipse.persistence.jaxb.UnmarshallerProperties;
 import org.eclipse.persistence.oxm.XMLConstants;
-import org.eclipse.persistence.testing.jaxb.JAXBTestCases;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 
 public class ChoiceCollectionTestCases extends JAXBWithJSONTestCases{
@@ -52,9 +51,9 @@
     protected Object getControlObject() {
         Wrapper wrapper = new Wrapper();
         List theList = new ArrayList();
-        JAXBElement jbe = new JAXBElement<DataHandler>(new QName("return"), DataHandler.class, MyAttachmentUnmarshaller.theDataHandler);
+        JAXBElement<DataHandler> jbe = new JAXBElement<DataHandler>(new QName("return"), DataHandler.class, MyAttachmentUnmarshaller.theDataHandler);
         theList.add(jbe);
-        JAXBElement jbe2 = new JAXBElement<DataHandler>(new QName("return"), DataHandler.class, MyAttachmentUnmarshaller.theDataHandler);
+        JAXBElement<DataHandler> jbe2 = new JAXBElement<DataHandler>(new QName("return"), DataHandler.class, MyAttachmentUnmarshaller.theDataHandler);
         theList.add(jbe2);
         wrapper.content = theList;
         return wrapper;
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 d03833d..ac4dd1e 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
@@ -17,16 +17,15 @@
 import java.util.ArrayList;
 
 import jakarta.xml.bind.Binder;
-import jakarta.xml.bind.DatatypeConverter;
 import jakarta.xml.bind.JAXBElement;
 import javax.xml.namespace.QName;
 
 import org.eclipse.persistence.internal.oxm.Constants;
 import org.eclipse.persistence.internal.oxm.XMLConversionManager;
-import org.eclipse.persistence.platform.xml.XMLComparer;
 import org.eclipse.persistence.testing.jaxb.JAXBWithJSONTestCases;
 import org.eclipse.persistence.testing.jaxb.JAXBXMLComparer;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 
 public class XmlElementRefsAdapterTestCases extends JAXBWithJSONTestCases{
 
@@ -77,7 +76,7 @@
     }
 
     public void testBinder() throws Exception{
-        Binder binder = jaxbContext.createBinder();
+        Binder<Node> binder = jaxbContext.createBinder();
         Document doc = parser.parse(ClassLoader.getSystemResourceAsStream(XML_RESOURCE));
         Foo unmarshalled =  (Foo)binder.unmarshal(doc);
         byte[] bytes = XMLConversionManager.getDefaultXMLManager().convertObject("001122", byte[].class);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlidrefs/object/Employee.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlidrefs/object/Employee.java
index d115abc..31ac27a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlidrefs/object/Employee.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlidrefs/object/Employee.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
@@ -33,7 +33,7 @@
                 return false;
             }
             Employee testEmployee = (Employee) object;
-            List testEmployeePhones = testEmployee.phones;
+            List<Object> testEmployeePhones = testEmployee.phones;
             if(phones == null) {
                 return testEmployeePhones == null;
             }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlidrefs/object/Root.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlidrefs/object/Root.java
index 9465156..4981195 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlidrefs/object/Root.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlidrefs/object/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
@@ -40,7 +40,7 @@
             if(!employee.equals(testRoot.employee)) {
                 return false;
             }
-            List testRootPhoneNumbers = testRoot.phoneNumbers;
+            List<PhoneNumber> testRootPhoneNumbers = testRoot.phoneNumbers;
             if(phoneNumbers == null) {
                 return testRootPhoneNumbers == null;
             }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlmarshaller/ListenerTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlmarshaller/ListenerTestCases.java
index cf8c8e2..71d8412 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlmarshaller/ListenerTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlmarshaller/ListenerTestCases.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
@@ -34,11 +34,11 @@
 import javax.xml.stream.XMLStreamWriter;
 import javax.xml.transform.stream.StreamSource;
 
-import org.eclipse.persistence.jaxb.JAXBBinder;
 import org.eclipse.persistence.jaxb.JAXBContextFactory;
 import org.eclipse.persistence.testing.jaxb.xmlmarshaller.ListenerMarshal.MarshalEvent;
 import org.eclipse.persistence.testing.jaxb.xmlmarshaller.ListenerUnmarshal.UnmarshalEvent;
 import org.w3c.dom.Document;
+import org.w3c.dom.Node;
 import org.xml.sax.InputSource;
 import org.xml.sax.helpers.DefaultHandler;
 
@@ -558,7 +558,7 @@
 */
 
     public void testClassCallbacksForBinder() throws Exception {
-        Binder binder = jc.createBinder();
+        Binder<Node> binder = jc.createBinder();
 
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
         DocumentBuilder db = dbf.newDocumentBuilder();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/qualified/AttributeFormDefaultQualifiedTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/qualified/AttributeFormDefaultQualifiedTestCases.java
index ab6f575..ce67a79 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/qualified/AttributeFormDefaultQualifiedTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/qualified/AttributeFormDefaultQualifiedTestCases.java
@@ -43,7 +43,7 @@
         types[0] = Address.class;
         setTypes(types);
 
-        Map namespaces = new HashMap<String, String>();
+        Map<String, String> namespaces = new HashMap<>();
         namespaces.put("myns","ns0");
         jaxbMarshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, namespaces);
         jaxbUnmarshaller.setProperty(UnmarshallerProperties.JSON_NAMESPACE_PREFIX_MAPPER, namespaces);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/unqualified/AttributeFormDefaultUnqualifiedTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/unqualified/AttributeFormDefaultUnqualifiedTestCases.java
index a18511f..e5eb362 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/unqualified/AttributeFormDefaultUnqualifiedTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/unqualified/AttributeFormDefaultUnqualifiedTestCases.java
@@ -43,7 +43,7 @@
         types[0] = Address.class;
         setTypes(types);
 
-        Map namespaces = new HashMap<String, String>();
+        Map<String, String> namespaces = new HashMap<>();
         namespaces.put("myns","ns0");
         jaxbMarshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, namespaces);
         jaxbUnmarshaller.setProperty(UnmarshallerProperties.JSON_NAMESPACE_PREFIX_MAPPER, namespaces);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/unset/AttributeFormDefaultUnsetTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/unset/AttributeFormDefaultUnsetTestCases.java
index 83a6ca4..49d3ef8 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/unset/AttributeFormDefaultUnsetTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/jaxb/xmlschema/attributeformdefault/unset/AttributeFormDefaultUnsetTestCases.java
@@ -43,7 +43,7 @@
         types[0] = Address.class;
         setTypes(types);
 
-        Map namespaces = new HashMap<String, String>();
+        Map<String, String> namespaces = new HashMap<>();
         namespaces.put("myns","ns0");
         jaxbMarshaller.setProperty(MarshallerProperties.NAMESPACE_PREFIX_MAPPER, namespaces);
         jaxbUnmarshaller.setProperty(UnmarshallerProperties.JSON_NAMESPACE_PREFIX_MAPPER, namespaces);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/OXTestCase.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/OXTestCase.java
index db18a0f..0714109 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/OXTestCase.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/OXTestCase.java
@@ -145,10 +145,10 @@
 
     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();
+                ClassDescriptor nextDesc = iter.next();
                 if (nextDesc instanceof org.eclipse.persistence.oxm.XMLDescriptor) {
                     ((org.eclipse.persistence.oxm.XMLDescriptor)nextDesc).setShouldPreserveDocument(true);
                 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/XMLTestCase.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/XMLTestCase.java
index 11285eb..fa3c048 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/XMLTestCase.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/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
@@ -64,7 +64,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/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/ClassLoaderTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/ClassLoaderTestCases.java
index f338860..ba52c5d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/ClassLoaderTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/ClassLoaderTestCases.java
@@ -20,7 +20,6 @@
 import junit.textui.TestRunner;
 import org.w3c.dom.Document;
 import org.eclipse.persistence.oxm.*;
-import org.eclipse.persistence.sessions.Project;
 import org.eclipse.persistence.testing.oxm.OXTestCase;
 
 public class ClassLoaderTestCases extends OXTestCase {
@@ -48,30 +47,30 @@
 
     public void testEmployeeClassLoaderWithSessionPath() throws Exception {
         XMLContext employeeXMLContext = new XMLContext("classloader", employeeClassLoader, "org/eclipse/persistence/testing/oxm/classloader/mySessions.xml");
-        Class controlClass = employeeClassLoader.loadClass(EMPLOYEE_CLASS);
+        Class<?> controlClass = employeeClassLoader.loadClass(EMPLOYEE_CLASS);
         Document employeeDocument = parse(EMPLOYEE_XML_RESOURCE);
         XMLUnmarshaller unmarshaller = employeeXMLContext.createUnmarshaller();
         Object employeeObject = unmarshaller.unmarshal(employeeDocument);
-        Class testClass = employeeObject.getClass();
+        Class<? extends Object> testClass = employeeObject.getClass();
     }
 
     public void testEmployeeClassLoader() throws Exception {
         XMLContext employeeXMLContext = getXMLContext(new EmployeeProject(), employeeClassLoader);
-        Class controlClass = employeeClassLoader.loadClass(EMPLOYEE_CLASS);
+        Class<?> controlClass = employeeClassLoader.loadClass(EMPLOYEE_CLASS);
 
         Document employeeDocument = parse(EMPLOYEE_XML_RESOURCE);
         XMLUnmarshaller unmarshaller = employeeXMLContext.createUnmarshaller();
         Object employeeObject = unmarshaller.unmarshal(employeeDocument);
-        Class testClass = employeeObject.getClass();
+        Class<? extends Object> testClass = employeeObject.getClass();
     }
 
     public void testPhoneNumberClassLoader() throws Exception {
         XMLContext phoneNumberXMLContext = getXMLContext(new PhoneNumberProject(), phoneNumberClassLoader);
-        Class controlClass = phoneNumberClassLoader.loadClass(PHONE_NUMBER_CLASS);
+        Class<?> controlClass = phoneNumberClassLoader.loadClass(PHONE_NUMBER_CLASS);
         XMLUnmarshaller unmarshaller = phoneNumberXMLContext.createUnmarshaller();
         Document phoneNumberDocument = parse(PHONE_NUMBER_XML_RESOURCE);
         Object phoneNumberObject = unmarshaller.unmarshal(phoneNumberDocument);
-        Class testClass = phoneNumberObject.getClass();
+        Class<? extends Object> testClass = phoneNumberObject.getClass();
     }
 
     private Document parse(String xmlResource) throws Exception {
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/EmployeeProject.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/EmployeeProject.java
index 5b43eca..d20cd0a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/EmployeeProject.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/EmployeeProject.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
@@ -28,7 +28,7 @@
     private XMLDescriptor getEmployeeDescriptor() {
         try {
             ClassLoader employeeClassLoader = new JARClassLoader("org/eclipse/persistence/testing/oxm/classloader/Employee.jar");
-            Class employeeClass = employeeClassLoader.loadClass("org.eclipse.persistence.testing.oxm.classloader.Employee");
+            Class<?> employeeClass = employeeClassLoader.loadClass("org.eclipse.persistence.testing.oxm.classloader.Employee");
 
             XMLDescriptor xmlDescriptor = new XMLDescriptor();
             xmlDescriptor.setJavaClass(employeeClass);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/JARClassLoader.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/JARClassLoader.java
index 37d250e..333ab9c 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/JARClassLoader.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/JARClassLoader.java
@@ -103,9 +103,9 @@
  * and store them in the hashtable.
  */
 protected void extractPackageNames(String jarFileName) {
-    Enumeration stream = this.buildJARFile(jarFileName).entries();
+    Enumeration<? extends ZipEntry> stream = this.buildJARFile(jarFileName).entries();
     while (stream.hasMoreElements()) {
-        String entryName = ((ZipEntry) stream.nextElement()).getName();
+        String entryName = stream.nextElement().getName();
         int endIndex = entryName.lastIndexOf("/");
         // skip over entries for files in the root directory and directories
         if ((endIndex != -1) && (endIndex != (entryName.length() - 1))) {
@@ -174,7 +174,7 @@
  */
 protected Class loadUnresolvedClass(String className) throws ClassNotFoundException {
     // check whether we already loaded the class
-    Class c = this.findLoadedClass(className);
+    Class<?> c = this.findLoadedClass(className);
     if (c != null) {
         return c;
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/PhoneNumberProject.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/PhoneNumberProject.java
index 041f124..8451a1f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/PhoneNumberProject.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/classloader/PhoneNumberProject.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
@@ -28,7 +28,7 @@
     private XMLDescriptor getPhoneNumberDescriptor() {
         try {
             ClassLoader phoneNumberClassLoader = new JARClassLoader("org/eclipse/persistence/testing/oxm/classloader/PhoneNumber.jar");
-            Class phoneNumberClass = phoneNumberClassLoader.loadClass("org.eclipse.persistence.testing.oxm.classloader.PhoneNumber");
+            Class<?> phoneNumberClass = phoneNumberClassLoader.loadClass("org.eclipse.persistence.testing.oxm.classloader.PhoneNumber");
 
             XMLDescriptor xmlDescriptor = new XMLDescriptor();
             xmlDescriptor.setJavaClass(phoneNumberClass);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/dynamic/DynamicTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/dynamic/DynamicTestCases.java
index dd2cf6e..2335b38 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/dynamic/DynamicTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/dynamic/DynamicTestCases.java
@@ -14,23 +14,17 @@
 //     rbarkhouse - 2009-11-16 14:08:13 - initial implementation
 package org.eclipse.persistence.testing.oxm.dynamic;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 
-import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.dynamic.DynamicClassLoader;
-import org.eclipse.persistence.dynamic.DynamicType;
 import org.eclipse.persistence.dynamic.DynamicTypeBuilder;
 import org.eclipse.persistence.internal.dynamic.DynamicEntityImpl;
 import org.eclipse.persistence.oxm.XMLRoot;
 import org.eclipse.persistence.sessions.Project;
-import org.eclipse.persistence.sessions.factories.XMLProjectReader;
-import org.eclipse.persistence.sessions.factories.XMLProjectWriter;
 import org.eclipse.persistence.testing.oxm.mappings.XMLMappingTestCases;
 
 public class DynamicTestCases extends XMLMappingTestCases {
@@ -141,8 +135,8 @@
     }
 
     private Object newInstance(String name) throws Exception {
-        Class theClass = dynamicClassLoader.loadClass(name);
-        Constructor constructor = theClass.getConstructors()[0];
+        Class<?> theClass = dynamicClassLoader.loadClass(name);
+        Constructor<?> constructor = theClass.getConstructors()[0];
 
         return constructor.newInstance();
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/inheritance/classextractor/CarClassExtractorTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/inheritance/classextractor/CarClassExtractorTestCases.java
index 9e18cf9..4d03f00 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/inheritance/classextractor/CarClassExtractorTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/inheritance/classextractor/CarClassExtractorTestCases.java
@@ -21,10 +21,8 @@
 
 import junit.textui.TestRunner;
 
-import org.eclipse.persistence.oxm.NamespaceResolver;
 import org.eclipse.persistence.testing.oxm.inheritance.Car;
 import org.eclipse.persistence.testing.oxm.inheritance.ParkingLot;
-import org.eclipse.persistence.testing.oxm.inheritance.Vehicle;
 import org.eclipse.persistence.testing.oxm.mappings.XMLWithJSONMappingTestCases;
 
 public class CarClassExtractorTestCases extends XMLWithJSONMappingTestCases {
@@ -42,7 +40,7 @@
 
     @Override
     protected Map<String, String> getNamespaces(){
-        Map map = new HashMap<String, String>();
+        Map<String, String> map = new HashMap<>();
         map.put("mynamespaceuri", "prefix");
         return map;
     }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/anyattribute/reuse/Root.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/anyattribute/reuse/Root.java
index 03b606a..7d195a5 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/anyattribute/reuse/Root.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/anyattribute/reuse/Root.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
@@ -20,7 +20,7 @@
 
 public class Root {
 
-    private Map any = new Properties();
+    private Map<Object, Object> any = new Properties();
 
     public Map getAny() {
         return any;
@@ -32,7 +32,7 @@
 
     public boolean equals(Object object) {
         if (object instanceof Root) {
-            Map collection1 = any;
+            Map<Object, Object> collection1 = any;
             Map collection2 = ((Root) object).getAny();
             if (collection1 == null && collection2 == null) {
                 return true;
@@ -49,7 +49,7 @@
             } else if (any.getClass() != ((Root) object).getAny().getClass()) {
                 return false;
             } else {
-                Iterator values1 = any.keySet().iterator();
+                Iterator<Object> values1 = any.keySet().iterator();
                 Iterator values2 = ((Root) object).getAny().keySet().iterator();
                 while (values1.hasNext()) {
                     Object key1 = values1.next();
@@ -69,7 +69,7 @@
         if (any == null) {
             return value;
         }
-        Iterator keys = any.keySet().iterator();
+        Iterator<Object> keys = any.keySet().iterator();
         while (keys.hasNext()) {
             Object key = keys.next();
             value += "\tKey:" + key + " --> Value:" + any.get(key) + "\n";
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNodeNullPolicyFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNodeNullPolicyFalseTestCases.java
index 49c1405..6c023f8 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNodeNullPolicyFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNodeNullPolicyFalseTestCases.java
@@ -34,13 +34,13 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLCompositeObjectMapping aMapping = (XMLCompositeObjectMapping)aProject.getDescriptor(Team.class)//
         .getMappingForAttributeName("manager");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNodeNullPolicyTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNodeNullPolicyTrueTestCases.java
index 3086d01..cb00a4d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNodeNullPolicyTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNodeNullPolicyTrueTestCases.java
@@ -39,7 +39,7 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(true);
@@ -47,7 +47,7 @@
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);//.EMPTY_NODE);//.ABSENT_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentFalseIsSetFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentFalseIsSetFalseTestCases.java
index 03742f2..b3a09a0 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentFalseIsSetFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentFalseIsSetFalseTestCases.java
@@ -39,14 +39,14 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false); // No effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         //NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentFalseIsSetTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentFalseIsSetTrueTestCases.java
index 07a6a14..58a482a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentFalseIsSetTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentFalseIsSetTrueTestCases.java
@@ -37,14 +37,14 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false); // No effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         XMLCompositeObjectMapping aMapping = (XMLCompositeObjectMapping) teamDescriptor.getMappingForAttributeName("manager");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentTrueTestCases.java
index 092a1ea..c5abdfc 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicyAbsentIsSetAbsentTrueTestCases.java
@@ -40,14 +40,14 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false); // No effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         //NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyFalseIsSetFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyFalseIsSetFalseTestCases.java
index 2d4da8d..090ae19 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyFalseIsSetFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyFalseIsSetFalseTestCases.java
@@ -39,14 +39,14 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyFalseIsSetTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyFalseIsSetTrueTestCases.java
index e67d710..52b631e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyFalseIsSetTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyFalseIsSetTrueTestCases.java
@@ -39,14 +39,14 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyTrueIsSetFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyTrueIsSetFalseTestCases.java
index 017e4fc..c7b42da 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyTrueIsSetFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyTrueIsSetFalseTestCases.java
@@ -48,14 +48,14 @@
         setControlJSON(JSON_RESOURCE);
         setWriteControlDocument(XML_WRITE_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyTrueIsSetTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyTrueIsSetTrueTestCases.java
index b6bb005..10ba59a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyTrueIsSetTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetEmptyTrueIsSetTrueTestCases.java
@@ -39,14 +39,14 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetNillableIsSetFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetNillableIsSetFalseTestCases.java
index 66eceea..b6105c2 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetNillableIsSetFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetNillableIsSetFalseTestCases.java
@@ -39,14 +39,14 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(true);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);//.EMPTY_NODE);//.ABSENT_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetNillableIsSetTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetNillableIsSetTrueTestCases.java
index 083fc98..3deef3d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetNillableIsSetTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectIsSetNullPolicySetNillableIsSetTrueTestCases.java
@@ -39,14 +39,14 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(true);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);//.EMPTY_NODE);//.ABSENT_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetManager");
+        aNullPolicy.setIsSetMethodName("isSetManager");
         Project aProject = new CompositeObjectNodeNullPolicyProject(true);
         XMLDescriptor teamDescriptor = (XMLDescriptor) aProject.getDescriptor(Team.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicyAbsentIsSetAbsentFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicyAbsentIsSetAbsentFalseTestCases.java
index 4299b10..0822e99 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicyAbsentIsSetAbsentFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicyAbsentIsSetAbsentFalseTestCases.java
@@ -39,11 +39,11 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new NullPolicy();
+        NullPolicy aNullPolicy = new NullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false);
-        ((NullPolicy)aNullPolicy).setSetPerformedForAbsentNode(false);
+        aNullPolicy.setSetPerformedForAbsentNode(false);
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicyAbsentIsSetAbsentTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicyAbsentIsSetAbsentTrueTestCases.java
index 41e046b..30ac1cc 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicyAbsentIsSetAbsentTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicyAbsentIsSetAbsentTrueTestCases.java
@@ -39,11 +39,11 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new NullPolicy();
+        NullPolicy aNullPolicy = new NullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false);
-        ((NullPolicy)aNullPolicy).setSetPerformedForAbsentNode(true); // default
+        aNullPolicy.setSetPerformedForAbsentNode(true); // default
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicySetEmptyTrueIsSetFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicySetEmptyTrueIsSetFalseTestCases.java
index 51dce82..fabd470 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicySetEmptyTrueIsSetFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/compositeobject/nillable/CompositeObjectNullPolicySetEmptyTrueIsSetFalseTestCases.java
@@ -40,11 +40,11 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new NullPolicy();
+        NullPolicy aNullPolicy = new NullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true); // false=new Manager, true=null
         aNullPolicy.setNullRepresentedByXsiNil(false); // No effect
-        ((NullPolicy)aNullPolicy).setSetPerformedForAbsentNode(false); // non-default
+        aNullPolicy.setSetPerformedForAbsentNode(false); // non-default
 
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directcollection/nillable/DirectCollectionIsSetNodeNullPolicyTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directcollection/nillable/DirectCollectionIsSetNodeNullPolicyTrueTestCases.java
index 0676a6e..bb444b9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directcollection/nillable/DirectCollectionIsSetNodeNullPolicyTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directcollection/nillable/DirectCollectionIsSetNodeNullPolicyTrueTestCases.java
@@ -34,13 +34,13 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByXsiNil(true);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);
 
-        ((IsSetNullPolicy) aNullPolicy).setIsSetMethodName("isSetTasks");
+        aNullPolicy.setIsSetMethodName("isSetTasks");
 
         Project aProject = new DirectCollectionNodeNullPolicyProject(true);
         ClassDescriptor aDescriptor = aProject.getDescriptor(Employee.class);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNodeNullPolicyFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNodeNullPolicyFalseTestCases.java
index d6f3ef3..076efd5 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNodeNullPolicyFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNodeNullPolicyFalseTestCases.java
@@ -31,13 +31,13 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false); // no effect
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNodeNullPolicyTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNodeNullPolicyTrueTestCases.java
index 7c277c0..d47508c 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNodeNullPolicyTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNodeNullPolicyTrueTestCases.java
@@ -37,13 +37,13 @@
         setControlJSON(JSON_RESOURCE);
         setControlJSONWrite(JSON_WRITE_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false); // no effect
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);//.EMPTY_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDescriptor employeeDescriptor = (XMLDescriptor) aProject.getDescriptor(Employee.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeAbsentIsSetAbsentFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeAbsentIsSetAbsentFalseTestCases.java
index b6dfdc7..7f0a207 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeAbsentIsSetAbsentFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeAbsentIsSetAbsentFalseTestCases.java
@@ -32,13 +32,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // No effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(false);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeAbsentIsSetAbsentTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeAbsentIsSetAbsentTrueTestCases.java
index 4bd8011..60e8045 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeAbsentIsSetAbsentTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeAbsentIsSetAbsentTrueTestCases.java
@@ -32,14 +32,14 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         // Note: setting IsSetPerformedForAbsentNode to true is not valid here
         aNullPolicy.setNullRepresentedByEmptyNode(true); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // No effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(false);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetEmptyFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetEmptyFalseTestCases.java
index 7954809..1799253 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetEmptyFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetEmptyFalseTestCases.java
@@ -32,13 +32,13 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // No effect
         // Alter marshal policy state ignored for isSet=false
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(false);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetEmptyTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetEmptyTrueTestCases.java
index 004888d..0629a09 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetEmptyTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetEmptyTrueTestCases.java
@@ -32,13 +32,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // No effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(false);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetNonNullTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetNonNullTestCases.java
index cbc2c04..344da05 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetNonNullTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyAttributeSetNonNullTestCases.java
@@ -33,13 +33,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(false);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentFalseTestCases.java
index fd3aa5e..dca8357 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentFalseTestCases.java
@@ -34,13 +34,13 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE); // no effect when isset=false
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentFalseWithParamsTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentFalseWithParamsTestCases.java
index d625e10..a9957c4 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentFalseWithParamsTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentFalseWithParamsTestCases.java
@@ -34,7 +34,7 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
@@ -49,11 +49,11 @@
         Object[] isSetParameters = {"x","y", Boolean.TRUE, 255, (short) 32767, 1L, 1.0, -1.0f, (byte) 32, 'C'};
         //Object[] isSetParameters = {"x","y"};
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         // Class[]
-        ((IsSetNullPolicy)aNullPolicy).setIsSetParameterTypes(isSetParameterTypes);
+        aNullPolicy.setIsSetParameterTypes(isSetParameterTypes);
         // Object[]
-        ((IsSetNullPolicy)aNullPolicy).setIsSetParameters(isSetParameters);
+        aNullPolicy.setIsSetParameters(isSetParameters);
         Project aProject = new DirectIsSetNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(EmployeeIsSetParams.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentTrueTestCases.java
index 451d9bb..d057207 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementAbsentIsSetAbsentTrueTestCases.java
@@ -34,13 +34,13 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
 
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetEmptyFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetEmptyFalseTestCases.java
index e058a1a..4d64233 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetEmptyFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetEmptyFalseTestCases.java
@@ -32,13 +32,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE); // no effect when isset=false
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetEmptyTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetEmptyTrueTestCases.java
index 7033746..511b93b 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetEmptyTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetEmptyTrueTestCases.java
@@ -33,13 +33,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNillableIsSetFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNillableIsSetFalseTestCases.java
index 3bf00ee..ba6cc7a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNillableIsSetFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNillableIsSetFalseTestCases.java
@@ -35,13 +35,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
 
         // Add xsi namespace map entry to the resolver (we don't pick up the one on the xml instance doc)
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNillableIsSetTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNillableIsSetTrueTestCases.java
index 584d1f5..d52c0e3 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNillableIsSetTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNillableIsSetTrueTestCases.java
@@ -38,13 +38,13 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
         setControlJSONWrite(JSON_WRITE_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true);
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
 
         // Add xsi namespace map entry to the resolver (we don't pick up the one on the xml instance doc)
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNonNullTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNonNullTestCases.java
index 37883cd..6ca4c1f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNonNullTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetNullPolicyElementSetNonNullTestCases.java
@@ -33,13 +33,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // Alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // No effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // No effect
         // Alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.XSI_NIL); // No effect
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetDefaultTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetDefaultTestCases.java
index 7d1882b..187f8ba 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetDefaultTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetDefaultTestCases.java
@@ -45,13 +45,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect (defaults are only for SDO)
         aNullPolicy.setNullRepresentedByXsiNil(false); // no effect (defaults are only for SDO)
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE); // no effect (defaults are only for SDO)
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNOPTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNOPTestCases.java
index 5c73e55..1e69d00 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNOPTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNOPTestCases.java
@@ -45,13 +45,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNonNullTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNonNullTestCases.java
index 71a40a5..c9ae3ce 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNonNullTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNonNullTestCases.java
@@ -45,13 +45,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false); // no effect
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE); // no effect
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNullTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNullTestCases.java
index 19baf99..7319f0e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNullTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetNullTestCases.java
@@ -45,13 +45,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true);
         aNullPolicy.setNullRepresentedByXsiNil(false); // no effect
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetOtherEmptyTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetOtherEmptyTestCases.java
index 5ab6b17..37f579a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetOtherEmptyTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementDefaultSetOtherEmptyTestCases.java
@@ -46,13 +46,13 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetDefaultNullTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetDefaultNullTestCases.java
index 427f62e..552fd5e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetDefaultNullTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetDefaultNullTestCases.java
@@ -47,14 +47,14 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDescriptor employeeDescriptor = (XMLDescriptor) aProject.getDescriptor(Employee.class);
         NamespaceResolver namespaceResolver = new NamespaceResolver();
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetNOPTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetNOPTestCases.java
index 2e6e2a3..cd93c4a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetNOPTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetNOPTestCases.java
@@ -44,14 +44,14 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(false);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.ABSENT_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetNonNullTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetNonNullTestCases.java
index 4a9f423..954e4aa 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetNonNullTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetNonNullTestCases.java
@@ -43,8 +43,8 @@
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
         // use default policy with default flags and marshal enum
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetOtherEmptyTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetOtherEmptyTestCases.java
index d7f0f5a..9c40106 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetOtherEmptyTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectIsSetOptionalNodeNullPolicyNonNillableElementNonDefaultSetOtherEmptyTestCases.java
@@ -45,14 +45,14 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new IsSetNullPolicy();
+        IsSetNullPolicy aNullPolicy = new IsSetNullPolicy();
         // alter unmarshal policy state
         aNullPolicy.setNullRepresentedByEmptyNode(true);
         aNullPolicy.setNullRepresentedByXsiNil(false);
         // alter marshal policy state
         aNullPolicy.setMarshalNullRepresentation(XMLNullRepresentationType.EMPTY_NODE);
 
-        ((IsSetNullPolicy)aNullPolicy).setIsSetMethodName("isSetFirstName");
+        aNullPolicy.setIsSetMethodName("isSetFirstName");
         Project aProject = new DirectNodeNullPolicyProject(true);
         XMLDirectMapping aMapping = (XMLDirectMapping)aProject.getDescriptor(Employee.class)//
         .getMappingForAttributeName("firstName");
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeAbsentIsSetAbsentFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeAbsentIsSetAbsentFalseTestCases.java
index 4e9b61b..04669f5 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeAbsentIsSetAbsentFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeAbsentIsSetAbsentFalseTestCases.java
@@ -33,9 +33,9 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new NullPolicy();
+        NullPolicy aNullPolicy = new NullPolicy();
         // Alter unmarshal policy state
-        ((NullPolicy)aNullPolicy).setSetPerformedForAbsentNode(false);
+        aNullPolicy.setSetPerformedForAbsentNode(false);
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeAbsentIsSetAbsentTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeAbsentIsSetAbsentTrueTestCases.java
index 0340bf6..6a70a20 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeAbsentIsSetAbsentTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeAbsentIsSetAbsentTrueTestCases.java
@@ -33,9 +33,9 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-            AbstractNullPolicy aNullPolicy = new NullPolicy();
+            NullPolicy aNullPolicy = new NullPolicy();
             // Alter unmarshal policy state
-            ((NullPolicy)aNullPolicy).setSetPerformedForAbsentNode(true);
+            aNullPolicy.setSetPerformedForAbsentNode(true);
             aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
             aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
             // Alter marshal policy state
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeSetEmptyTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeSetEmptyTrueTestCases.java
index 76e4862..a9377a8 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeSetEmptyTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyAttributeSetEmptyTrueTestCases.java
@@ -52,9 +52,9 @@
 
     private void updateNullPolicyForAttribute(Project aProject, String attributeName){
 
-        AbstractNullPolicy aNullPolicy = new NullPolicy();
+        NullPolicy aNullPolicy = new NullPolicy();
         // Alter unmarshal policy state
-        ((NullPolicy)aNullPolicy).setSetPerformedForAbsentNode(true); // no effect
+        aNullPolicy.setSetPerformedForAbsentNode(true); // no effect
         aNullPolicy.setNullRepresentedByEmptyNode(true); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         //  Alter marshal policy state
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyElementAbsentIsSetAbsentFalseTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyElementAbsentIsSetAbsentFalseTestCases.java
index 4d0cac8..7dcc753 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyElementAbsentIsSetAbsentFalseTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyElementAbsentIsSetAbsentFalseTestCases.java
@@ -33,9 +33,9 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new NullPolicy();
+        NullPolicy aNullPolicy = new NullPolicy();
         // Alter unmarshal policy state
-        ((NullPolicy)aNullPolicy).setSetPerformedForAbsentNode(false);
+        aNullPolicy.setSetPerformedForAbsentNode(false);
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyElementAbsentIsSetAbsentTrueTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyElementAbsentIsSetAbsentTrueTestCases.java
index cb0da4a..66be678 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyElementAbsentIsSetAbsentTrueTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/directtofield/nillable/DirectNullPolicyElementAbsentIsSetAbsentTrueTestCases.java
@@ -33,9 +33,9 @@
         super(name);
         setControlDocument(XML_RESOURCE);
         setControlJSON(JSON_RESOURCE);
-        AbstractNullPolicy aNullPolicy = new NullPolicy();
+        NullPolicy aNullPolicy = new NullPolicy();
         // Alter unmarshal policy state
-        ((NullPolicy)aNullPolicy).setSetPerformedForAbsentNode(true);
+        aNullPolicy.setSetPerformedForAbsentNode(true);
         aNullPolicy.setNullRepresentedByEmptyNode(false); // no effect
         aNullPolicy.setNullRepresentedByXsiNil(false);  // no effect
         // Alter marshal policy state
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/keybased/multipletargets/Employee.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/keybased/multipletargets/Employee.java
index 56dffc1..0c943b9 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/keybased/multipletargets/Employee.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/keybased/multipletargets/Employee.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
@@ -31,7 +31,7 @@
             return false;
         }
         Employee tgtEmp = ((Employee) obj);
-        ArrayList tgtAddresses = tgtEmp.addresses;
+        ArrayList<Address> tgtAddresses = tgtEmp.addresses;
         if (this.addresses == null) {
             return tgtAddresses == null;
         }
@@ -40,8 +40,8 @@
             return false;
         }
 
-        for (Iterator addIt = this.addresses.iterator(); addIt.hasNext(); ) {
-            Address address = (Address) addIt.next();
+        for (Iterator<Address> addIt = this.addresses.iterator(); addIt.hasNext(); ) {
+            Address address = addIt.next();
             if (!(tgtAddresses.contains(address))) {
                 return false;
             }
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/xmlfragmentcollection/Employee.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/xmlfragmentcollection/Employee.java
index 272c3f0..18d3a8f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/xmlfragmentcollection/Employee.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/mappings/xmlfragmentcollection/Employee.java
@@ -54,12 +54,12 @@
         if(size != size2) {
           return false;
         }
-        Iterator nodesIter = xmlnodes.iterator();
-        Iterator empNodesIter = emp.xmlnodes.iterator();
+        Iterator<Node> nodesIter = xmlnodes.iterator();
+        Iterator<Node> empNodesIter = emp.xmlnodes.iterator();
         while(nodesIter.hasNext())
         {
-          Node next = (Node)nodesIter.next();
-          Node next2 = (Node)empNodesIter.next();
+          Node next = nodesIter.next();
+          Node next2 = empNodesIter.next();
            try {
             if(next2.getNodeType() == Node.ATTRIBUTE_NODE && next.getNodeType() == Node.ATTRIBUTE_NODE) {
                 Attr att1 = (Attr)next2;
@@ -116,9 +116,9 @@
         writer.write(" " + lastName);
         TransformerFactory factory = TransformerFactory.newInstance();
         if(xmlnodes != null){
-          Iterator iter = xmlnodes.iterator();
+          Iterator<Node> iter = xmlnodes.iterator();
           while(iter.hasNext()){
-            Node xmlNode = (Node)iter.next();
+            Node xmlNode = iter.next();
             try {
                 Transformer tf = factory.newTransformer();
                 DOMSource source = new DOMSource(xmlNode);
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 e31b828..a3142d0 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
@@ -16,7 +16,6 @@
 
 import java.io.InputStream;
 
-import junit.framework.TestCase;
 import org.eclipse.persistence.platform.xml.XMLPlatform;
 import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
 import org.eclipse.persistence.platform.xml.XMLPlatformException;
@@ -186,7 +185,7 @@
     }
 
     public void testCreateInvalidXMLPlatform2() throws Exception {
-        Class originalClass = XMLPlatformFactory.getInstance().getXMLPlatformClass();
+        Class<? extends XMLPlatform> originalClass = XMLPlatformFactory.getInstance().getXMLPlatformClass();
         String originalPlatform = System.getProperty("eclipselink.xml.platform");
         XMLPlatformFactory.getInstance().setXMLPlatformClass(null);
         try {
@@ -207,7 +206,7 @@
     }
 
     public void testCreateNullXMLPlatform() throws Exception {
-        Class originalClass = XMLPlatformFactory.getInstance().getXMLPlatformClass();
+        Class<? extends XMLPlatform> originalClass = XMLPlatformFactory.getInstance().getXMLPlatformClass();
         String originalPlatform = System.getProperty("eclipselink.xml.platform");
         if (null == originalPlatform) {
             originalPlatform = "org.eclipse.persistence.platform.xml.jaxp.JAXPPlatform";
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/schemamodelgenerator/GenerateSchemaTestCases.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/schemamodelgenerator/GenerateSchemaTestCases.java
index 22afb9c..7af391e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/schemamodelgenerator/GenerateSchemaTestCases.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/schemamodelgenerator/GenerateSchemaTestCases.java
@@ -28,6 +28,7 @@
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.internal.oxm.Namespace;
 import org.eclipse.persistence.internal.oxm.XMLConversionManager;
+import org.eclipse.persistence.internal.oxm.XMLUnmarshaller;
 import org.eclipse.persistence.internal.oxm.schema.SchemaModelGenerator;
 import org.eclipse.persistence.internal.oxm.schema.SchemaModelProject;
 import org.eclipse.persistence.internal.oxm.schema.model.Schema;
@@ -73,7 +74,7 @@
      *
      */
     protected void loginProject(Project prj) {
-        XMLPlatform platform = new SAXPlatform();
+        XMLPlatform<XMLUnmarshaller> platform = new SAXPlatform();
         prj.setLogin(new XMLLogin(platform));
         DatabaseSession session = prj.createDatabaseSession();
         session.setLogLevel(SessionLog.OFF);
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlmarshaller/twoprojects/TwoProjectsTestSuite.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlmarshaller/twoprojects/TwoProjectsTestSuite.java
index 50840ff..790b5fb 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlmarshaller/twoprojects/TwoProjectsTestSuite.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/oxm/xmlmarshaller/twoprojects/TwoProjectsTestSuite.java
@@ -19,7 +19,6 @@
 import javax.xml.parsers.DocumentBuilderFactory;
 import java.util.ArrayList;
 
-import junit.framework.TestCase;
 import org.eclipse.persistence.oxm.XMLContext;
 import org.eclipse.persistence.oxm.XMLLogin;
 import org.eclipse.persistence.oxm.XMLMarshaller;
@@ -61,7 +60,7 @@
     public void testAddLoggedInSession() throws Exception {
         XMLContext xmlContext = new XMLContext(new CustomerProject());
         Project empProject = new EmployeeProject();
-        XMLPlatform platform = new SAXPlatform();
+        XMLPlatform<org.eclipse.persistence.internal.oxm.XMLUnmarshaller> platform = new SAXPlatform();
         empProject.setLogin(new XMLLogin(platform));
 
         DatabaseSession employeeSession = empProject.createDatabaseSession();
@@ -88,7 +87,7 @@
         XMLContext xmlContext = new XMLContext(new CustomerProject());
         Project empProject = new EmployeeProject();
 
-        XMLPlatform platform = new SAXPlatform();
+        XMLPlatform<org.eclipse.persistence.internal.oxm.XMLUnmarshaller> platform = new SAXPlatform();
         empProject.setLogin(new XMLLogin(platform));
 
         DatabaseSession employeeSession = empProject.createDatabaseSession();
@@ -114,7 +113,7 @@
         XMLContext xmlContext = new XMLContext(CONTEXT_PATH_SAX);
 
         Project empProject = new EmployeeProject();
-        XMLPlatform platform = new SAXPlatform();
+        XMLPlatform<org.eclipse.persistence.internal.oxm.XMLUnmarshaller> platform = new SAXPlatform();
         empProject.setLogin(new XMLLogin(platform));
 
         DatabaseSession employeeSession = empProject.createDatabaseSession();
