diff --git a/bundles/tests/pom.xml b/bundles/tests/pom.xml
index 907aba5..78ddf5f 100644
--- a/bundles/tests/pom.xml
+++ b/bundles/tests/pom.xml
@@ -31,6 +31,10 @@
     <packaging>jar</packaging>
 
     <properties>
+        <comp.xlint>-Xlint:all</comp.xlint>
+        <comp.xdoclint>-Xdoclint:all,-missing</comp.xdoclint>
+        <comp.test.xlint>-Xlint:all</comp.test.xlint>
+
         <!--Test properties-->
         <archive.tmp.dir>archive-tmp</archive.tmp.dir>
         <eclipselink.unzip.dir>${project.build.directory}/stage</eclipselink.unzip.dir>
@@ -86,16 +90,16 @@
             <artifactId>parsson</artifactId>
             <scope>test</scope>
         </dependency>
-        <dependency>
-            <groupId>org.glassfish.corba</groupId>
-            <artifactId>glassfish-corba-omgapi</artifactId>
-            <scope>test</scope>
-        </dependency>
-        <dependency>
-            <groupId>org.glassfish.corba</groupId>
-            <artifactId>glassfish-corba-orb</artifactId>
-            <scope>test</scope>
-        </dependency>
+<!--        <dependency>-->
+<!--            <groupId>org.glassfish.corba</groupId>-->
+<!--            <artifactId>glassfish-corba-omgapi</artifactId>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
+<!--        <dependency>-->
+<!--            <groupId>org.glassfish.corba</groupId>-->
+<!--            <artifactId>glassfish-corba-orb</artifactId>-->
+<!--            <scope>test</scope>-->
+<!--        </dependency>-->
         <dependency>
             <groupId>junit</groupId>
             <artifactId>junit</artifactId>
@@ -176,6 +180,15 @@
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <arg>-Werror</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-dependency-plugin</artifactId>
                 <executions>
                     <execution>
diff --git a/bundles/tests/src/test/java/org/eclipse/persistence/testing/osgi/beanvalidation/BeanValidationTest.java b/bundles/tests/src/test/java/org/eclipse/persistence/testing/osgi/beanvalidation/BeanValidationTest.java
index 4ef4f66..82acf11 100644
--- a/bundles/tests/src/test/java/org/eclipse/persistence/testing/osgi/beanvalidation/BeanValidationTest.java
+++ b/bundles/tests/src/test/java/org/eclipse/persistence/testing/osgi/beanvalidation/BeanValidationTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -63,7 +63,7 @@
 
     @BeforeClass
     public static void setUp() throws Exception {
-        Class[] classes = new Class[1];
+        Class<?>[] classes = new Class<?>[1];
         classes[0] = Customer.class;
         jaxbContext = JAXBContextFactory.createContext(classes, null);
     }
diff --git a/bundles/tests/src/test/java/org/eclipse/persistence/testing/osgi/beanvalidation/NoBeanValidationTest.java b/bundles/tests/src/test/java/org/eclipse/persistence/testing/osgi/beanvalidation/NoBeanValidationTest.java
index fe5899b..9e01e02 100644
--- a/bundles/tests/src/test/java/org/eclipse/persistence/testing/osgi/beanvalidation/NoBeanValidationTest.java
+++ b/bundles/tests/src/test/java/org/eclipse/persistence/testing/osgi/beanvalidation/NoBeanValidationTest.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -52,7 +52,7 @@
 
     @BeforeClass
     public static void setUp() throws Exception {
-        Class[] classes = new Class[1];
+        Class<?>[] classes = new Class<?>[1];
         classes[0] = Customer.class;
         jaxbContext = JAXBContextFactory.createContext(classes, null);
     }
diff --git a/dbws/eclipselink.dbws.test.oracle/pom.xml b/dbws/eclipselink.dbws.test.oracle/pom.xml
index 5925c9e..d079856 100644
--- a/dbws/eclipselink.dbws.test.oracle/pom.xml
+++ b/dbws/eclipselink.dbws.test.oracle/pom.xml
@@ -31,6 +31,10 @@
     </parent>
 
     <properties>
+        <comp.xlint>-Xlint:all</comp.xlint>
+        <comp.xdoclint>-Xdoclint:all,-missing</comp.xdoclint>
+        <comp.test.xlint>-Xlint:all</comp.test.xlint>
+
         <test-skip-dbws-oracle>${skipTests}</test-skip-dbws-oracle>
     </properties>
 
@@ -81,6 +85,15 @@
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <arg>-Werror</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
                     <skip>true</skip>
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 d9f435b..4d17610 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
@@ -55,7 +55,6 @@
 import org.eclipse.persistence.queries.DatabaseQuery;
 import org.eclipse.persistence.sessions.DatabaseLogin;
 import org.eclipse.persistence.sessions.DatabaseSession;
-import org.eclipse.persistence.sessions.DatasourceLogin;
 import org.eclipse.persistence.sessions.Project;
 import org.eclipse.persistence.sessions.Session;
 import org.eclipse.persistence.sessions.factories.XMLProjectReader;
@@ -292,7 +291,7 @@
         Class<?> t1Clz = t1Descriptor.getJavaClass();
         ((DatabaseSession)session).login();
         String[] elements = {"first string", "second string", "third string"};
-        NonSynchronizedVector queryArgs = new NonSynchronizedVector();
+        NonSynchronizedVector<Object> queryArgs = new NonSynchronizedVector<>();
         queryArgs.add(elements);
         queryArgs.add("barf");
         boolean worked = false;
diff --git a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/dbws/ProviderHelper.java b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/dbws/ProviderHelper.java
index 29ca226..7562b8a 100644
--- a/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/dbws/ProviderHelper.java
+++ b/dbws/org.eclipse.persistence.dbws/src/main/java/org/eclipse/persistence/internal/dbws/ProviderHelper.java
@@ -564,8 +564,7 @@
          * binary objects, we must convert
          */
         org.eclipse.persistence.internal.oxm.schema.model.Element invocationElement =
-          (org.eclipse.persistence.internal.oxm.schema.model.Element)
-           dbwsAdapter.getExtendedSchema().getTopLevelElements().get(invocation.getName());
+                dbwsAdapter.getExtendedSchema().getTopLevelElements().get(invocation.getName());
         String typeName = invocationElement.getType();
         int idx = typeName.indexOf(':');
         if (idx != -1) {
@@ -573,7 +572,7 @@
           typeName = typeName.substring(idx+1);
         }
         ComplexType complexType =
-          (ComplexType)dbwsAdapter.getExtendedSchema().getTopLevelComplexTypes().get(typeName);
+                dbwsAdapter.getExtendedSchema().getTopLevelComplexTypes().get(typeName);
         if (complexType.getSequence() != null) {
             // for each operation, there is a corresponding top-level Request type
             // which has the arguments to the operation
diff --git a/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/corba/CorbaTestModel.java b/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/corba/CorbaTestModel.java
index 50a6041..bbb14e1 100644
--- a/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/corba/CorbaTestModel.java
+++ b/foundation/org.eclipse.persistence.corba/src/it/java/org/eclipse/persistence/testing/tests/corba/CorbaTestModel.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2019 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
@@ -46,7 +46,7 @@
 
         for (int index = 0; index < tests.size(); ++index) {
             try {
-                addTest((TestModel) Class.forName(tests.get(index)).newInstance());
+                addTest((TestModel) Class.forName(tests.get(index)).getConstructor().newInstance());
             } catch (Throwable exception) {
                 System.out.println("Failed to set up " + tests.get(index) + " \n" + exception);
                 // exception.printStackTrace();
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 03f679a..5f144c5 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
@@ -36,7 +36,7 @@
  */
 public class HistoryFacade {
 
-    private static Map timeOffsetsMap = new IdentityHashMap();
+    private static Map<Session, Long> timeOffsetsMap = new IdentityHashMap<>();
 
     protected HistoryFacade() {
     }
@@ -62,7 +62,7 @@
         fieldDef.setType(ClassConstants.TIMESTAMP);
         fieldDef.setSize(6);
         histDef.addField(fieldDef);
-        histDef.setForeignKeys(new Vector());
+        histDef.setForeignKeys(new Vector<>());
 
         for (FieldDefinition fieldDef2 : histDef.getFields()) {
             // For now foreign key constraints are not supported, because shallow inserts are not...
@@ -107,7 +107,7 @@
             }
         }
         if (timeOffsetsMap.containsKey(rootSession)) {
-            Long offset = (Long)timeOffsetsMap.get(rootSession);
+            Long offset = timeOffsetsMap.get(rootSession);
             return System.currentTimeMillis() + offset;
         } else {
             DatabaseQuery query =
@@ -132,11 +132,11 @@
     public static void generateHistoricalTableDefinitions(TableCreator creator, Session session) {
 
         // First add all table definitions to a hashtable.
-        Map<String, TableDefinition> tableDefinitions = new HashMap(creator.getTableDefinitions().size());
+        Map<String, TableDefinition> tableDefinitions = new HashMap<>(creator.getTableDefinitions().size());
         for (TableDefinition def : creator.getTableDefinitions()) {
             tableDefinitions.put(def.getFullName(), def);
         }
-        Set<String> generatedTables = new HashSet<String>();
+        Set<String> generatedTables = new HashSet<>();
         for (ClassDescriptor descriptor : session.getDescriptors().values()) {
             HistoryPolicy policy = descriptor.getHistoryPolicy();
             if (policy != null) {
@@ -188,7 +188,7 @@
      * being the current table name with a _HIST suffix.  Hence Employee would
      * become Employee_Hist.
      */
-    public static void generateHistoryPolicies(Iterator descriptors, DatasourcePlatform platform) {
+    public static void generateHistoryPolicies(Iterator<ClassDescriptor> descriptors, DatasourcePlatform platform) {
         HistoryPolicy basePolicy = new HistoryPolicy();
         basePolicy.addStartFieldName("ROW_START");
         basePolicy.addEndFieldName("ROW_END");
@@ -196,7 +196,7 @@
         HistoryPolicy policy = null;
 
         while (descriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)descriptors.next();
+            ClassDescriptor descriptor = descriptors.next();
             policy = (HistoryPolicy)basePolicy.clone();
             List<DatabaseTable> tables = descriptor.getTables();
             int size = tables.size();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/queries/CoreAttributeItem.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/queries/CoreAttributeItem.java
index 7fdde4d..c99c3ce 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/queries/CoreAttributeItem.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/core/queries/CoreAttributeItem.java
@@ -104,7 +104,7 @@
             if (this.group == null){
                 this.group = group;
             }
-            Object type = group.getType();
+            Serializable type = group.getType();
             if (type == null){
                 type = group.getTypeName();
             }
@@ -202,9 +202,9 @@
             if(obj == null) {
                 return false;
             }
-            CoreAttributeItem anotherItem = null;
+            CoreAttributeItem<ATTRIBUTE_GROUP> anotherItem = null;
             try {
-                anotherItem = (CoreAttributeItem)obj;
+                anotherItem = (CoreAttributeItem<ATTRIBUTE_GROUP>)obj;
             } catch (ClassCastException cce) {
                 return false;
             }
@@ -215,7 +215,7 @@
                 }
                 if (this.subGroups.size() == anotherItem.subGroups.size()){
                     for (Map.Entry<Object, ATTRIBUTE_GROUP> entry : this.subGroups.entrySet()){
-                        ATTRIBUTE_GROUP anotherGroup = (ATTRIBUTE_GROUP)anotherItem.subGroups.get(entry.getKey());
+                        ATTRIBUTE_GROUP anotherGroup = anotherItem.subGroups.get(entry.getKey());
                         if (! entry.getValue().equals(anotherGroup)){
                             return false;
                         }
@@ -233,7 +233,7 @@
                 }
                 if (this.keyGroups.size() == anotherItem.keyGroups.size()){
                     for (Map.Entry<Object, ATTRIBUTE_GROUP> entry : this.keyGroups.entrySet()){
-                        ATTRIBUTE_GROUP anotherGroup = (ATTRIBUTE_GROUP)anotherItem.keyGroups.get(entry.getKey());
+                        ATTRIBUTE_GROUP anotherGroup = anotherItem.keyGroups.get(entry.getKey());
                         if (! entry.getValue().equals(anotherGroup)){
                             return false;
                         }
@@ -344,10 +344,10 @@
 
     @Override
     public String toString() {
-        return getClass().getSimpleName() + "(" + getAttributeName() + ")" + (this.subGroups!=null ? " => " + this.subGroups.toString() : "") + (this.keyGroups!=null ? " => " + this.keyGroups.toString() : "");
+        return getClass().getSimpleName() + "(" + getAttributeName() + ")" + (this.subGroups!=null ? " => " + this.subGroups : "") + (this.keyGroups!=null ? " => " + this.keyGroups : "");
     }
 
     public String toStringNoClassName() {
-        return getAttributeName() + (this.subGroups!=null ? " => " + this.subGroups.toString() : "")+ (this.keyGroups!=null ? " => " + this.keyGroups.toString() : "");
+        return getAttributeName() + (this.subGroups!=null ? " => " + this.subGroups : "")+ (this.keyGroups!=null ? " => " + this.keyGroups : "");
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CacheIndex.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CacheIndex.java
index dd3262f..6fd099c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CacheIndex.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CacheIndex.java
@@ -16,6 +16,7 @@
 
 import java.io.Serializable;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.eclipse.persistence.internal.helper.ClassConstants;
@@ -43,11 +44,9 @@
         this.fields = new ArrayList<>();
     }
 
-    public CacheIndex(DatabaseField fields[]) {
+    public CacheIndex(DatabaseField[] fields) {
         this.fields = new ArrayList<>(fields.length);
-        for (DatabaseField field : fields) {
-            this.fields.add(field);
-        }
+        Collections.addAll(this.fields, fields);
     }
 
     public CacheIndex(String... fields) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CachePolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CachePolicy.java
index 6d37522..9f8cee4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CachePolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/CachePolicy.java
@@ -25,7 +25,6 @@
 import java.util.Map;
 import java.util.Set;
 
-import jakarta.persistence.Cache;
 import org.eclipse.persistence.annotations.CacheCoordinationType;
 import org.eclipse.persistence.annotations.CacheKeyType;
 import org.eclipse.persistence.annotations.DatabaseChangeNotificationType;
@@ -47,7 +46,6 @@
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.sessions.DatabaseSession;
 import org.eclipse.persistence.sessions.interceptors.CacheInterceptor;
-import org.eclipse.persistence.sessions.interceptors.CacheKeyInterceptor;
 
 /**
  * <p><b>Purpose</b>:
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ReturningPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ReturningPolicy.java
index 0717882..97de2d5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ReturningPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ReturningPolicy.java
@@ -177,7 +177,7 @@
         if (col1.size() != col2.size()) {
             return false;
         }
-        Collection<Info> c1 = new ArrayList<Info>(col1);
+        Collection<Info> c1 = new ArrayList<>(col1);
         Collection<Info> c2 = new ArrayList<>(col2);
         for (Iterator<Info> i = c1.iterator(); i.hasNext();) {
             Info o = i.next();
@@ -349,7 +349,7 @@
         private boolean isInsert;
         private boolean isInsertModeReturnOnly;
         private boolean isUpdate;
-        private Class<? extends Object> referenceClass;
+        private Class<?> referenceClass;
         private String referenceClassName;
 
         Info() {
@@ -403,7 +403,7 @@
             this.isUpdate = isUpdate;
         }
 
-        public Class<? extends Object> getReferenceClass() {
+        public Class<?> getReferenceClass() {
             return referenceClass;
         }
 
@@ -498,7 +498,7 @@
         @Override
         public int hashCode() {
             DatabaseField field = getField();
-            Class<? extends Object> type = field != null ? field.getType() : null;
+            Class<?> type = field != null ? field.getType() : null;
             boolean isInsert = isInsert();
             boolean isInsertModeReturnOnly = isInsertModeReturnOnly();
             boolean isUpdate = isUpdate();
@@ -622,7 +622,7 @@
     }
 
     protected Hashtable<DatabaseField, Info> removeDuplicateAndValidateInfos(AbstractSession session) {
-        Hashtable<DatabaseField, Info> infoHashtable = new Hashtable<DatabaseField, Info>();
+        Hashtable<DatabaseField, Info> infoHashtable = new Hashtable<>();
         for (int i = 0; i < infos.size(); i++) {
             Info info1 = infos.get(i);
             info1 = (Info)info1.clone();
@@ -670,12 +670,12 @@
         }
 
         if (!infos.isEmpty()) {
-            Hashtable<? extends DatabaseField, ? extends Info> infoHashtable = removeDuplicateAndValidateInfos(session);
-            Hashtable infoHashtableUnmapped = (Hashtable)infoHashtable.clone();
+            Hashtable<DatabaseField, Info> infoHashtable = removeDuplicateAndValidateInfos(session);
+            Hashtable<DatabaseField, Info> infoHashtableUnmapped = (Hashtable<DatabaseField, Info>)infoHashtable.clone();
             for (Enumeration<DatabaseField> fields = getDescriptor().getFields().elements();
                  fields.hasMoreElements();) {
                 DatabaseField field = fields.nextElement();
-                Info info = (Info)infoHashtableUnmapped.get(field);
+                Info info = infoHashtableUnmapped.get(field);
                 if (info != null) {
                     infoHashtableUnmapped.remove(field);
                     if (verifyFieldAndMapping(session, field)) {
@@ -690,10 +690,10 @@
             }
 
             if (!infoHashtableUnmapped.isEmpty()) {
-                Enumeration fields = infoHashtableUnmapped.keys();
+                Enumeration<DatabaseField> fields = infoHashtableUnmapped.keys();
                 while (fields.hasMoreElements()) {
-                    DatabaseField field = (DatabaseField)fields.nextElement();
-                    Info info = (Info)infoHashtableUnmapped.get(field);
+                    DatabaseField field = fields.nextElement();
+                    Info info = infoHashtableUnmapped.get(field);
                     if (verifyField(session, field, getDescriptor())) {
                         if (field.getType() != null) {
                             addUnmappedFieldToMain(field, info);
@@ -726,7 +726,7 @@
      * Both ReturningPolicies should be initialized
      */
     public boolean hasEqualMains(ReturningPolicy policy) {
-        Collection[][] mainToCompare = policy.main;
+        Collection<DatabaseField>[][] mainToCompare = policy.main;
         if (main == mainToCompare) {
             return true;
         }
@@ -745,7 +745,7 @@
         }
 
         // now compare types
-        Hashtable<DatabaseField, DatabaseField> allFields = new Hashtable<DatabaseField, DatabaseField>();
+        Hashtable<DatabaseField, DatabaseField> allFields = new Hashtable<>();
         for (int operation = INSERT; operation <= UPDATE; operation++) {
             if (main[operation][ALL] != null) {
                 Iterator<DatabaseField> it = main[operation][ALL].iterator();
@@ -757,9 +757,9 @@
         }
         for (int operation = INSERT; operation <= UPDATE; operation++) {
             if (mainToCompare[operation][ALL] != null) {
-                Iterator it = mainToCompare[operation][ALL].iterator();
+                Iterator<DatabaseField> it = mainToCompare[operation][ALL].iterator();
                 while (it.hasNext()) {
-                    DatabaseField fieldToCompare = (DatabaseField)it.next();
+                    DatabaseField fieldToCompare = it.next();
                     DatabaseField field = allFields.get(fieldToCompare);
                     if (!field.getType().equals(fieldToCompare.getType())) {
                         return false;
@@ -879,7 +879,7 @@
      * INTERNAL:
      */
     public void validationAfterDescriptorInitialization(AbstractSession session) {
-        Hashtable<DatabaseField, DatabaseField> mapped = new Hashtable<DatabaseField, DatabaseField>();
+        Hashtable<DatabaseField, DatabaseField> mapped = new Hashtable<>();
         for (int operation = INSERT; operation <= UPDATE; operation++) {
             if ((main[operation][MAPPED] != null) && !main[operation][MAPPED].isEmpty()) {
                 Iterator<DatabaseField> it = main[operation][MAPPED].iterator();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/SingleTableMultitenantPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/SingleTableMultitenantPolicy.java
index 66d2b63..82924b1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/SingleTableMultitenantPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/SingleTableMultitenantPolicy.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2019 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -49,7 +49,7 @@
     public SingleTableMultitenantPolicy(ClassDescriptor desc) {
         descriptor = desc;
         includeTenantCriteria = true;
-        tenantDiscriminatorFields = new HashMap(5);
+        tenantDiscriminatorFields = new HashMap<>(5);
         tenantDiscriminatorFieldsKeyedOnContext = new HashMap<>(5);
     }
 
@@ -109,7 +109,7 @@
             tenantDiscriminatorFields.put(field, property);
 
             if (! tenantDiscriminatorFieldsKeyedOnContext.containsKey(property)) {
-                tenantDiscriminatorFieldsKeyedOnContext.put(property, new ArrayList<DatabaseField>());
+                tenantDiscriminatorFieldsKeyedOnContext.put(property, new ArrayList<>());
             }
 
             tenantDiscriminatorFieldsKeyedOnContext.get(property).add(field);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISConnectionSpec.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISConnectionSpec.java
index 2ae7bfb..e5e3c1d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISConnectionSpec.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISConnectionSpec.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
@@ -312,6 +312,6 @@
      */
     @Override
     public void toString(java.io.PrintWriter writer) {
-        writer.println(toString());
+        writer.println(this);
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISPlatform.java
index 0f88006..e7cf254 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/EISPlatform.java
@@ -277,7 +277,6 @@
      */
     public void setDOMInRecord(Element dom, jakarta.resource.cci.Record record, EISInteraction call, EISAccessor accessor) {
         if (domMethod == null) {
-            @SuppressWarnings({"unchecked", "rawtypes"})
             Class<?>[] argumentTypes = (Class<?>[]) new Class[1];
             argumentTypes[0] = Element.class;
             try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/interactions/XMLInteraction.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/interactions/XMLInteraction.java
index da80b9b..a99c366 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/interactions/XMLInteraction.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/eis/interactions/XMLInteraction.java
@@ -23,7 +23,6 @@
 import org.eclipse.persistence.oxm.XMLField;
 import org.w3c.dom.Element;
 import org.eclipse.persistence.internal.databaseaccess.Accessor;
-import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.oxm.record.XMLRecord;
 import org.eclipse.persistence.internal.helper.*;
 import org.eclipse.persistence.eis.*;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ClassDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ClassDefinition.java
index 7095332..67aa798 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ClassDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ClassDefinition.java
@@ -24,8 +24,6 @@
 import java.util.TreeSet;
 import java.util.Vector;
 
-import org.eclipse.persistence.internal.helper.Helper;
-
 /**
  * INTERNAL:
  * <p><b>Purpose</b>: Model a class for code generation purposes.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/MethodDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/MethodDefinition.java
index 9c19977..8c8cb61 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/MethodDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/MethodDefinition.java
@@ -74,7 +74,7 @@
      * unambiguous.
      */
     private void adjustLine(String line, Map<String, Set<String>> typeNameMap) {
-        StringBuffer lineInProgress = new StringBuffer(line);
+        StringBuilder lineInProgress = new StringBuilder(line);
         Set<String> typeNames = parseForTypeNames(lineInProgress.toString());
 
         for (Iterator<String> i = typeNames.iterator(); i.hasNext();) {
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 3c9da3b..0bf5977 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
@@ -289,10 +289,10 @@
      * If the fields passed in are null, this means that the field are not known and should be
      * built from the column names.  This case occurs for DataReadQuery's.
      */
-    public Vector buildSortedFields(Vector fields, ResultSet resultSet, AbstractSession session) throws DatabaseException {
-        Vector sortedFields;
+    public Vector<DatabaseField> buildSortedFields(Vector<DatabaseField> fields, ResultSet resultSet, AbstractSession session) throws DatabaseException {
+        Vector<DatabaseField> sortedFields;
         try {
-            Vector columnNames = getColumnNames(resultSet, session);
+            Vector<DatabaseField> columnNames = getColumnNames(resultSet, session);
             if (fields == null) {// Means fields not known.
                 sortedFields = columnNames;
             } else {
@@ -460,7 +460,7 @@
      * with values from the next valid row in the result set. Intended solely
      * for cursored stream support.
      */
-    public AbstractRecord cursorRetrieveNextRow(Vector fields, ResultSet resultSet, AbstractSession session) throws DatabaseException {
+    public AbstractRecord cursorRetrieveNextRow(Vector<DatabaseField> fields, ResultSet resultSet, AbstractSession session) throws DatabaseException {
         try {
             if (resultSet.next()) {
                 return fetchRow(fields, resultSet, resultSet.getMetaData(), session);
@@ -479,7 +479,7 @@
      * with values from the next valid row in the result set. Intended solely
      * for scrollable cursor support.
      */
-    public AbstractRecord cursorRetrievePreviousRow(Vector fields, ResultSet resultSet, AbstractSession session) throws DatabaseException {
+    public AbstractRecord cursorRetrievePreviousRow(Vector<DatabaseField> fields, ResultSet resultSet, AbstractSession session) throws DatabaseException {
         try {
             if (resultSet.previous()) {
                 return fetchRow(fields, resultSet, resultSet.getMetaData(), session);
@@ -1040,14 +1040,14 @@
      * match the number of column names available on the database.
      * PERF: This method must be highly optimized.
      */
-    protected AbstractRecord fetchRow(Vector fields, ResultSet resultSet, ResultSetMetaData metaData, AbstractSession session) throws DatabaseException {
+    protected AbstractRecord fetchRow(Vector<DatabaseField> fields, ResultSet resultSet, ResultSetMetaData metaData, AbstractSession session) throws DatabaseException {
         int size = fields.size();
         Vector values = NonSynchronizedVector.newInstance(size);
         // PERF: Pass platform and optimize data flag.
         DatabasePlatform platform = getPlatform();
         boolean optimizeData = platform.shouldOptimizeDataConversion();
         for (int index = 0; index < size; index++) {
-            DatabaseField field = (DatabaseField)fields.elementAt(index);
+            DatabaseField field = fields.elementAt(index);
             // Field can be null for fetch groups.
             if (field != null) {
                 values.add(getObject(resultSet, field, metaData, index + 1, platform, optimizeData, session));
@@ -1207,9 +1207,9 @@
      * This is required for custom SQL execution only,
      * as generated SQL already knows the fields returned.
      */
-    protected Vector getColumnNames(ResultSet resultSet, AbstractSession session) throws SQLException {
+    protected Vector<DatabaseField> getColumnNames(ResultSet resultSet, AbstractSession session) throws SQLException {
         ResultSetMetaData metaData = resultSet.getMetaData();
-        Vector columnNames = new Vector(metaData.getColumnCount());
+        Vector<DatabaseField> columnNames = new Vector<>(metaData.getColumnCount());
 
         for (int index = 0; index < metaData.getColumnCount(); index++) {
             // Changed the following code to use metaData#getColumnLabel() instead of metaData.getColumnName()
@@ -1370,7 +1370,7 @@
         // Optimize numeric values to avoid conversion into big-dec and back to primitives.
         if ((fieldType == ClassConstants.PLONG) || (fieldType == ClassConstants.LONG)) {
             value = resultSet.getLong(columnNumber);
-            isPrimitive = (Long) value == 0l;
+            isPrimitive = (Long) value == 0L;
         } else if ((fieldType == ClassConstants.INTEGER) || (fieldType == ClassConstants.PINT)) {
             value = resultSet.getInt(columnNumber);
             isPrimitive = (Integer) value == 0;
@@ -1385,7 +1385,7 @@
             isPrimitive = (Short) value == 0;
         } else if ((fieldType == ClassConstants.BOOLEAN) || (fieldType == ClassConstants.PBOOLEAN))  {
             value = resultSet.getBoolean(columnNumber);
-            isPrimitive = (Boolean) value == false;
+            isPrimitive = !((Boolean) value);
         } else if ((type == Types.TIME) || (type == Types.DATE) || (type == Types.TIMESTAMP)) {
             if (Helper.shouldOptimizeDates) {
                 // Optimize dates by avoid conversion to timestamp then back to date or time or util.date.
@@ -1495,7 +1495,7 @@
         try {
             incrementCallCount(session);
             resultSet = getConnectionMetaData().getTables(catalog, schema, tableName, types);
-            Vector fields = buildSortedFields(null, resultSet, session);
+            Vector<DatabaseField> fields = buildSortedFields(null, resultSet, session);
             ResultSetMetaData metaData = resultSet.getMetaData();
 
             while (resultSet.next()) {
@@ -1790,7 +1790,7 @@
     /**
      * The statement cache stores a fixed sized number of prepared statements.
      */
-    protected void setStatementCache(Hashtable statementCache) {
+    protected void setStatementCache(Hashtable<String, Statement> statementCache) {
         this.statementCache = statementCache;
     }
 
@@ -1798,20 +1798,21 @@
      * This method will sort the fields in correct order based
      * on the column names.
      */
-    protected Vector sortFields(Vector fields, Vector columnNames) {
-        Vector sortedFields = new Vector(columnNames.size());
-        Vector eligableFields = (Vector)fields.clone();// Must clone to allow removing to support the same field twice.
-        Enumeration columnNamesEnum = columnNames.elements();
+    protected Vector<DatabaseField> sortFields(Vector<DatabaseField> fields, Vector<DatabaseField> columnNames) {
+        Vector<DatabaseField> sortedFields = new Vector<>(columnNames.size());
+        @SuppressWarnings({"unchecked"})
+        Vector<DatabaseField> eligableFields = (Vector<DatabaseField>)fields.clone();// Must clone to allow removing to support the same field twice.
+        Enumeration<DatabaseField> columnNamesEnum = columnNames.elements();
         boolean valueFound;
         DatabaseField field;
         DatabaseField column;//DatabaseField from the columnNames vector
         while (columnNamesEnum.hasMoreElements()) {
             field = null;
             valueFound = false;
-            column = (DatabaseField)columnNamesEnum.nextElement();
-            Enumeration fieldEnum = eligableFields.elements();
+            column = columnNamesEnum.nextElement();
+            Enumeration<DatabaseField> fieldEnum = eligableFields.elements();
             while (fieldEnum.hasMoreElements()) {
-                field = (DatabaseField)fieldEnum.nextElement();
+                field = fieldEnum.nextElement();
                 if(field != null && field.equals(column)){
                     valueFound = true;
                     sortedFields.addElement(field);
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 301862b..d40fdb4 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
@@ -669,7 +669,7 @@
      * INTERNAL
      * Returns null unless the platform supports call with returning
      */
-    public DatabaseCall buildCallWithReturning(SQLCall sqlCall, Vector returnFields) {
+    public DatabaseCall buildCallWithReturning(SQLCall sqlCall, Vector<DatabaseField> returnFields) {
         throw ValidationException.platformDoesNotSupportCallWithReturning(Helper.getShortClassName(this));
     }
 
@@ -1317,7 +1317,7 @@
             return Types.SMALLINT;
         } else if (javaType == ClassConstants.CALENDAR ) {
             return Types.TIMESTAMP;
-        } else if (javaType == ClassConstants.UTILDATE ) {
+        } else if (javaType == ClassConstants.UTILDATE ) {//bug 5237080, return TIMESTAMP for java.util.Date as well
             return Types.TIMESTAMP;
         } else if (javaType == ClassConstants.TIME ||
             javaType == ClassConstants.TIME_LTIME) { //bug 546312
@@ -1326,7 +1326,6 @@
             javaType == ClassConstants.TIME_LDATE) { //bug 546312
             return Types.DATE;
         } else if (javaType == ClassConstants.TIMESTAMP ||
-            javaType == ClassConstants.UTILDATE || //bug 5237080, return TIMESTAMP for java.util.Date as well
             javaType == ClassConstants.TIME_LDATETIME) { //bug 546312
             return Types.TIMESTAMP;
         } else if(javaType == ClassConstants.TIME_OTIME) { //bug 546312
@@ -2965,23 +2964,23 @@
      * @param allFields all mapped fields for the original table.
      */
      public void writeCreateTempTableSql(Writer writer, DatabaseTable table, AbstractSession session,
-                                        Collection pkFields,
-                                        Collection usedFields,
-                                        Collection allFields) throws IOException
+                                         Collection<DatabaseField> pkFields,
+                                         Collection<DatabaseField> usedFields,
+                                         Collection<DatabaseField> allFields) throws IOException
     {
         String body = getCreateTempTableSqlBodyForTable(table);
         if(body == null) {
             TableDefinition tableDef = new TableDefinition();
-            Collection fields;
+            Collection<DatabaseField> fields;
             if(supportsLocalTempTables()) {
                 fields = usedFields;
             } else {
                 // supportsGlobalTempTables() == true
                 fields = allFields;
             }
-            Iterator itFields = fields.iterator();
+            Iterator<DatabaseField> itFields = fields.iterator();
             while (itFields.hasNext()) {
-                DatabaseField field = (DatabaseField)itFields.next();
+                DatabaseField field = itFields.next();
                 FieldDefinition fieldDef;
                 //gfbug3307, should use columnDefinition if it was defined.
                 if ((field.getColumnDefinition()!= null) && (field.getColumnDefinition().length() == 0)) {
@@ -3021,7 +3020,7 @@
      * @param table is original table for which temp table is created.
      * @param usedFields fields that will be used by operation for which temp table is created.
      */
-     public void writeInsertIntoTableSql(Writer writer, DatabaseTable table, Collection usedFields) throws IOException {
+     public void writeInsertIntoTableSql(Writer writer, DatabaseTable table, Collection<DatabaseField> usedFields) throws IOException {
         writer.write("INSERT INTO ");
         writer.write(getTempTableForTable(table).getQualifiedNameDelimited(this));
 
@@ -3075,8 +3074,8 @@
      * @param assignedFields fields to be assigned a new value.
      */
      public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table,
-                                                     Collection pkFields,
-                                                     Collection assignedFields) throws IOException
+                                                     Collection<DatabaseField> pkFields,
+                                                     Collection<DatabaseField> assignedFields) throws IOException
     {
         writer.write("UPDATE ");
         String tableName = table.getQualifiedNameDelimited(this);
@@ -3090,7 +3089,7 @@
         writer.write(tempTableName);
         writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
         writer.write(") WHERE EXISTS(SELECT ");
-        writer.write(((DatabaseField)pkFields.iterator().next()).getNameDelimited(this));
+        writer.write(pkFields.iterator().next().getNameDelimited(this));
         writer.write(" FROM ");
         writer.write(tempTableName);
         writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
@@ -3113,14 +3112,14 @@
      * @param targetPkFields primary key fields for the target table.
      */
      public void writeDeleteFromTargetTableUsingTempTableSql(Writer writer, DatabaseTable table, DatabaseTable targetTable,
-                                                     Collection pkFields,
-                                                     Collection targetPkFields, DatasourcePlatform platform) throws IOException
+                                                             Collection<DatabaseField> pkFields,
+                                                             Collection<DatabaseField> targetPkFields, DatasourcePlatform platform) throws IOException
     {
         writer.write("DELETE FROM ");
         String targetTableName = targetTable.getQualifiedNameDelimited(this);
         writer.write(targetTableName);
         writer.write(" WHERE EXISTS(SELECT ");
-        writer.write(((DatabaseField)pkFields.iterator().next()).getNameDelimited(platform));
+        writer.write(pkFields.iterator().next().getNameDelimited(platform));
         writer.write(" FROM ");
         String tempTableName = getTempTableForTable(table).getQualifiedNameDelimited(this);
         writer.write(tempTableName);
@@ -3215,16 +3214,16 @@
      * INTERNAL:
      * helper method, don't override.
      */
-    protected static void writeFieldsList(Writer writer, Collection fields, DatasourcePlatform platform) throws IOException {
+    protected static void writeFieldsList(Writer writer, Collection<DatabaseField> fields, DatasourcePlatform platform) throws IOException {
         boolean isFirst = true;
-        Iterator itFields = fields.iterator();
+        Iterator<DatabaseField> itFields = fields.iterator();
         while(itFields.hasNext()) {
             if(isFirst) {
                 isFirst = false;
             } else {
                 writer.write(", ");
             }
-            DatabaseField field = (DatabaseField)itFields.next();
+            DatabaseField field = itFields.next();
             writer.write(field.getNameDelimited(platform));
         }
     }
@@ -3233,7 +3232,7 @@
      * INTERNAL:
      * helper method, don't override.
      */
-    protected static void writeAutoAssignmentSetClause(Writer writer, String tableName1, String tableName2, Collection fields, DatasourcePlatform platform) throws IOException {
+    protected static void writeAutoAssignmentSetClause(Writer writer, String tableName1, String tableName2, Collection<DatabaseField> fields, DatasourcePlatform platform) throws IOException {
         writer.write(" SET ");
         writeFieldsAutoClause(writer, tableName1, tableName2, fields, ", ", platform);
     }
@@ -3242,7 +3241,7 @@
      * INTERNAL:
      * helper method, don't override.
      */
-    protected static void writeAutoJoinWhereClause(Writer writer, String tableName1, String tableName2, Collection pkFields, DatasourcePlatform platform) throws IOException {
+    protected static void writeAutoJoinWhereClause(Writer writer, String tableName1, String tableName2, Collection<DatabaseField> pkFields, DatasourcePlatform platform) throws IOException {
         writer.write(" WHERE ");
         writeFieldsAutoClause(writer, tableName1, tableName2, pkFields, " AND ", platform);
     }
@@ -3251,14 +3250,14 @@
      * INTERNAL:
      * helper method, don't override.
      */
-    protected static void writeFieldsAutoClause(Writer writer, String tableName1, String tableName2, Collection fields, String separator, DatasourcePlatform platform) throws IOException {
+    protected static void writeFieldsAutoClause(Writer writer, String tableName1, String tableName2, Collection<DatabaseField> fields, String separator, DatasourcePlatform platform) throws IOException {
         writeFields(writer, tableName1, tableName2, fields, fields, separator, platform);
     }
     /**
      * INTERNAL:
      * helper method, don't override.
      */
-    protected static void writeJoinWhereClause(Writer writer, String tableName1, String tableName2, Collection pkFields1, Collection pkFields2, DatasourcePlatform platform) throws IOException {
+    protected static void writeJoinWhereClause(Writer writer, String tableName1, String tableName2, Collection<DatabaseField> pkFields1, Collection<DatabaseField> pkFields2, DatasourcePlatform platform) throws IOException {
         writer.write(" WHERE ");
         writeFields(writer, tableName1, tableName2, pkFields1, pkFields2, " AND ", platform);
     }
@@ -3267,10 +3266,10 @@
      * INTERNAL:
      * helper method, don't override.
      */
-    protected static void writeFields(Writer writer, String tableName1, String tableName2, Collection fields1, Collection fields2, String separator, DatasourcePlatform platform) throws IOException {
+    protected static void writeFields(Writer writer, String tableName1, String tableName2, Collection<DatabaseField> fields1, Collection<DatabaseField> fields2, String separator, DatasourcePlatform platform) throws IOException {
         boolean isFirst = true;
-        Iterator itFields1 = fields1.iterator();
-        Iterator itFields2 = fields2.iterator();
+        Iterator<DatabaseField> itFields1 = fields1.iterator();
+        Iterator<DatabaseField> itFields2 = fields2.iterator();
         while(itFields1.hasNext()) {
             if(isFirst) {
                 isFirst = false;
@@ -3281,14 +3280,14 @@
                 writer.write(tableName1);
                 writer.write(".");
             }
-            String fieldName1 = ((DatabaseField)itFields1.next()).getNameDelimited(platform);
+            String fieldName1 = itFields1.next().getNameDelimited(platform);
             writer.write(fieldName1);
             writer.write(" = ");
             if(tableName2 != null) {
                 writer.write(tableName2);
                 writer.write(".");
             }
-            String fieldName2 = ((DatabaseField)itFields2.next()).getNameDelimited(platform);
+            String fieldName2 = itFields2.next().getNameDelimited(platform);
             writer.write(fieldName2);
         }
     }
@@ -3392,7 +3391,7 @@
      * This method builds a Struct using the unwrapped connection within the session
      * @return Struct
      */
-    public Struct createStruct(String structTypeName, Object[] attributes, AbstractRecord row, Vector orderedFields, AbstractSession session, Connection connection) throws SQLException {
+    public Struct createStruct(String structTypeName, Object[] attributes, AbstractRecord row, Vector<DatabaseField> orderedFields, AbstractSession session, Connection connection) throws SQLException {
         java.sql.Connection unwrappedConnection = getConnection(session, connection);
         return createStruct(structTypeName,attributes,unwrappedConnection);
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicEntityImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicEntityImpl.java
index e462971..0116b54 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicEntityImpl.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/dynamic/DynamicEntityImpl.java
@@ -125,6 +125,7 @@
      * @see org.eclipse.persistence.dynamic.DynamicEntity#get(java.lang.String)
      */
     @Override
+    @SuppressWarnings({"unchecked"})
     public <T> T get(String propertyName) throws DynamicException {
         DynamicPropertiesManager dpm = fetchPropertiesManager();
         if (dpm.contains(propertyName)) {
@@ -143,10 +144,10 @@
             Object value = wrapper.getValue();
             // trigger any indirection
             if (value instanceof ValueHolderInterface) {
-                value = ((ValueHolderInterface) value).getValue();
+                value = ((ValueHolderInterface<?>) value).getValue();
             }
             else if (value instanceof IndirectContainer) {
-                value = ((IndirectContainer) value).getValueHolder().getValue();
+                value = ((IndirectContainer<?>) value).getValueHolder().getValue();
             }
             try {
                 return (T) value;
@@ -225,6 +226,7 @@
         Object oldValue = null;
         Object wrapperValue = wrapper.getValue();
         if (wrapperValue instanceof ValueHolderInterface<?>) {
+            @SuppressWarnings({"unchecked"})
             ValueHolderInterface<Object> vh = (ValueHolderInterface<Object>) wrapperValue;
             if (vh.isInstantiated()) {
                 oldValue = vh.getValue();
@@ -321,7 +323,7 @@
                 sb.append("<null>");
             }
             else {
-                sb.append(value.toString());
+                sb.append(value);
             }
             return sb.toString();
         }
@@ -442,7 +444,6 @@
      * @see org.eclipse.persistence.internal.descriptors.PersistenceEntity#_persistence_getId()
      */
     @Override
-    @SuppressWarnings("unchecked")
     public Object _persistence_getId() {
         return this.primaryKey;
     }
@@ -451,7 +452,6 @@
      * @see org.eclipse.persistence.internal.descriptors.PersistenceEntity#_persistence_setId(java.lang.Object)
      */
     @Override
-    @SuppressWarnings("unchecked")
     public void _persistence_setId(Object pk) {
         this.primaryKey = pk;
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ExpressionJavaPrinter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ExpressionJavaPrinter.java
index 012a996..265a9ee 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ExpressionJavaPrinter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/ExpressionJavaPrinter.java
@@ -15,7 +15,6 @@
 package org.eclipse.persistence.internal.expressions;
 
 import java.io.*;
-import java.math.*;
 import java.util.Calendar;
 import org.eclipse.persistence.internal.databaseaccess.*;
 import org.eclipse.persistence.internal.helper.ClassConstants;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/RelationExpression.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/RelationExpression.java
index e09dd6b..15adaad 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/RelationExpression.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/expressions/RelationExpression.java
@@ -193,7 +193,7 @@
             return performSelector(false);
         }
 
-        Class<? extends Object> javaClass = leftValue.getClass();
+        Class<?> javaClass = leftValue.getClass();
         if (javaClass != rightValue.getClass()) {
             return performSelector(false);
         }
@@ -623,8 +623,8 @@
                 descriptor = mapping.getReferenceDescriptor();
                 left = left.normalize(normalizer);
                 Map<DatabaseField, DatabaseField> targetToSourceKeyFields = ((OneToOneMapping)mapping).getTargetToSourceKeyFields();
-                sourceFields = new ArrayList(targetToSourceKeyFields.size());
-                targetFields = new ArrayList(targetToSourceKeyFields.size());
+                sourceFields = new ArrayList<>(targetToSourceKeyFields.size());
+                targetFields = new ArrayList<>(targetToSourceKeyFields.size());
                 for (Map.Entry<DatabaseField, DatabaseField> entry : targetToSourceKeyFields.entrySet()) {
                     sourceFields.add(entry.getValue());
                     targetFields.add(entry.getKey());
@@ -642,7 +642,7 @@
             Expression newLeft = null;
             if (composite) {
                 // For composite ids an array comparison is used, this only works on some databases.
-                List fieldExpressions = new ArrayList();
+                List<Expression> fieldExpressions = new ArrayList<>();
                 for (DatabaseField field : sourceFields) {
                     fieldExpressions.add(left.getField(field));
                 }
@@ -657,12 +657,12 @@
                 ConstantExpression constant = (ConstantExpression)right;
                 if (constant.getValue() instanceof Collection) {
                     Collection objects = (Collection)constant.getValue();
-                    List newObjects = new ArrayList(objects.size());
+                    List<Object> newObjects = new ArrayList<>(objects.size());
                     for (Object object : objects) {
                         if (object instanceof Expression) {
                             if (composite) {
                                 // For composite ids an array comparison is used, this only works on some databases.
-                                List values = new ArrayList();
+                                List<Expression> values = new ArrayList<>();
                                 for (DatabaseField field : targetFields) {
                                     values.add(((Expression)object).getField(field));
                                 }
@@ -673,7 +673,7 @@
                         } else if (descriptor.getJavaClass().isInstance(object)) {
                             if (composite) {
                                 // For composite ids an array comparison is used, this only works on some databases.
-                                List values = new ArrayList();
+                                List<Object> values = new ArrayList<>();
                                 for (DatabaseField field : targetFields) {
                                     values.add(descriptor.getObjectBuilder().extractValueFromObjectForField(object, field, normalizer.getSession()));
                                 }
@@ -800,7 +800,7 @@
 
             // If FK joins go in the WHERE clause, want to get hold of it and
             // not put it in normalizer.additionalExpressions.
-            List<Expression> foreignKeyJoinPointer = new ArrayList(1);
+            List<Expression> foreignKeyJoinPointer = new ArrayList<>(1);
             QueryKeyExpression queryKey = (QueryKeyExpression)second;
 
             // If inside an OR the foreign key join must be on both sides.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/BasicTypeHelperImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/BasicTypeHelperImpl.java
index 5d7eb4d..05ab571 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/BasicTypeHelperImpl.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/BasicTypeHelperImpl.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
@@ -121,7 +121,7 @@
     }
 
     /** Returns the class object of the specified type. */
-    public Class getJavaClass(Object type) {
+    public Class<?> getJavaClass(Object type) {
         Class clazz = null;
         if (type instanceof Class) {
             clazz = (Class)type;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java
index f767721..5223d0e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConcurrencyUtil.java
@@ -363,7 +363,7 @@
                     String.valueOf(System.identityHashCode(cacheKeyObject)),
                     cacheKeyClass, String.valueOf(System.identityHashCode(cacheKey)),
                     activeThread, concurrencyManager.getNumberOfReaders(), concurrencyManagerId,
-                    ConversionManager.getDefaultManager().convertObject(concurrencyManagerCreationDate, String.class).toString()
+                    ConversionManager.getDefaultManager().convertObject(concurrencyManagerCreationDate, String.class)
                     // metadata of number of times the cache key suffered increases in number readers
                     , cacheKey.getTotalNumberOfKeysAcquiredForReading(),
                     cacheKey.getTotalNumberOfKeysReleasedForReading(),
@@ -372,7 +372,7 @@
 
         } else {
             return TraceLocalization.buildMessage("concurrency_util_owned_cache_key_is_not_cache_key", new Object[] {cacheKeyClass, concurrencyManager, activeThread,
-                    concurrencyManagerId, ConversionManager.getDefaultManager().convertObject(concurrencyManagerCreationDate, String.class).toString(),
+                    concurrencyManagerId, ConversionManager.getDefaultManager().convertObject(concurrencyManagerCreationDate, String.class),
                     concurrencyManager.getTotalNumberOfKeysAcquiredForReading(),
                     concurrencyManager.getTotalNumberOfKeysReleasedForReading(), concurrencyManager
                     .getTotalNumberOfKeysReleasedForReadingBlewUpExceptionDueToCacheKeyHavingReachedCounterZero(),
@@ -640,7 +640,7 @@
         // (a) Step one - try to detect dead lock
         final long startTimeMillis = System.currentTimeMillis();
         List<DeadLockComponent> deadLockExplanation = Collections.emptyList();
-        long deadLockDetectionTotalExecutionTimeMs = 0l;
+        long deadLockDetectionTotalExecutionTimeMs = 0L;
         try {
             deadLockExplanation = ExplainDeadLockUtil.SINGLETON.explainPossibleDeadLockStartRecursion(concurrencyManagerState);
         } catch (Exception codeIsBuggyAndBlowingUp) {
@@ -787,7 +787,6 @@
         }
         // (b) Try to build a string that lists all of the active locks on the thread
         // Loop over all of the deferred locks and print them
-        @SuppressWarnings("unchecked")
         List<ConcurrencyManager> deferredLocks = new ArrayList<>(lockManager.getDeferredLocks());
         writer.write(TraceLocalization.buildMessage("concurrency_util_summary_deferred_locks_on_thread_3", new Object[] {deferredLocks.size()}));
         for (int deferredLockNumber = 0; deferredLockNumber < deferredLocks.size(); deferredLockNumber++) {
@@ -821,7 +820,6 @@
         }
         // (b) Try to build a string that lists all of the acitve locks on the thread
         // Loop over al of the active locks and print them
-        @SuppressWarnings("unchecked")
         List<ConcurrencyManager> readLocks = readLockManager.getReadLocks();
         writer.write(TraceLocalization.buildMessage("concurrency_util_summary_read_locks_on_thread_step001_3", new Object[] {readLocks.size()}));
         for (int readLockNumber = 0; readLockNumber < readLocks.size(); readLockNumber++) {
@@ -850,7 +848,7 @@
                 readLockNumber++;
                 writer.write(TraceLocalization.buildMessage("concurrency_util_summary_read_locks_on_thread_step002_3", new Object[] {readLockNumber,
                         SINGLETON.createToStringExplainingOwnedCacheKey(currentReadLockAcquiredAndNeverReleased.getCacheKeyWhoseNumberOfReadersThreadIsIncrementing()),
-                        ConversionManager.getDefaultManager().convertObject(currentReadLockAcquiredAndNeverReleased.getDateOfReadLockAcquisition(), String.class).toString(),
+                        ConversionManager.getDefaultManager().convertObject(currentReadLockAcquiredAndNeverReleased.getDateOfReadLockAcquisition(), String.class),
                         currentReadLockAcquiredAndNeverReleased.getNumberOfReadersOnCacheKeyBeforeIncrementingByOne(),
                         currentReadLockAcquiredAndNeverReleased.getCurrentThreadStackTraceInformationCpuTimeCostMs()}));
                 String stackTraceInformation = currentReadLockAcquiredAndNeverReleased.getCurrentThreadStackTraceInformation();
@@ -1543,8 +1541,7 @@
 
             // (b) First we focus on the active locks owned by the thread
             // enrich the map of cache key to thread doing something in respect to the cache key
-            for (Object activeLockObj : currentValue.getActiveLocks()) {
-                ConcurrencyManager activeLock = (ConcurrencyManager) activeLockObj;
+            for (ConcurrencyManager activeLock : currentValue.getActiveLocks()) {
                 CacheKeyToThreadRelationships dto = get(activeLock, mapOfCacheKeyToDtosExplainingThreadExpectationsOnCacheKey);
                 dto.addThreadsThatAcquiredActiveLock(currentThread);
             }
@@ -1552,8 +1549,7 @@
             // (c) Now we go over the defferred locks on this thread
             // (e.g. object locks that it could not acquire because some other thread was active at the time owning the
             // lock)
-            for (Object deferredLockObj : currentValue.getDeferredLocks()) {
-                ConcurrencyManager deferredLock = (ConcurrencyManager) deferredLockObj;
+            for (ConcurrencyManager deferredLock : currentValue.getDeferredLocks()) {
                 CacheKeyToThreadRelationships dto = get(deferredLock, mapOfCacheKeyToDtosExplainingThreadExpectationsOnCacheKey);
                 dto.addThreadsThatAcquiredDeferredLock(currentThread);
             }
@@ -1599,7 +1595,7 @@
         Thread currentThread = Thread.currentThread();
         StringWriter writer = new StringWriter();
         writer.write(TraceLocalization.buildMessage("concurrency_util_read_lock_manager_problem01", new Object[] {currentThread.getName(), currentNumberOfReaders, decrementedNumberOfReaders,
-                ConcurrencyUtil.SINGLETON.createToStringExplainingOwnedCacheKey(cacheKey), enrichGenerateThreadDumpForCurrentThread(), ConversionManager.getDefaultManager().convertObject(new Date(), String.class).toString()}));
+                ConcurrencyUtil.SINGLETON.createToStringExplainingOwnedCacheKey(cacheKey), enrichGenerateThreadDumpForCurrentThread(), ConversionManager.getDefaultManager().convertObject(new Date(), String.class)}));
         AbstractSessionLog.getLog().log(SessionLog.SEVERE, SessionLog.CACHE, writer.toString(), new Object[] {}, false);
         return writer.toString();
     }
@@ -1608,7 +1604,7 @@
         Thread currentThread = Thread.currentThread();
         StringWriter writer = new StringWriter();
         writer.write(TraceLocalization.buildMessage("concurrency_util_read_lock_manager_problem02", new Object[] {currentThread.getName(), SINGLETON.createToStringExplainingOwnedCacheKey(cacheKey),
-                threadId, enrichGenerateThreadDumpForCurrentThread(), ConversionManager.getDefaultManager().convertObject(new Date(), String.class).toString()}));
+                threadId, enrichGenerateThreadDumpForCurrentThread(), ConversionManager.getDefaultManager().convertObject(new Date(), String.class)}));
         // We do log immediately the error as we spot it
         AbstractSessionLog.getLog().log(SessionLog.SEVERE, SessionLog.CACHE, writer.toString(), new Object[] {}, false);
         // we also return the error message we just logged to added it to our tracing permanently
@@ -1619,7 +1615,7 @@
         Thread currentThread = Thread.currentThread();
         StringWriter writer = new StringWriter();
         writer.write(TraceLocalization.buildMessage("concurrency_util_read_lock_manager_problem03", new Object[] {currentThread.getName(), SINGLETON.createToStringExplainingOwnedCacheKey(cacheKey),
-                threadId, enrichGenerateThreadDumpForCurrentThread(), ConversionManager.getDefaultManager().convertObject(new Date(), String.class).toString()}));
+                threadId, enrichGenerateThreadDumpForCurrentThread(), ConversionManager.getDefaultManager().convertObject(new Date(), String.class)}));
         // We do log immediately the error as we spot it
         AbstractSessionLog.getLog().log(SessionLog.SEVERE, SessionLog.CACHE, writer.toString(), new Object[] {}, false);
         // we also return the error message we just logged to added it to our tracing permanently
@@ -1638,7 +1634,7 @@
     public ReadLockAcquisitionMetadata createReadLockAcquisitionMetadata(ConcurrencyManager concurrencyManager) {
         final boolean isAllowTakingStackTraceDuringReadLockAcquisition = isAllowTakingStackTraceDuringReadLockAcquisition();
         String currentThreadStackTraceInformation = TraceLocalization.buildMessage("concurrency_util_read_lock_acquisition_metadata");
-        long currentThreadStackTraceInformationCpuTimeCostMs = 0l;
+        long currentThreadStackTraceInformationCpuTimeCostMs = 0L;
         if (isAllowTakingStackTraceDuringReadLockAcquisition) {
             long startTimeMillis = System.currentTimeMillis();
             currentThreadStackTraceInformation = enrichGenerateThreadDumpForCurrentThread();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConversionManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConversionManager.java
index 2bf15f1..4d828b8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConversionManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ConversionManager.java
@@ -36,7 +36,6 @@
 import java.time.LocalDateTime;
 import java.time.ZoneId;
 import java.time.ZoneOffset;
-import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.HashMap;
 import java.util.Hashtable;
@@ -1106,7 +1105,6 @@
      * Resolve the given String className into a class using this
      * ConversionManager's classloader.
      */
-    @SuppressWarnings({"unchecked"})
     public <T> Class<T> convertClassNameToClass(String className) throws ConversionException {
         return convertObjectToClass(className);
     }
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 c5a8f2a..80be3fb 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
@@ -107,7 +107,7 @@
             return sb.toString();
         }
 
-        protected String getTruncatedSHA1Name(String argName, String prefix) {
+        private String getTruncatedSHA1Name(String argName, String prefix) {
             if (argName.length() >= ARGNAME_SIZE_LIMIT) {
                 StringBuilder sb = new StringBuilder();
                 //the truncated SHA is great, but a PL/SQL identifier
@@ -170,12 +170,12 @@
         }
 
         public void translate(PLSQLargument arg, AbstractRecord translationRow,
-                AbstractRecord copyOfTranslationRow, List copyOfTranslationFields,
-                List translationRowFields, List translationRowValues,
-                StoredProcedureCall call) {
+                              AbstractRecord copyOfTranslationRow, List<DatabaseField> copyOfTranslationFields,
+                              List<DatabaseField> translationRowFields, List translationRowValues,
+                              StoredProcedureCall call) {
             DatabaseField field = null;
-            for (Iterator i = copyOfTranslationFields.iterator(); i.hasNext(); ) {
-                DatabaseField f = (DatabaseField)i.next();
+            for (Iterator<DatabaseField> i = copyOfTranslationFields.iterator(); i.hasNext(); ) {
+                DatabaseField f = i.next();
                 if (f.getName().equals(arg.name)) {
                     field = f;
                     break;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ExplainDeadLockUtil.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ExplainDeadLockUtil.java
index cc6d074..ee97256 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ExplainDeadLockUtil.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ExplainDeadLockUtil.java
@@ -23,8 +23,6 @@
 import java.io.StringWriter;
 import java.util.*;
 
-import static java.lang.String.format;
-
 /**
  * The purpose of this class is to try explain the nature of a dead lock
  */
@@ -103,7 +101,7 @@
         Map<Thread, DeadLockComponent> helperMap = new HashMap<>();
 
         // (c) start our correction loop
-        List<DeadLockComponent> deadLockAsSimpleList = new ArrayList<DeadLockComponent>();
+        List<DeadLockComponent> deadLockAsSimpleList = new ArrayList<>();
         while (currentElementToIterate != null) {
 
             // (d) In this chaing of DTOs we built during our recursion
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/Helper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/Helper.java
index a18b402..691ba0d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/Helper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/Helper.java
@@ -32,7 +32,6 @@
 import java.io.Serializable;
 import java.io.StringWriter;
 import java.io.Writer;
-import java.lang.reflect.Array;
 import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
@@ -43,7 +42,6 @@
 import java.security.PrivilegedActionException;
 import java.sql.Timestamp;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Date;
@@ -240,8 +238,8 @@
         getCalendarCache().offer(calendar);
     }
 
-    public static void addAllToVector(Vector theVector, Vector elementsToAdd) {
-        for (Enumeration stream = elementsToAdd.elements(); stream.hasMoreElements();) {
+    public static <E> void addAllToVector(Vector<E> theVector, Vector<? extends E> elementsToAdd) {
+        for (Enumeration<? extends E> stream = elementsToAdd.elements(); stream.hasMoreElements();) {
             theVector.addElement(stream.nextElement());
         }
     }
@@ -277,7 +275,7 @@
     /**
     * Convert the specified vector into an array.
     */
-    public static Object[] arrayFromVector(Vector vector) {
+    public static Object[] arrayFromVector(Vector<?> vector) {
         Object[] result = new Object[vector.size()];
         for (int i = 0; i < vector.size(); i++) {
             result[i] = vector.elementAt(i);
@@ -421,8 +419,8 @@
      * Return whether a Class is a subclass of, or the same as, another Class.
      * @return boolean
      */
-    public static boolean classIsSubclass(Class subClass, Class superClass) {
-        Class temp = subClass;
+    public static boolean classIsSubclass(Class<?> subClass, Class<?> superClass) {
+        Class<?> temp = subClass;
 
         if (superClass == null) {
             return false;
@@ -523,8 +521,8 @@
         return res;
     }
 
-    public static Class getClassFromClasseName(String className, ClassLoader classLoader){
-        Class convertedClass = null;
+    public static <T> Class<T> getClassFromClasseName(String className, ClassLoader classLoader){
+        Class<T> convertedClass = null;
         if(className==null){
             return null;
         }
@@ -552,12 +550,12 @@
         if (aString.length() > 3 && (aString.startsWith("[L") && aString.endsWith(";"))) {
             return aString.substring(2, aString.length() - 1);
         } else if (aString.startsWith("[")){
-            Class primitiveClass = null;
+            Class<?> primitiveClass = null;
             try {
                 primitiveClass = Class.forName(aString);
             } catch (ClassNotFoundException cnf) {
                 // invalid name specified - do not rethrow exception
-                primitiveClass = null;
+                // primitiveClass is still null;
             }
             if (primitiveClass != null) {
                 return primitiveClass.getComponentType().getName();
@@ -633,15 +631,15 @@
     * same and each of the types in the first Vector are assignable from the types
     * in the corresponding objects in the second Vector.
     */
-    public static boolean areTypesAssignable(List types1, List types2) {
+    public static boolean areTypesAssignable(List<Class<?>> types1, List<Class<?>> types2) {
         if ((types1 == null) || (types2 == null)) {
             return false;
         }
 
         if (types1.size() == types2.size()) {
             for (int i = 0; i < types1.size(); i++) {
-                Class type1 = (Class)types1.get(i);
-                Class type2 = (Class)types2.get(i);
+                Class<?> type1 = types1.get(i);
+                Class<?> type2 = types2.get(i);
 
                 // if either are null then we assume assignability.
                 if ((type1 != null) && (type2 != null)) {
@@ -662,16 +660,15 @@
       *
       * Added Nov 9, 2000 JED Patch 2.5.1.8
       */
-    public static boolean compareHashtables(Hashtable hashtable1, Hashtable hashtable2) {
-        Enumeration enumtr;
+    public static boolean compareHashtables(Hashtable<?, ?> hashtable1, Hashtable<?, ?> hashtable2) {
+        Enumeration<?> enumtr;
         Object element;
-        Hashtable clonedHashtable;
 
         if (hashtable1.size() != hashtable2.size()) {
             return false;
         }
 
-        clonedHashtable = (Hashtable)hashtable2.clone();
+        Hashtable<?, ?> clonedHashtable = (Hashtable<?, ?>)hashtable2.clone();
 
         enumtr = hashtable1.elements();
         while (enumtr.hasMoreElements()) {
@@ -689,8 +686,8 @@
      * check for BigDecimals as well.
      */
     public static boolean comparePotentialArrays(Object firstValue, Object secondValue) {
-        Class<? extends Object> firstClass = firstValue.getClass();
-        Class<? extends Object> secondClass = secondValue.getClass();
+        Class<?> firstClass = firstValue.getClass();
+        Class<?> secondClass = secondValue.getClass();
 
         // Arrays must be checked for equality because default does identity
         if ((firstClass == ClassConstants.APBYTE) && (secondClass == ClassConstants.APBYTE)) {
@@ -711,8 +708,8 @@
     /**
      * Merge the two Maps into a new HashMap.
      */
-    public static Map concatenateMaps(Map first, Map second) {
-        Map concatenation = new HashMap(first.size() + second.size() + 4);
+    public static <K, V> Map<K, V> concatenateMaps(Map<? extends K, ? extends V> first, Map<? extends K, ? extends V> second) {
+        Map<K, V> concatenation = new HashMap<>(first.size() + second.size() + 4);
 
         concatenation.putAll(first);
         concatenation.putAll(second);
@@ -723,17 +720,17 @@
     /**
       * Return a new vector with no duplicated values.
       */
-    public static Vector concatenateUniqueVectors(Vector first, Vector second) {
-        Vector concatenation;
-        Object element;
+    public static <E> Vector<E> concatenateUniqueVectors(Vector<? extends E> first, Vector<? extends E> second) {
+        Vector<E> concatenation;
+        E element;
 
         concatenation = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
 
-        for (Enumeration stream = first.elements(); stream.hasMoreElements();) {
+        for (Enumeration<? extends E> stream = first.elements(); stream.hasMoreElements();) {
             concatenation.addElement(stream.nextElement());
         }
 
-        for (Enumeration stream = second.elements(); stream.hasMoreElements();) {
+        for (Enumeration<? extends E> stream = second.elements(); stream.hasMoreElements();) {
             element = stream.nextElement();
             if (!concatenation.contains(element)) {
                 concatenation.addElement(element);
@@ -747,11 +744,11 @@
     /**
       * Return a new List with no duplicated values.
       */
-    public static List concatenateUniqueLists(List first, List second) {
-        List concatenation = new ArrayList(first.size() + second.size());
+    public static <E> List<E> concatenateUniqueLists(List<? extends E> first, List<? extends E> second) {
+        List<E> concatenation = new ArrayList<>(first.size() + second.size());
         concatenation.addAll(first);
 
-        for (Object element : second) {
+        for (E element : second) {
             if (!concatenation.contains(element)) {
                 concatenation.add(element);
             }
@@ -761,16 +758,16 @@
 
     }
 
-    public static Vector concatenateVectors(Vector first, Vector second) {
-        Vector concatenation;
+    public static <E> Vector<E> concatenateVectors(Vector<? extends E> first, Vector<? extends E> second) {
+        Vector<E> concatenation;
 
         concatenation = org.eclipse.persistence.internal.helper.NonSynchronizedVector.newInstance();
 
-        for (Enumeration stream = first.elements(); stream.hasMoreElements();) {
+        for (Enumeration<? extends E> stream = first.elements(); stream.hasMoreElements();) {
             concatenation.addElement(stream.nextElement());
         }
 
-        for (Enumeration stream = second.elements(); stream.hasMoreElements();) {
+        for (Enumeration<? extends E> stream = second.elements(); stream.hasMoreElements();) {
             concatenation.addElement(stream.nextElement());
         }
 
@@ -784,8 +781,8 @@
      *  @param startIndex - starting position in vector
      *  @param stopIndex - ending position in vector
      */
-    public static Vector copyVector(List originalVector, int startIndex, int stopIndex) throws ValidationException {
-        Vector newVector;
+    public static <E> Vector<E> copyVector(List<E> originalVector, int startIndex, int stopIndex) throws ValidationException {
+        Vector<E> newVector;
 
         if (stopIndex < startIndex) {
             return NonSynchronizedVector.newInstance();
@@ -1001,7 +998,7 @@
      * the superclass is checked, and so on, recursively.
      * Set accessible to true, so we can access private/package/protected fields.
      */
-    public static Field getField(Class javaClass, String fieldName) throws NoSuchFieldException {
+    public static Field getField(Class<?> javaClass, String fieldName) throws NoSuchFieldException {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
             try {
                 return AccessController.doPrivileged(new PrivilegedGetField(javaClass, fieldName, true));
@@ -1021,7 +1018,7 @@
      * is checked, and so on, recursively. Set accessible to true, so we can
      * access private/package/protected methods.
      */
-    public static Method getDeclaredMethod(Class javaClass, String methodName) throws NoSuchMethodException {
+    public static Method getDeclaredMethod(Class<?> javaClass, String methodName) throws NoSuchMethodException {
         return getDeclaredMethod(javaClass, methodName, null);
     }
 
@@ -1033,7 +1030,7 @@
      * superclass is checked, and so on, recursively. Set accessible to true,
      * so we can access private/package/protected methods.
      */
-    public static Method getDeclaredMethod(Class javaClass, String methodName, Class[] methodParameterTypes) throws NoSuchMethodException {
+    public static Method getDeclaredMethod(Class<?> javaClass, String methodName, Class<?>[] methodParameterTypes) throws NoSuchMethodException {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
             try {
                 return AccessController.doPrivileged(
@@ -1056,7 +1053,7 @@
     /**
      * Return the class instance from the class
      */
-    public static Object getInstanceFromClass(Class classFullName) {
+    public static Object getInstanceFromClass(Class<?> classFullName) {
         if (classFullName == null) {
             return null;
         }
@@ -1064,7 +1061,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 try {
-                    return AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(classFullName));
+                    return AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(classFullName));
                 } catch (PrivilegedActionException exception) {
                     Exception throwableException = exception.getException();
                     if (throwableException instanceof InstantiationException) {
@@ -1080,14 +1077,10 @@
             } else {
                 return PrivilegedAccessHelper.newInstanceFromClass(classFullName);
             }
-        } catch (InstantiationException notInstantiatedException) {
+        } catch (ReflectiveOperationException notInstantiatedException) {
             ValidationException exception = new ValidationException();
             exception.setInternalException(notInstantiatedException);
             throw exception;
-        } catch (IllegalAccessException notAccessedException) {
-            ValidationException exception = new ValidationException();
-            exception.setInternalException(notAccessedException);
-            throw exception;
         }
     }
 
@@ -1101,7 +1094,7 @@
     /**
      *    Answers the unqualified class name for the provided class.
      */
-    public static String getShortClassName(Class javaClass) {
+    public static String getShortClassName(Class<?> javaClass) {
         return getShortClassName(javaClass.getName());
     }
 
@@ -1122,7 +1115,7 @@
     /**
      *    return a package name for the specified class.
      */
-    public static String getPackageName(Class javaClass) {
+    public static String getPackageName(Class<?> javaClass) {
         String className = Helper.getShortClassName(javaClass);
         return javaClass.getName().substring(0, (javaClass.getName().length() - (className.length() + 1)));
     }
@@ -1146,7 +1139,7 @@
      * This is needed in jdk1.1, where <code>Vector.contains(Object)</code>
      * for a <code>null</code> element will result in a <code>NullPointerException</code>....
      */
-    public static int indexOfNullElement(Vector v, int index) {
+    public static int indexOfNullElement(Vector<?> v, int index) {
         int size = v.size();
         for (int i = index; i < size; i++) {
             if (v.elementAt(i) == null) {
@@ -1160,7 +1153,7 @@
      * ADVANCED
      * returns true if the class in question is a primitive wrapper
      */
-    public static boolean isPrimitiveWrapper(Class classInQuestion) {
+    public static boolean isPrimitiveWrapper(Class<?> classInQuestion) {
         return classInQuestion.equals(Character.class) || classInQuestion.equals(Boolean.class) || classInQuestion.equals(Byte.class) || classInQuestion.equals(Short.class) || classInQuestion.equals(Integer.class) || classInQuestion.equals(Long.class) || classInQuestion.equals(Float.class) || classInQuestion.equals(Double.class);
     }
 
@@ -1201,22 +1194,21 @@
      * If it's a Collection, iterate over the collection and add each item to the Vector.
      * If it's not a collection create a Vector and add the object to it.
      */
-    public static Vector makeVectorFromObject(Object theObject) {
+    @SuppressWarnings({"unchecked"})
+    public static <T> Vector<T> makeVectorFromObject(Object theObject) {
         if (theObject instanceof Vector) {
-            return ((Vector)theObject);
+            return ((Vector<T>)theObject);
         }
         if (theObject instanceof Collection) {
-            Vector returnVector = new Vector(((Collection)theObject).size());
-            Iterator iterator = ((Collection)theObject).iterator();
-            while (iterator.hasNext()) {
-                returnVector.add(iterator.next());
-            }
+            Collection<? extends T> col = ((Collection<? extends T>)theObject);
+            Vector<T> returnVector = new Vector<>(col.size());
+            returnVector.addAll(col);
             return returnVector;
         }
 
-        Vector returnVector = new Vector();
+        Vector<Object> returnVector = new Vector<>();
         returnVector.addElement(theObject);
-        return returnVector;
+        return (Vector<T>) returnVector;
     }
 
     /**
@@ -1232,7 +1224,7 @@
         while (tokenizer.hasMoreTokens()) {
             token = tokenizer.nextToken();
             if (tokenizer.hasMoreTokens()) {
-                directoryName.append(token + File.separator);
+                directoryName.append(token).append(File.separator);
             }
         }
         FileOutputStream fos = null;
@@ -1314,10 +1306,10 @@
     /**
      * Given a Vector, print it, even if there is a null in it
      */
-    public static String printVector(Vector vector) {
+    public static String printVector(Vector<?> vector) {
         StringWriter stringWriter = new StringWriter();
         stringWriter.write("[");
-        Enumeration enumtr = vector.elements();
+        Enumeration<?> enumtr = vector.elements();
         stringWriter.write(String.valueOf(enumtr.nextElement()));
         while (enumtr.hasMoreElements()) {
             stringWriter.write(" ");
@@ -1328,26 +1320,26 @@
 
     }
 
-    public static Hashtable rehashHashtable(Hashtable table) {
-        Hashtable rehashedTable = new Hashtable(table.size() + 2);
+    public static <K, V> Hashtable<K, V> rehashHashtable(Hashtable<K, V> table) {
+        Hashtable<K, V> rehashedTable = new Hashtable<>(table.size() + 2);
 
-        Enumeration values = table.elements();
-        for (Enumeration keys = table.keys(); keys.hasMoreElements();) {
-            Object key = keys.nextElement();
-            Object value = values.nextElement();
+        Enumeration<V> values = table.elements();
+        for (Enumeration<K> keys = table.keys(); keys.hasMoreElements();) {
+            K key = keys.nextElement();
+            V value = values.nextElement();
             rehashedTable.put(key, value);
         }
 
         return rehashedTable;
     }
 
-    public static Map rehashMap(Map table) {
-        HashMap rehashedTable = new HashMap(table.size() + 2);
+    public static <K, V> Map<K, V> rehashMap(Map<K, V> table) {
+        Map<K, V> rehashedTable = new HashMap<>(table.size() + 2);
 
-        Iterator values = table.values().iterator();
-        for (Iterator keys = table.keySet().iterator(); keys.hasNext();) {
-            Object key = keys.next();
-            Object value = values.next();
+        Iterator<V> values = table.values().iterator();
+        for (Iterator<K> keys = table.keySet().iterator(); keys.hasNext();) {
+            K key = keys.next();
+            V value = values.next();
             rehashedTable.put(key, value);
         }
 
@@ -1457,9 +1449,9 @@
         return null;
     }
 
-    public static Vector reverseVector(Vector theVector) {
-        Vector tempVector = new Vector(theVector.size());
-        Object currentElement;
+    public static <T> Vector<T> reverseVector(Vector<T> theVector) {
+        Vector<T> tempVector = new Vector<>(theVector.size());
+        T currentElement;
 
         for (int i = theVector.size() - 1; i > -1; i--) {
             currentElement = theVector.elementAt(i);
@@ -1542,7 +1534,7 @@
         }
 
         //
-        return buf1.toString() + buf2.toString();
+        return buf1.toString() + buf2;
     }
 
     /**
@@ -2156,14 +2148,14 @@
                     //need to reverse the string
                     //bug fix: 3016423. append(BunfferString) is jdk1.4 version api. Use append(String) instead
                     //in order to support jdk1.3.
-                    newStringBuffer.append(newStringBufferTmp.reverse().toString());
+                    newStringBuffer.append(newStringBufferTmp.reverse());
                     return newStringBuffer.toString();
                 }
             }
         }
 
         //the shrunk string still too long, revrese the order back and truncate it!
-        return newStringBufferTmp.reverse().toString().substring(0, size);
+        return newStringBufferTmp.reverse().substring(0, size);
     }
 
     /**
@@ -2219,8 +2211,8 @@
     /**
      * Convert the specified array into a vector.
      */
-    public static Vector vectorFromArray(Object[] array) {
-        Vector result = new Vector(array.length);
+    public static <T> Vector<T> vectorFromArray(T[] array) {
+        Vector<T> result = new Vector<>(array.length);
         for (int i = 0; i < array.length; i++) {
             result.addElement(array[i]);
         }
@@ -2258,7 +2250,7 @@
      * specified object in the specified list.
      * If the list is null or empty (or both the object and the list is null), 0 is returned.
      */
-    public static int countOccurrencesOf(Object comparisonObject, List list) {
+    public static int countOccurrencesOf(Object comparisonObject, List<?> list) {
         int instances = 0;
         boolean comparisonObjectIsNull = comparisonObject == null;
         if (list != null) {
@@ -2422,7 +2414,7 @@
     public static boolean isLob(DatabaseField field) {
         int sqlType = field.sqlType;
         if (sqlType == DatabaseField.NULL_SQL_TYPE) {
-            Class type = field.getType();
+            Class<?> type = field.getType();
             if (type != null) {
                 return ClassConstants.BLOB.equals(type) || ClassConstants.CLOB.equals(type);
             } else {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ReadLockManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ReadLockManager.java
index 24d7cb3..97ebd06 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ReadLockManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/ReadLockManager.java
@@ -150,7 +150,6 @@
      * that want to dump a snapshot of the current state of the system
      * or to go about doing
      */
-    @SuppressWarnings("unchecked")
     @Override
     public synchronized ReadLockManager clone() {
         ReadLockManager clone = new ReadLockManager();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/JPQLQueryContext.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/JPQLQueryContext.java
index 15fc951..8d5ff3f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/JPQLQueryContext.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/jpql/JPQLQueryContext.java
@@ -16,7 +16,6 @@
 package org.eclipse.persistence.internal.jpa.jpql;
 
 import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
 import java.security.AccessController;
 import java.security.PrivilegedActionException;
 import java.util.Collection;
@@ -59,7 +58,6 @@
  * @author Pascal Filion
  * @author John Bracken
  */
-@SuppressWarnings("nls")
 final class JPQLQueryContext {
 
     /**
@@ -964,7 +962,7 @@
         StringBuilder sb = new StringBuilder();
         sb.append(typeName.substring(0, index));
         sb.append("$");
-        sb.append(typeName.substring(index + 1, typeName.length()));
+        sb.append(typeName.substring(index + 1));
         typeName = sb.toString();
 
         return loadTypeImp(typeName);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/AggregateNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/AggregateNode.java
index 1129ccc..7b76b55 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/AggregateNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/AggregateNode.java
@@ -14,6 +14,8 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.jpa.parsing;
 
+import org.eclipse.persistence.expressions.Expression;
+
 /**
  * INTERNAL
  * <p><b>Purpose</b>: Superclass for Aggregate Nodes
@@ -23,9 +25,6 @@
  *    @author Jon Driscoll
  *    @since TopLink 5.0
  */
-
-import org.eclipse.persistence.expressions.Expression;
-
 public abstract class AggregateNode extends Node implements AliasableNode {
 
     private boolean distinct = false;
@@ -43,7 +42,7 @@
      * resolveClass: Answer the class associated with my left node.
      */
     @Override
-    public Class resolveClass(GenerationContext context) {
+    public Class<?> resolveClass(GenerationContext context) {
         return getLeft().resolveClass(context);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/AttributeNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/AttributeNode.java
index 3eaa0bc..817bb3d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/AttributeNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/AttributeNode.java
@@ -87,7 +87,7 @@
             return exp;
         }
         TypeHelper typeHelper = context.getParseTreeContext().getTypeHelper();
-        Class cast = (Class)typeHelper.resolveSchema(castClassName);
+        Class<?> cast = (Class<?>)typeHelper.resolveSchema(castClassName);
         return exp.treat(cast);
     }
 
@@ -195,7 +195,7 @@
      * resolveMapping: Answer the mapping which corresponds to my variableName.
      */
     @Override
-    public DatabaseMapping resolveMapping(GenerationContext context, Class ownerClass) {
+    public DatabaseMapping resolveMapping(GenerationContext context, Class<?> ownerClass) {
         ClassDescriptor descriptor = context.getSession().getDescriptor(ownerClass);
         return (descriptor==null) ? null : descriptor.getObjectBuilder().getMappingForAttributeName(getAttributeName());
     }
@@ -205,7 +205,7 @@
      * Answer null if the node represents a mapping that doesn't exist
      */
     @Override
-    public Class resolveClass(GenerationContext context, Class ownerClass) {
+    public Class<?> resolveClass(GenerationContext context, Class<?> ownerClass) {
         DatabaseMapping mapping;
 
         mapping = resolveMapping(context, ownerClass);
@@ -227,7 +227,7 @@
     public String toString(int indent) {
         StringBuilder buffer = new StringBuilder();
         toStringIndent(indent, buffer);
-        buffer.append(toStringDisplayName() + "[" + getAttributeName() + "]");
+        buffer.append(toStringDisplayName()).append("[").append(getAttributeName()).append("]");
         return buffer.toString();
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/CaseNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/CaseNode.java
index 1643e28..a6ca75d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/CaseNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/CaseNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -17,6 +17,7 @@
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
+import java.util.Map;
 
 import org.eclipse.persistence.expressions.Expression;
 import org.eclipse.persistence.queries.ObjectLevelReadQuery;
@@ -33,7 +34,7 @@
  */
 public class CaseNode extends Node implements AliasableNode {
 
-    private List whenClauses = null;
+    private List<Node> whenClauses = null;
 
 
     public CaseNode(){
@@ -49,7 +50,7 @@
         if (theQuery instanceof ReportQuery) {
             ReportQuery reportQuery = (ReportQuery)theQuery;
             Expression expression = generateExpression(generationContext);
-            reportQuery.addAttribute("Case", expression, (Class)getType());
+            reportQuery.addAttribute("Case", expression, (Class<?>)getType());
         }
     }
 
@@ -59,8 +60,8 @@
      */
     @Override
     public Expression generateExpression(GenerationContext context) {
-        LinkedHashMap whenClauseMap = new LinkedHashMap(whenClauses.size());
-        Iterator i = whenClauses.iterator();
+        Map<Expression, Expression> whenClauseMap = new LinkedHashMap<>(whenClauses.size());
+        Iterator<Node> i = whenClauses.iterator();
         while (i.hasNext()){
             WhenThenNode clause = (WhenThenNode)i.next();
             whenClauseMap.put(clause.generateExpressionForWhen(context), clause.generateExpressionForThen(context));
@@ -82,10 +83,10 @@
             left.validate(context);
         }
         right.validate(context);
-        Iterator i = whenClauses.iterator();
+        Iterator<Node> i = whenClauses.iterator();
         Object type = null;
         while (i.hasNext()){
-            Node node = ((Node)i.next());
+            Node node = i.next();
             node.validate(context);
             if (type == null){
                 type = node.getType();
@@ -100,11 +101,11 @@
     }
 
 
-    public List getWhenClauses() {
+    public List<Node> getWhenClauses() {
         return whenClauses;
     }
 
-    public void setWhenClauses(List whenClauses) {
+    public void setWhenClauses(List<Node> whenClauses) {
         this.whenClauses = whenClauses;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/CoalesceNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/CoalesceNode.java
index 5b4c78c..387951c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/CoalesceNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/CoalesceNode.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 @@
  */
 public class CoalesceNode extends Node implements AliasableNode {
 
-    private List clauses = null;
+    private List<Node> clauses = null;
 
     public CoalesceNode(){
         super();
@@ -58,23 +58,22 @@
      */
     @Override
     public Expression generateExpression(GenerationContext context) {
-        List expressions = new ArrayList();
-        Iterator i = clauses.iterator();
+        List<Expression> expressions = new ArrayList<>();
+        Iterator<Node> i = clauses.iterator();
         while (i.hasNext()){
-            expressions.add(((Node)i.next()).generateExpression(context));
+            expressions.add(i.next().generateExpression(context));
         }
 
-        Expression whereClause = context.getBaseExpression().coalesce(expressions);
-        return whereClause;
+        return context.getBaseExpression().coalesce(expressions);
     }
 
     @Override
     public void validate(ParseTreeContext context) {
         TypeHelper typeHelper = context.getTypeHelper();
-        Iterator i = clauses.iterator();
+        Iterator<Node> i = clauses.iterator();
         Object type = null;
         while (i.hasNext()){
-            Node node = ((Node)i.next());
+            Node node = i.next();
             node.validate(context);
             if (type == null){
                 type = node.getType();
@@ -82,14 +81,14 @@
                 type = typeHelper.getObjectType();
             }
         }
-        setType(((Node)clauses.get(0)).getType());
+        setType(clauses.get(0).getType());
     }
 
-    public List getClauses() {
+    public List<Node> getClauses() {
         return clauses;
     }
 
-    public void setClauses(List clauses) {
+    public void setClauses(List<Node> clauses) {
         this.clauses = clauses;
     }
 
@@ -104,9 +103,9 @@
         buffer.append("COALESCE");
         buffer.append("(");
 
-        Iterator i = clauses.iterator();
+        Iterator<Node> i = clauses.iterator();
         while (i.hasNext()) {
-            Node n = (Node) i.next();
+            Node n = i.next();
             buffer.append(n.toString(indent));
             buffer.append("\r\n");
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ConcatNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ConcatNode.java
index 0364fc3..f1b8d8b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ConcatNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ConcatNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -30,7 +30,7 @@
  */
 public class ConcatNode extends StringFunctionNode {
 
-    protected List objects = null;
+    protected List<Node> objects = null;
 
     /**
      * ConcatNode constructor comment.
@@ -47,9 +47,9 @@
     public void validate(ParseTreeContext context) {
         super.validate(context);
         TypeHelper typeHelper = context.getTypeHelper();
-        Iterator i = objects.iterator();
+        Iterator<Node> i = objects.iterator();
         while (i.hasNext()){
-            Node node = (Node)i.next();
+            Node node = i.next();
             node.validate(context);
             node.validateParameter(context, typeHelper.getStringType());
         }
@@ -62,14 +62,14 @@
      */
     @Override
     public Expression generateExpression(GenerationContext context) {
-        Expression whereClause = ((Node)objects.get(0)).generateExpression(context);
+        Expression whereClause = objects.get(0).generateExpression(context);
         for (int i=1;i<objects.size();i++){
-            whereClause = whereClause.concat(((Node)objects.get(i)).generateExpression(context));
+            whereClause = whereClause.concat(objects.get(i).generateExpression(context));
         }
         return whereClause;
     }
 
-    public void setObjects(List objects){
+    public void setObjects(List<Node> objects){
         this.objects = objects;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ConstructorNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ConstructorNode.java
index 6244bb9..57e528b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ConstructorNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ConstructorNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -34,7 +34,7 @@
     private String className = null;
 
     /** The list of constructor call argument nodes */
-    public List constructorItems = new ArrayList();
+    public List<Node> constructorItems = new ArrayList<>();
 
     /**
      * Return a new ConstructorNode
@@ -54,8 +54,8 @@
             ReportQuery reportQuery = (ReportQuery)theQuery;
             reportQuery.beginAddingConstructorArguments(
                 getConstructorClass(context.getParseTreeContext()));
-            for (Iterator i = constructorItems.iterator(); i.hasNext();) {
-                Node node = (Node)i.next();
+            for (Iterator<Node> i = constructorItems.iterator(); i.hasNext();) {
+                Node node = i.next();
                 if (selectingRelationshipField(node, context)) {
                     selectContext.useOuterJoins();
                 }
@@ -72,8 +72,8 @@
      */
     @Override
     public void validate(ParseTreeContext context) {
-        for (Iterator i = constructorItems.iterator(); i.hasNext();) {
-            Node item = (Node)i.next();
+        for (Iterator<Node> i = constructorItems.iterator(); i.hasNext();) {
+            Node item = i.next();
             item.validate(context);
         }
 
@@ -105,7 +105,7 @@
      * INTERNAL
      * Add an Order By Item to this node
      */
-    public void addConstructorItem(Object theNode) {
+    public void addConstructorItem(Node theNode) {
         constructorItems.add(theNode);
     }
 
@@ -113,7 +113,7 @@
      * INTERNAL
      * Set the list of constructor items of this node.
      */
-    public void setConstructorItems(List items) {
+    public void setConstructorItems(List<Node> items) {
         this.constructorItems = items;
     }
 
@@ -121,7 +121,7 @@
      * INTERNAL
      * Get the list of constructor items of this node.
      */
-    public List getConstructorItems() {
+    public List<Node> getConstructorItems() {
         return this.constructorItems;
     }
 
@@ -130,13 +130,13 @@
      * @exception JPQLException if the specified constructor class could not
      * be found.
      */
-    private Class getConstructorClass(ParseTreeContext context) {
+    private Class<?> getConstructorClass(ParseTreeContext context) {
         Object type = getType();
         if (type == null) {
             throw JPQLException.constructorClassNotFound(
                 context.getQueryInfo(), getLine(), getColumn(), className);
         }
-        return (Class)type;
+        return (Class<?>)type;
     }
 
     /**
@@ -163,8 +163,8 @@
         StringBuilder repr = new StringBuilder();
         repr.append("NEW ").append(className);
         repr.append("(");
-        for (Iterator i = constructorItems.iterator(); i.hasNext();) {
-            Node node = (Node)i.next();
+        for (Iterator<Node> i = constructorItems.iterator(); i.hasNext();) {
+            Node node = i.next();
             repr.append(node.getAsString());
             if (i.hasNext()) {
                 repr.append(", ");
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/DateFunctionNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/DateFunctionNode.java
index d2619db..ba0822a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/DateFunctionNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/DateFunctionNode.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 @@
  */
 public class DateFunctionNode extends FunctionalExpressionNode {
 
-    private Class type;
+    private Class<?> type;
 
     /**
      * DateFunctionNode constructor.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/DotNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/DotNode.java
index 84f9c3a..3ecabfb 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/DotNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/DotNode.java
@@ -18,7 +18,6 @@
 import org.eclipse.persistence.expressions.*;
 import org.eclipse.persistence.internal.expressions.*;
 import org.eclipse.persistence.mappings.DatabaseMapping;
-import org.eclipse.persistence.mappings.foundation.AbstractDirectMapping;
 import org.eclipse.persistence.queries.ObjectLevelReadQuery;
 import org.eclipse.persistence.queries.ReportQuery;
 
@@ -217,7 +216,7 @@
      * INTERNAL
      * Returns the attribute type if the right represents a direct-to-field mapping.
      */
-    public Class getTypeOfDirectToField(GenerationContext context) {
+    public Class<?> getTypeOfDirectToField(GenerationContext context) {
         DatabaseMapping mapping = resolveMapping(context);
         if ((mapping != null) && mapping.isDirectToFieldMapping()) {
             return mapping.getAttributeClassification();
@@ -261,7 +260,7 @@
      */
     @Override
     public DatabaseMapping resolveMapping(GenerationContext context) {
-        Class leftClass = getLeft().resolveClass(context);
+        Class<?> leftClass = getLeft().resolveClass(context);
         return getRight().resolveMapping(context, leftClass);
     }
 
@@ -269,8 +268,8 @@
     * resolveClass: Answer the class which results from traversing the mappings for the receiver's nodes
     */
     @Override
-    public Class resolveClass(GenerationContext context) {
-        Class leftClass = getLeft().resolveClass(context);
+    public Class<?> resolveClass(GenerationContext context) {
+        Class<?> leftClass = getLeft().resolveClass(context);
         return getRight().resolveClass(context, leftClass);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/FromNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/FromNode.java
index 0f04eba..2edd91a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/FromNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/FromNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -29,7 +29,7 @@
  */
 public class FromNode extends MajorNode {
 
-    private List declarations;
+    private List<Node> declarations;
 
     public String getFirstVariable() {
         String variable = null;
@@ -39,11 +39,11 @@
         return variable;
     }
 
-    public List getDeclarations() {
+    public List<Node> getDeclarations() {
         return declarations;
     }
 
-    public void setDeclarations(List decls) {
+    public void setDeclarations(List<Node> decls) {
         declarations = decls;
     }
 
@@ -56,7 +56,7 @@
     @Override
     public Node qualifyAttributeAccess(ParseTreeContext context) {
         for (int i = 0; i < declarations.size(); i++) {
-            Node decl = (Node)declarations.get(i);
+            Node decl = declarations.get(i);
             declarations.set(i, decl.qualifyAttributeAccess(context));
         }
         return this;
@@ -68,8 +68,8 @@
      */
     @Override
     public void validate(ParseTreeContext context) {
-        for (Iterator i = declarations.iterator(); i.hasNext();) {
-            Node decl = (Node)i.next();
+        for (Iterator<Node> i = declarations.iterator(); i.hasNext();) {
+            Node decl = i.next();
             decl.validate(context);
         }
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/FuncNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/FuncNode.java
index c4114d8..518bc82 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/FuncNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/FuncNode.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
@@ -47,11 +47,11 @@
         return this.name;
     }
 
-    public void setParameters(List parameters) {
+    public void setParameters(List<Node> parameters) {
         this.parameters = parameters;
     }
 
-    public List getParameters() {
+    public List<Node> getParameters() {
         return this.parameters;
     }
 
@@ -73,13 +73,12 @@
             return context.getBaseExpression().getFunction(this.name);
         }
 
-        List vExpressions = new ArrayList(size - 1);
+        List<Expression> vExpressions = new ArrayList<>(size - 1);
         Expression base = this.parameters.get(0).generateExpression(context);
         for(int i=1; i < size; i++) {
             Expression child = this.parameters.get(i).generateExpression(context);
             vExpressions.add(child);
         }
-        Expression expression = base.getFunctionWithArguments(this.name, vExpressions);
-        return expression;
+        return base.getFunctionWithArguments(this.name, vExpressions);
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/GenerationContext.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/GenerationContext.java
index b7526f1..e3dc134 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/GenerationContext.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/GenerationContext.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,9 +38,9 @@
 public class GenerationContext {
     protected AbstractSession session;
     protected ParseTreeContext parseTreeContext;
-    protected Class baseQueryClass;
+    protected Class<?> baseQueryClass;
     protected Expression baseExpression;
-    protected Hashtable expressions;
+    protected Hashtable<String, Expression> expressions;
     protected ParseTree parseTree;
     protected boolean isNotIndicatedInMemberOf = false;
 
@@ -51,7 +51,7 @@
 
     public GenerationContext() {
         super();
-        expressions = new Hashtable();
+        expressions = new Hashtable<>();
     }
 
     public GenerationContext(ParseTreeContext newContext, AbstractSession newSession, ParseTree newParseTree) {
@@ -66,7 +66,7 @@
     }
 
     public Expression expressionFor(String aliasName) {
-        Expression exp = (Expression) expressions.get(aliasName);
+        Expression exp = expressions.get(aliasName);
 
         if (exp == null && (! expressions.isEmpty()) && isSelectGenerationContext()) {
             GenerationContext outerContext = ((SelectGenerationContext) this).getOuterContext();
@@ -79,7 +79,7 @@
         return exp;
     }
 
-    public Class getBaseQueryClass() {
+    public Class<?> getBaseQueryClass() {
         return baseQueryClass;
     }
 
@@ -95,7 +95,7 @@
         return session;
     }
 
-    public void setBaseQueryClass(java.lang.Class newBaseQueryClass) {
+    public void setBaseQueryClass(Class<?> newBaseQueryClass) {
         baseQueryClass = newBaseQueryClass;
     }
 
@@ -164,7 +164,7 @@
     }
 
     /** */
-    public Expression joinVariables(Set variables) {
+    public Expression joinVariables(Set<String> variables) {
         return null;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/GroupByNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/GroupByNode.java
index cc01b84..9a4f86b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/GroupByNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/GroupByNode.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 @@
  */
 public class GroupByNode extends MajorNode {
 
-    List groupByItems = null;
+    List<Node> groupByItems = null;
 
     /**
      * Return a new GroupByNode.
@@ -42,8 +42,8 @@
      * Validate the current node.
      */
     public void validate(ParseTreeContext context, SelectNode selectNode) {
-        for (Iterator i = groupByItems.iterator(); i.hasNext(); ) {
-            Node item = (Node)i.next();
+        for (Iterator<Node> i = groupByItems.iterator(); i.hasNext(); ) {
+            Node item = i.next();
             item.validate(context);
         }
     }
@@ -54,9 +54,9 @@
      */
     public void addGroupingToQuery(ObjectLevelReadQuery theQuery, GenerationContext context) {
         if (theQuery.isReportQuery()) {
-            Iterator iter = getGroupByItems().iterator();
+            Iterator<Node> iter = getGroupByItems().iterator();
             while (iter.hasNext()) {
-                Node nextNode = (Node)iter.next();
+                Node nextNode = iter.next();
                 ((ReportQuery)theQuery).addGrouping(nextNode.generateExpression(context));
             }
         }
@@ -85,8 +85,8 @@
     private boolean isGroupbyItem(Node expr) {
         if (expr.isDotNode() || expr.isVariableNode()) {
             String exprRepr = expr.getAsString();
-            for (Iterator i = groupByItems.iterator(); i.hasNext();) {
-                Node item = (Node)i.next();
+            for (Iterator<Node> i = groupByItems.iterator(); i.hasNext();) {
+                Node item = i.next();
                 String itemRepr = item.getAsString();
                 if (exprRepr.equals(itemRepr)) {
                     return true;
@@ -100,9 +100,9 @@
      * INTERNAL
      * Return the GROUP BY statements
      */
-    public List getGroupByItems() {
+    public List<Node> getGroupByItems() {
         if (groupByItems == null) {
-            setGroupByItems(new Vector());
+            setGroupByItems(new Vector<>());
         }
         return groupByItems;
     }
@@ -111,7 +111,7 @@
      * INTERNAL
      * Set the GROUP BY statements
      */
-    public void setGroupByItems(List newItems) {
+    public void setGroupByItems(List<Node> newItems) {
         groupByItems = newItems;
     }
 
@@ -122,14 +122,14 @@
     @Override
     public String getAsString() {
         StringBuilder repr = new StringBuilder();
-        for (Iterator i = groupByItems.iterator(); i.hasNext(); ) {
-            Node expr = (Node)i.next();
+        for (Iterator<Node> i = groupByItems.iterator(); i.hasNext(); ) {
+            Node expr = i.next();
             if (repr.length() > 0) {
                 repr.append(", ");
             }
             repr.append(expr.getAsString());
         }
-        return "GROUP BY " + repr.toString();
+        return "GROUP BY " + repr;
     }
 
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/InNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/InNode.java
index 8076d44..d12d751 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/InNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/InNode.java
@@ -34,7 +34,7 @@
  */
 public class InNode extends SimpleConditionalExpressionNode {
 
-    private List theObjects = null;
+    private List<Node> theObjects = null;
 
     //Was NOT indicated? "WHERE emp.lastName NOT IN (...)
     private boolean notIndicated = false;
@@ -68,14 +68,14 @@
         if (left != null) {
             left.validate(context);
             // check to see if the argument is a parameter
-            if (isListParameterOrSubquery && !getTheObjects().isEmpty() && ((Node)getTheObjects().get(0)).isParameterNode()){
+            if (isListParameterOrSubquery && !getTheObjects().isEmpty() && getTheObjects().get(0).isParameterNode()){
                 leftType = Collection.class;
             } else {
                 leftType = left.getType();
             }
         }
-        for (Iterator i = getTheObjects().iterator(); i.hasNext();) {
-            Node node = (Node)i.next();
+        for (Iterator<Node> i = getTheObjects().iterator(); i.hasNext();) {
+            Node node = i.next();
             node.validate(context);
             node.validateParameter(context, leftType);
             Object nodeType = node.getType();
@@ -95,8 +95,8 @@
     @Override
     public Expression generateExpression(GenerationContext context) {
         Expression whereClause = getLeft().generateExpression(context);
-        List arguments = getTheObjects();
-        Node firstArg = (Node)arguments.get(0);
+        List<Node> arguments = getTheObjects();
+        Node firstArg = arguments.get(0);
         if (firstArg.isSubqueryNode()) {
             SubqueryNode subqueryNode = (SubqueryNode)firstArg;
             ReportQuery reportQuery = subqueryNode.getReportQuery(context);
@@ -113,9 +113,9 @@
                 whereClause = whereClause.in(firstArg.generateExpression(context));
             }
         } else {
-            Vector inArguments = new Vector(arguments.size());
-            for (Iterator iter = arguments.iterator(); iter.hasNext();) {
-                Node nextNode = (Node)iter.next();
+            Vector<Expression> inArguments = new Vector<>(arguments.size());
+            for (Iterator<Node> iter = arguments.iterator(); iter.hasNext();) {
+                Node nextNode = iter.next();
                 inArguments.add(nextNode.generateExpression(context));
             }
             if (inArguments.size() > 0) {
@@ -133,9 +133,9 @@
      * INTERNAL
      * Return the collection of the objects used as parameters for this node
      */
-    public List getTheObjects() {
+    public List<Node> getTheObjects() {
         if (theObjects == null) {
-            setTheObjects(new Vector());
+            setTheObjects(new Vector<>());
         }
         return theObjects;
     }
@@ -153,7 +153,7 @@
      * INTERNAL
      * Set this node's object collection to the passed value
      */
-    public void setTheObjects(List newTheObjects) {
+    public void setTheObjects(List<Node> newTheObjects) {
         theObjects = newTheObjects;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ModifyNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ModifyNode.java
index 14d1fcb..b30bb3b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ModifyNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ModifyNode.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
@@ -102,7 +102,7 @@
      * an alias, where the variableName is registered to an alias.
      */
     @Override
-    public Class resolveClass(GenerationContext context) {
+    public Class<?> resolveClass(GenerationContext context) {
         String alias = abstractSchemaName;
         ClassDescriptor descriptor = context.getSession().getDescriptorForAlias(alias);
         if (descriptor == null) {
@@ -110,7 +110,7 @@
                 context.getParseTreeContext().getQueryInfo(),
                 getLine(), getColumn(), alias);
         }
-        Class theClass = descriptor.getJavaClass();
+        Class<?> theClass = descriptor.getJavaClass();
         if (theClass == null) {
             throw JPQLException.resolutionClassNotFoundException2(
                 context.getParseTreeContext().getQueryInfo(),
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/Node.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/Node.java
index fd27534..28707cd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/Node.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/Node.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
@@ -286,7 +286,7 @@
      * resolveClass: Answer the class associated with the content of this node. Default is to return null.
      * Subclasses should override this.
      */
-    public Class resolveClass(GenerationContext context) {
+    public Class<?> resolveClass(GenerationContext context) {
         return null;
     }
 
@@ -294,7 +294,7 @@
      * resolveClass: Answer the class associated with the content of this node. Default is to return null.
      * Subclasses should override this.
      */
-    public Class resolveClass(GenerationContext context, Class ownerClass) {
+    public Class<?> resolveClass(GenerationContext context, Class<?> ownerClass) {
         return null;
     }
 
@@ -311,7 +311,7 @@
      * class as the context.
      * Subclasses should override this.
      */
-    public DatabaseMapping resolveMapping(GenerationContext context, Class ownerClass) {
+    public DatabaseMapping resolveMapping(GenerationContext context, Class<?> ownerClass) {
         return null;
     }
 
@@ -394,7 +394,7 @@
         buffer.append("\r\n");
         toStringIndent(indent, buffer);
         if (hasLeft()) {
-            buffer.append("Left: " + getLeft().toString(indent + 1));
+            buffer.append("Left: ").append(getLeft().toString(indent + 1));
         } else {
             buffer.append("Left: null");
         }
@@ -402,7 +402,7 @@
         buffer.append("\r\n");
         toStringIndent(indent, buffer);
         if (hasRight()) {
-            buffer.append("Right: " + getRight().toString(indent + 1));
+            buffer.append("Right: ").append(getRight().toString(indent + 1));
         } else {
             buffer.append("Right: null");
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/NodeFactory.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/NodeFactory.java
index 16d9d13..eed65ae 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/NodeFactory.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/NodeFactory.java
@@ -62,24 +62,24 @@
 
     /** */
     Object newSelectClause(int line, int column,
-                           boolean distinct, List selectExprs);
+                           boolean distinct, List<Node> selectExprs);
 
-    Object newSelectClause(int line, int column, boolean distinct, List selectExprs, List identifiers);
+    Object newSelectClause(int line, int column, boolean distinct, List<Node> selectExprs, List<String> identifiers);
 
     /** */
-    Object newFromClause(int line, int column, List varDecls);
+    Object newFromClause(int line, int column, List<Node> varDecls);
 
     /** */
     Object newWhereClause(int line, int column, Object condition);
 
     /** */
-    Object newGroupByClause(int line, int column, List items);
+    Object newGroupByClause(int line, int column, List<Node> items);
 
     /** */
     Object newHavingClause(int line, int column, Object arg);
 
     /** */
-    Object newOrderByClause(int line, int column, List items);
+    Object newOrderByClause(int line, int column, List<Node> items);
 
     /** */
     Object newUpdateClause(int line, int column,
@@ -220,7 +220,7 @@
 
     /** */
     Object newIn(int line, int column,
-                 boolean not, Object expr, List items);
+                 boolean not, Object expr, List<Node> items);
 
     /** */
     Object newIsNull(int line, int column, boolean not, Object expr);
@@ -272,7 +272,7 @@
     // ------------------------------------------
 
     /** */
-    Object newConcat(int line, int column, List objects);
+    Object newConcat(int line, int column, List<Node> objects);
 
     /** */
     Object newSubstring(int line, int column,
@@ -329,7 +329,7 @@
     // ------------------------------------------
 
     /** */
-    Object newFunc(int line, int column, String name, List parameters);
+    Object newFunc(int line, int column, String name, List<Node> parameters);
 
     // ------------------------------------------
     // Subquery nodes
@@ -366,10 +366,10 @@
 
     /** */
     Object newConstructor(int line, int colimn,
-                          String className, List args);
+                          String className, List<Node> args);
 
     /** */
-    Object newSetClause(int line, int colimn, List assignments);
+    Object newSetClause(int line, int colimn, List<Node> assignments);
 
     /** */
     Object newSetAssignmentClause(int line, int column,
@@ -381,9 +381,9 @@
 
     Object newType(int line, int column, Object left);
 
-    Object newCaseClause(int line, int column, Object base, List whenClauses, Object elseClause);
+    Object newCaseClause(int line, int column, Object base, List<Node> whenClauses, Object elseClause);
 
-    Object newCoalesceClause(int line, int column, List clauses);
+    Object newCoalesceClause(int line, int column, List<Node> clauses);
 
     Object newNullIfClause(int line, int column, Object left, Object right);
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/NodeFactoryImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/NodeFactoryImpl.java
index d2ccc3b..62a9bc0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/NodeFactoryImpl.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/NodeFactoryImpl.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
@@ -112,12 +112,12 @@
 
     @Override
     public Object newSelectClause(int line, int column,
-                                    boolean distinct, List selectExprs) {
+                                  boolean distinct, List<Node> selectExprs) {
         return newSelectClause(line, column, distinct, selectExprs, null);
     }
 
     @Override
-    public Object newSelectClause(int line, int column, boolean distinct, List selectExprs, List identifiers) {
+    public Object newSelectClause(int line, int column, boolean distinct, List<Node> selectExprs, List<String> identifiers) {
         SelectNode node = new SelectNode();
         node.setContext(context);
         node.setSelectExpressions(selectExprs);
@@ -125,7 +125,7 @@
         if (identifiers != null){
             for (int i=0;i<identifiers.size();i++){
                 if (identifiers.get(i) != null){
-                    context.registerJoinVariable(calculateCanonicalName((String)identifiers.get(i)), (Node)selectExprs.get(i), line, column);
+                    context.registerJoinVariable(calculateCanonicalName(identifiers.get(i)), selectExprs.get(i), line, column);
                 }
             }
         }
@@ -136,7 +136,7 @@
 
     /** */
     @Override
-    public Object newFromClause(int line, int column, List decls) {
+    public Object newFromClause(int line, int column, List<Node> decls) {
         FromNode node = new FromNode();
         node.setContext(context);
         node.setDeclarations(decls);
@@ -156,7 +156,7 @@
 
     /** */
     @Override
-    public Object newGroupByClause(int line, int column, List items) {
+    public Object newGroupByClause(int line, int column, List<Node> items) {
         GroupByNode node = new GroupByNode();
         node.setContext(context);
         node.setGroupByItems(items);
@@ -176,7 +176,7 @@
 
     /** */
     @Override
-    public Object newOrderByClause(int line, int column, List items) {
+    public Object newOrderByClause(int line, int column, List<Node> items) {
         OrderByNode node = new OrderByNode();
         node.setContext(context);
         node.setOrderByItems(items);
@@ -587,7 +587,7 @@
     /** */
     @Override
     public Object newIn(int line, int column,
-                        boolean not, Object expr, List items) {
+                        boolean not, Object expr, List<Node> items) {
         InNode node = new InNode();
         if (not) node.indicateNot();
         node.setLeft((Node)expr);
@@ -723,7 +723,7 @@
 
     /** */
     @Override
-    public Object newConcat(int line, int column, List objects) {
+    public Object newConcat(int line, int column, List<Node> objects) {
         ConcatNode node = new ConcatNode();
         node.setObjects(objects);
         setPosition(node, line, column);
@@ -882,7 +882,7 @@
 
     /** */
     @Override
-    public Object newFunc(int line, int column, String name, List parameters) {
+    public Object newFunc(int line, int column, String name, List<Node> parameters) {
         FuncNode node = new FuncNode();
         if(name.startsWith("'") && name.endsWith("'")) {
             name = name.substring(1, name.length()-1);
@@ -998,7 +998,7 @@
     /** */
     @Override
     public Object newConstructor(int line, int column,
-                                 String className, List args) {
+                                 String className, List<Node> args) {
         ConstructorNode node = new ConstructorNode(className);
         node.setConstructorItems(args);
         setPosition(node, line, column);
@@ -1007,7 +1007,7 @@
 
     /** */
     @Override
-    public Object newSetClause(int line, int column, List assignments) {
+    public Object newSetClause(int line, int column, List<Node> assignments) {
         SetNode node = new SetNode();
         node.setAssignmentNodes(assignments);
         setPosition(node, line, column);
@@ -1077,7 +1077,7 @@
     }
 
     @Override
-    public Object newCaseClause(int line, int column, Object base, List whenClauses, Object elseClause){
+    public Object newCaseClause(int line, int column, Object base, List<Node> whenClauses, Object elseClause){
         CaseNode node = new CaseNode();
         node.setWhenClauses(whenClauses);
         if (base != null){
@@ -1089,7 +1089,7 @@
     }
 
     @Override
-    public Object newCoalesceClause(int line, int column, List clauses){
+    public Object newCoalesceClause(int line, int column, List<Node> clauses){
         CoalesceNode node = new CoalesceNode();
         node.setClauses(clauses);
         setPosition(node, line, column);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/OrNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/OrNode.java
index 3763824..8187e37 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/OrNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/OrNode.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,8 +29,8 @@
  */
 public class OrNode extends LogicalOperatorNode {
 
-    private Set leftOuterScopeVariables = null;
-    private Set rightOuterScopeVariables = null;
+    private Set<String> leftOuterScopeVariables = null;
+    private Set<String> rightOuterScopeVariables = null;
 
     /**
      * Return a new OrNode.
@@ -45,7 +45,7 @@
      */
     @Override
     public void validate(ParseTreeContext context) {
-        Set saved = context.getOuterScopeVariables();
+        Set<String> saved = context.getOuterScopeVariables();
         if (left != null) {
             context.resetOuterScopeVariables();
             left.validate(context);
@@ -89,7 +89,7 @@
      * INTERNAL
      */
     private Expression appendOuterScopeVariableJoins(
-        Expression expr, Set outerScopeVariables, GenerationContext context) {
+            Expression expr, Set<String> outerScopeVariables, GenerationContext context) {
         if ((outerScopeVariables == null) || outerScopeVariables.isEmpty()) {
             // no outer scope variables => nothing to be done
             return expr;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/OrderByNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/OrderByNode.java
index 7508a5f..105b8d3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/OrderByNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/OrderByNode.java
@@ -16,7 +16,6 @@
 
 import java.util.*;
 
-import org.eclipse.persistence.queries.ReadAllQuery;
 import org.eclipse.persistence.queries.ObjectLevelReadQuery;
 
 /**
@@ -30,7 +29,7 @@
  */
 public class OrderByNode extends MajorNode {
 
-    List orderByItems = null;
+    List<Node> orderByItems = null;
 
     /**
      * Return a new OrderByNode.
@@ -45,9 +44,9 @@
      */
     public void addOrderingToQuery(ObjectLevelReadQuery theQuery, GenerationContext context) {
         if (theQuery.isReadAllQuery()) {
-            Iterator iter = getOrderByItems().iterator();
+            Iterator<Node> iter = getOrderByItems().iterator();
             while (iter.hasNext()) {
-                Node nextNode = (Node)iter.next();
+                Node nextNode = iter.next();
                 theQuery.addOrdering(nextNode.generateExpression(context));
             }
         }
@@ -58,8 +57,8 @@
      * Validate node.
      */
     public void validate(ParseTreeContext context, SelectNode selectNode) {
-        for (Iterator i = orderByItems.iterator(); i.hasNext(); ) {
-            Node item = (Node)i.next();
+        for (Iterator<Node> i = orderByItems.iterator(); i.hasNext(); ) {
+            Node item = i.next();
             item.validate(context);
         }
     }
@@ -68,9 +67,9 @@
      * INTERNAL
      * Return the order by statements
      */
-    public List getOrderByItems() {
+    public List<Node> getOrderByItems() {
         if (orderByItems == null) {
-            setOrderByItems(new Vector());
+            setOrderByItems(new Vector<>());
         }
         return orderByItems;
     }
@@ -79,7 +78,7 @@
      * INTERNAL
      * Set the order by statements
      */
-    public void setOrderByItems(List newItems) {
+    public void setOrderByItems(List<Node> newItems) {
         orderByItems = newItems;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ParseTree.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ParseTree.java
index e2f889a..5e302c3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ParseTree.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ParseTree.java
@@ -14,12 +14,18 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.jpa.parsing;
 
-import java.util.*;
-
-import org.eclipse.persistence.expressions.*;
-import org.eclipse.persistence.queries.*;
-import org.eclipse.persistence.internal.localization.*;
+import org.eclipse.persistence.expressions.Expression;
+import org.eclipse.persistence.expressions.ExpressionBuilder;
+import org.eclipse.persistence.internal.localization.ToStringLocalization;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
+import org.eclipse.persistence.queries.DatabaseQuery;
+import org.eclipse.persistence.queries.DeleteAllQuery;
+import org.eclipse.persistence.queries.ModifyAllQuery;
+import org.eclipse.persistence.queries.ObjectLevelReadQuery;
+import org.eclipse.persistence.queries.UpdateAllQuery;
+
+import java.util.Iterator;
+import java.util.Set;
 
 /**
  * INTERNAL
@@ -49,7 +55,7 @@
     private ClassLoader classLoader = null;
     private short distinctState = ObjectLevelReadQuery.UNCOMPUTED_DISTINCT;
     private boolean validated = false;
-    private Set unusedVariables = null;
+    private Set<String> unusedVariables = null;
 
     /**
      * Return a new ParseTree.
@@ -74,7 +80,7 @@
       * Need to test this for Employee, employee.getAddress(), report query
       */
     public void adjustReferenceClassForQuery(DatabaseQuery theQuery, GenerationContext generationContext) {
-        Class referenceClass = getReferenceClass(theQuery, generationContext);
+        Class<?> referenceClass = getReferenceClass(theQuery, generationContext);
         if ((referenceClass != null) && (referenceClass != theQuery.getReferenceClass())) {
             if (theQuery.isObjectLevelReadQuery()) {
                 // The referenceClass needs to be changed.
@@ -98,7 +104,7 @@
         String variable = getFromNode().getFirstVariable();
         ParseTreeContext context = generationContext.getParseTreeContext();
         if (context.isRangeVariable(variable)) {
-            Class referenceClass = theQuery.getReferenceClass();
+            Class<?> referenceClass = theQuery.getReferenceClass();
             // Create a new expression builder for the reference class
             ExpressionBuilder builder = new ExpressionBuilder(referenceClass);
             // Use the expression builder as the default expression builder for the query
@@ -109,7 +115,7 @@
             // Get the declaring node for the variable
             Node path = context.pathForVariable(variable);
             // Get the ExpressionBuilder of the range variable for the path
-            Class baseClass = getBaseExpressionClass(path, generationContext);
+            Class<?> baseClass = getBaseExpressionClass(path, generationContext);
             // and change the reference class accordingly
             theQuery.setReferenceClass(baseClass);
             theQuery.changeDescriptor(generationContext.getSession());
@@ -129,7 +135,7 @@
     public void initBaseExpression(ModifyAllQuery theQuery, GenerationContext generationContext) {
         ModifyNode queryNode = (ModifyNode)getQueryNode();
         String variable = queryNode.getCanonicalAbstractSchemaIdentifier();
-        Class referenceClass = theQuery.getReferenceClass();
+        Class<?> referenceClass = theQuery.getReferenceClass();
         // Create a new expression builder for the reference class
         ExpressionBuilder builder = new ExpressionBuilder(referenceClass);
         // Use the expression builder as the default expression builder for the query
@@ -139,28 +145,28 @@
     }
 
     /** */
-    private Class getBaseExpressionClass(Node node, GenerationContext generationContext) {
+    private Class<?> getBaseExpressionClass(Node node, GenerationContext generationContext) {
         ParseTreeContext context = generationContext.getParseTreeContext();
-        Class clazz = null;
-        if (node == null) {
-            clazz = null;
-        } else if (node.isDotNode()) {
-            // DotNode: delegate to left
-            clazz = getBaseExpressionClass(node.getLeft(), generationContext);
-        } else if (node.isVariableNode()) {
-            // VariableNode
-            String variable = ((VariableNode)node).getCanonicalVariableName();
-            if (!context.isRangeVariable(variable)) {
-                Node path = context.pathForVariable(variable);
-                // Variable is defined in JOIN/IN clause =>
-                // return the Class from its definition
-                clazz = getBaseExpressionClass(path, generationContext);
-            } else {
-                // Variable is defined in range variable decl =>
-                // return its class
-                String schema = context.schemaForVariable(variable);
-                if (schema != null) {
-                    clazz = context.classForSchemaName(schema, generationContext);
+        Class<?> clazz = null;
+        if (node != null) {
+            if (node.isDotNode()) {
+                // DotNode: delegate to left
+                clazz = getBaseExpressionClass(node.getLeft(), generationContext);
+            } else if (node.isVariableNode()) {
+                // VariableNode
+                String variable = ((VariableNode) node).getCanonicalVariableName();
+                if (!context.isRangeVariable(variable)) {
+                    Node path = context.pathForVariable(variable);
+                    // Variable is defined in JOIN/IN clause =>
+                    // return the Class from its definition
+                    clazz = getBaseExpressionClass(path, generationContext);
+                } else {
+                    // Variable is defined in range variable decl =>
+                    // return its class
+                    String schema = context.schemaForVariable(variable);
+                    if (schema != null) {
+                        clazz = context.classForSchemaName(schema, generationContext);
+                    }
                 }
             }
         }
@@ -280,8 +286,8 @@
      */
     public void addNonFetchJoinAttributes(ObjectLevelReadQuery theQuery, GenerationContext generationContext) {
         ParseTreeContext context = generationContext.getParseTreeContext();
-        for (Iterator i = unusedVariables.iterator(); i.hasNext();) {
-            String variable = (String)i.next();
+        for (Iterator<String> i = unusedVariables.iterator(); i.hasNext();) {
+            String variable = i.next();
             Expression expr = null;
             if (!context.isRangeVariable(variable)) {
                 Node path = context.pathForVariable(variable);
@@ -314,10 +320,10 @@
         //Bug#4646580  Add arguments to query
         if (context.hasParameters()) {
             TypeHelper typeHelper = context.getTypeHelper();
-            for (Iterator i = context.getParameterNames().iterator(); i.hasNext();) {
-                String param = (String)i.next();
+            for (Iterator<String> i = context.getParameterNames().iterator(); i.hasNext();) {
+                String param = i.next();
                 Object type = context.getParameterType(param);
-                Class clazz = typeHelper.getJavaClass(type);
+                Class<?> clazz = typeHelper.getJavaClass(type);
                 if (clazz == null) {
                     clazz = Object.class;
                 }
@@ -431,7 +437,7 @@
      * getReferenceClass(): Answer the class which will be the reference class for the query.
      * Resolve this using the node parsed from the "SELECT" of the EJBQL query string
      */
-    public Class getReferenceClass(DatabaseQuery query, GenerationContext generationContext) {
+    public Class<?> getReferenceClass(DatabaseQuery query, GenerationContext generationContext) {
         if (getQueryNode() == null) {
             return null;
         }
@@ -584,9 +590,7 @@
      */
     @Override
     public String toString() {
-        StringBuilder buffer = new StringBuilder();
-        buffer.append(getContext().toString());
-        return ToStringLocalization.buildMessage("context", null) + " " + buffer.toString();
+        return ToStringLocalization.buildMessage("context", null) + " " + getContext().toString();
     }
 
     /**
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ParseTreeContext.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ParseTreeContext.java
index 458c206..56e9b93 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ParseTreeContext.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/ParseTreeContext.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
@@ -43,14 +43,14 @@
  *    @since TopLink 4.0
  */
 public class ParseTreeContext {
-    private Map variableDecls;
+    private Map<String, VariableDecl> variableDecls;
     private String baseVariable;
     private int currentScope;
-    private Set outerScopeVariables;
-    private Map fetchJoins;
+    private Set<String> outerScopeVariables;
+    private Map<String, List<Node>> fetchJoins;
     private TypeHelper typeHelper;
-    private Map parameterTypes;
-    private List parameterNames;
+    private Map<String, Object> parameterTypes;
+    private List<String> parameterNames;
     private NodeFactory nodeFactory;
     private String queryInfo;
 
@@ -60,12 +60,12 @@
      */
     public ParseTreeContext(NodeFactory nodeFactory, String queryInfo) {
         super();
-        variableDecls = new HashMap();
+        variableDecls = new HashMap<>();
         currentScope = 0;
-        fetchJoins = new HashMap();
+        fetchJoins = new HashMap<>();
         typeHelper = null;
-        parameterTypes = new HashMap();
-        parameterNames = new ArrayList();
+        parameterTypes = new HashMap<>();
+        parameterNames = new ArrayList<>();
         this.nodeFactory = nodeFactory;
         this.queryInfo = queryInfo;
     }
@@ -75,7 +75,7 @@
      * Associate the given schema with the given variable.
      */
     public void registerSchema(String variable, String schema, int line, int column) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
+        VariableDecl decl = variableDecls.get(variable);
         if (decl == null) {
             decl = new VariableDecl(variable, schema);
             variableDecls.put(variable, decl);
@@ -91,7 +91,7 @@
      * Associate the given path with the given variable.
      */
     public void registerJoinVariable(String variable, Node path, int line, int column) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
+        VariableDecl decl = variableDecls.get(variable);
         if (decl == null) {
             decl = new VariableDecl(variable, path);
             variableDecls.put(variable, decl);
@@ -113,7 +113,7 @@
      * Returns true if the specified string denotes a variable.
      */
     public boolean isVariable(String variable) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
+        VariableDecl decl = variableDecls.get(variable);
         return decl != null;
     }
 
@@ -121,9 +121,8 @@
      * INTERNAL
      * Returns true if the specified string denotes a range variable.
      */
-    /** */
     public boolean isRangeVariable(String variable) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
+        VariableDecl decl = variableDecls.get(variable);
         return (decl != null) && decl.isRangeVariable;
     }
 
@@ -133,7 +132,7 @@
      * range variable.
      */
     public String schemaForVariable(String variable) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
+        VariableDecl decl = variableDecls.get(variable);
         return (decl != null) ? decl.schema : null;
     }
 
@@ -141,12 +140,12 @@
      * INTERNAL
      * Answer the class associated with the provided schema name
      */
-    public Class classForSchemaName(String schemaName, GenerationContext context) {
+    public Class<?> classForSchemaName(String schemaName, GenerationContext context) {
         ClassDescriptor descriptor = context.getSession().getDescriptorForAlias(schemaName);
         if (descriptor == null) {
             throw JPQLException.entityTypeNotFound(getQueryInfo(), schemaName);
         }
-        Class theClass = descriptor.getJavaClass();
+        Class<?> theClass = descriptor.getJavaClass();
         if (theClass == null) {
             throw JPQLException.resolutionClassNotFoundException(getQueryInfo(), schemaName);
         }
@@ -160,11 +159,11 @@
      * SELECT OBJECT (emp) FROM Employee emp
      *   getVariableNameForClass(Employee.class) =&gt; "emp"
      */
-    public String getVariableNameForClass(Class theClass, GenerationContext context) {
-        for (Iterator i = variableDecls.entrySet().iterator(); i.hasNext(); ) {
-            Map.Entry entry = (Map.Entry)i.next();
-            String nextVariable = (String)entry.getKey();
-            VariableDecl decl = (VariableDecl)entry.getValue();
+    public String getVariableNameForClass(Class<?> theClass, GenerationContext context) {
+        for (Iterator<Map.Entry<String, VariableDecl>> i = variableDecls.entrySet().iterator(); i.hasNext(); ) {
+            Map.Entry<String, VariableDecl> entry = i.next();
+            String nextVariable = entry.getKey();
+            VariableDecl decl = entry.getValue();
             if ((decl.schema != null) &&
                 (theClass == this.classForSchemaName(decl.schema, context))) {
                 return nextVariable;
@@ -179,7 +178,7 @@
      * member variable.
      */
     public Node pathForVariable(String variable) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
+        VariableDecl decl = variableDecls.get(variable);
         return (decl != null) ? decl.path : null;
     }
 
@@ -209,8 +208,8 @@
      * outer scope.
      */
     public boolean isDeclaredInOuterScope(String variable) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
-        return (decl != null) ? (decl.scope < currentScope) : false;
+        VariableDecl decl = variableDecls.get(variable);
+        return decl != null && (decl.scope < currentScope);
     }
 
     /**
@@ -218,7 +217,7 @@
      * Sets the scope of the specified variable to the current scope.
      */
     public void setScopeOfVariable(String variable) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
+        VariableDecl decl = variableDecls.get(variable);
         if (decl != null) {
             decl.scope = currentScope;
         }
@@ -253,7 +252,7 @@
      * INTERNAL
      * Returns the set of outer scope variables.
      */
-    public Set getOuterScopeVariables() {
+    public Set<String> getOuterScopeVariables() {
         return outerScopeVariables;
     }
 
@@ -262,14 +261,14 @@
      * Resets the set of outer scope variables.
      */
     public void resetOuterScopeVariables() {
-        outerScopeVariables = new HashSet();
+        outerScopeVariables = new HashSet<>();
     }
 
     /**
      * INTERNAL
      * Resets the set of outer scope variables.
      */
-    public void resetOuterScopeVariables(Set variables) {
+    public void resetOuterScopeVariables(Set<String> variables) {
         outerScopeVariables = variables;
     }
 
@@ -278,37 +277,39 @@
      * JOIN FETCH node.
      */
     public void registerFetchJoin(String variableName, Node node) {
-        List joins = (List)fetchJoins.get(variableName);
+        List<Node> joins = fetchJoins.get(variableName);
         if (joins == null) {
-            joins = new ArrayList();
+            joins = new ArrayList<>();
             fetchJoins.put(variableName, joins);
         }
         joins.add(node);
     }
 
     /** Returns a list of FETCH JOIN nodes for the specified attached to the
-     * specified variable. */
-    public List getFetchJoins(String variableName) {
-        return (List)fetchJoins.get(variableName);
+     * specified variable.
+     */
+    public List<Node> getFetchJoins(String variableName) {
+        return fetchJoins.get(variableName);
     }
 
     /** Mark the specified variable as used if it is declared in the current
      * scope. */
     public void usedVariable(String variable) {
-        VariableDecl decl = (VariableDecl)variableDecls.get(variable);
+        VariableDecl decl = variableDecls.get(variable);
         if ((decl != null) && (decl.scope == currentScope)) {
             decl.used = true;
         }
     }
 
     /** Returns s set of variables that are declared in the current scope,
-     * but not used in the query. */
-    public Set getUnusedVariables() {
-        Set unused = new HashSet();
-        for (Iterator i = variableDecls.entrySet().iterator(); i.hasNext();) {
-            Map.Entry entry = (Map.Entry)i.next();
-            String variable = (String)entry.getKey();
-            VariableDecl decl = (VariableDecl)entry.getValue();
+     * but not used in the query.
+     */
+    public Set<String> getUnusedVariables() {
+        Set<String> unused = new HashSet<>();
+        for (Iterator<Map.Entry<String, VariableDecl>> i = variableDecls.entrySet().iterator(); i.hasNext();) {
+            Map.Entry<String, VariableDecl> entry = i.next();
+            String variable = entry.getKey();
+            VariableDecl decl = entry.getValue();
             if ((decl.scope == currentScope) && !decl.used) {
                 unused.add(variable);
             }
@@ -320,13 +321,13 @@
     //true => "SELECT OBJECT (emp1) FROM Employee emp1, Employee emp2 WHERE ..."
     //false => "SELECT OBJECT (emp) FROM Employee emp WHERE ..."
     public boolean hasMoreThanOneVariablePerType() {
-        Map typeNamesToVariables = new HashMap();
+        Map<String, String> typeNamesToVariables = new HashMap<>();
         int nrOfRangeVariables = 0;
         //Map the Aliases to the variable names, then check the count
-        for (Iterator i = variableDecls.entrySet().iterator(); i.hasNext(); ) {
-            Map.Entry entry = (Map.Entry)i.next();
-            String variable = (String)entry.getKey();
-            VariableDecl decl = (VariableDecl)entry.getValue();
+        for (Iterator<Map.Entry<String, VariableDecl>> i = variableDecls.entrySet().iterator(); i.hasNext(); ) {
+            Map.Entry<String, VariableDecl> entry = i.next();
+            String variable = entry.getKey();
+            VariableDecl decl = entry.getValue();
             if (decl.isRangeVariable) {
                 nrOfRangeVariables++;
                 typeNamesToVariables.put(decl.schema, variable);
@@ -340,11 +341,11 @@
     //false => "SELECT OBJECT (emp) FROM Employee emp WHERE ..."
     //false => "SELECT OBJECT (emp1) FROM Employee emp1, Employee emp2 WHERE ..."
     public boolean hasMoreThanOneAliasInFrom() {
-        Map typeNamesToVariables = new HashMap();
-        for (Iterator i = variableDecls.entrySet().iterator(); i.hasNext(); ) {
-            Map.Entry entry = (Map.Entry)i.next();
-            String variable = (String)entry.getKey();
-            VariableDecl decl = (VariableDecl)entry.getValue();
+        Map<String, String> typeNamesToVariables = new HashMap<>();
+        for (Iterator<Map.Entry<String, VariableDecl>> i = variableDecls.entrySet().iterator(); i.hasNext(); ) {
+            Map.Entry<String, VariableDecl> entry = i.next();
+            String variable = entry.getKey();
+            VariableDecl decl = entry.getValue();
             if (decl.isRangeVariable) {
                 typeNamesToVariables.put(decl.schema, variable);
             }
@@ -425,7 +426,7 @@
      * INTERNAL
      * Return the parameter names.
      */
-    public List getParameterNames() {
+    public List<String> getParameterNames() {
         return parameterNames;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/QueryNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/QueryNode.java
index 6873a0a..e16a998 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/QueryNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/QueryNode.java
@@ -55,7 +55,7 @@
    * Compute the Reference class for this query
    * @return the class this query is querying for
    */
-    public Class getReferenceClass(GenerationContext genContext) {
+    public Class<?> getReferenceClass(GenerationContext genContext) {
         return resolveClass(genContext);
     }
 
@@ -75,7 +75,7 @@
      * Return the class represented in this node.
      */
     @Override
-    public abstract Class resolveClass(GenerationContext context);
+    public abstract Class<?> resolveClass(GenerationContext context);
 
     /**
      * Set the parseTree
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SelectGenerationContext.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SelectGenerationContext.java
index df797d6..a55a7f8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SelectGenerationContext.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SelectGenerationContext.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
@@ -142,14 +142,14 @@
      * connect the inner variable expression with the outer one.
      */
     @Override
-    public Expression joinVariables(Set variables) {
+    public Expression joinVariables(Set<String> variables) {
         if ((outer == null) || (variables == null) || variables.isEmpty()) {
             // not an inner query or no variables to join
             return null;
         }
         Expression expr = null;
-        for (Iterator i = variables.iterator(); i.hasNext(); ) {
-            String name = (String)i.next();
+        for (Iterator<String> i = variables.iterator(); i.hasNext(); ) {
+            String name = i.next();
             VariableNode var = new VariableNode(name);
             Expression innerExpr = var.generateExpression(this);
             Expression outerExpr = var.generateExpression(outer);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SelectNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SelectNode.java
index 25f60ea..3c3d599 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SelectNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SelectNode.java
@@ -54,27 +54,27 @@
  */
 public class SelectNode extends QueryNode {
 
-    private List selectExpressions = new ArrayList();
-    private List identifiers = new ArrayList();
+    private List<Node> selectExpressions = new ArrayList<>();
+    private List<String> identifiers = new ArrayList<>();
 
     private boolean distinct = false;
 
     public SelectNode() {
     }
 
-    public List getSelectExpressions() {
+    public List<Node> getSelectExpressions() {
         return selectExpressions;
     }
 
-    public void setSelectExpressions(List exprs) {
+    public void setSelectExpressions(List<Node> exprs) {
         selectExpressions = exprs;
     }
 
-    public List getIdentifiers() {
+    public List<String> getIdentifiers() {
         return identifiers;
     }
 
-    public void setIdentifiers(List identifiers) {
+    public void setIdentifiers(List<String> identifiers) {
         this.identifiers = identifiers;
     }
 
@@ -174,12 +174,12 @@
         }
         SelectGenerationContext selectContext = (SelectGenerationContext)context;
         for (int i=0;i<selectExpressions.size();i++){
-            Node node = (Node)selectExpressions.get(i);
+            Node node = selectExpressions.get(i);
             if (selectingRelationshipField(node, context)) {
                 selectContext.useOuterJoins();
             }
             if (node.isAliasableNode() && identifiers != null){
-                String alias = (String)identifiers.get(i);
+                String alias = identifiers.get(i);
                 if (alias != null){
                     ((AliasableNode)node).setAlias(alias);
                 }
@@ -197,8 +197,8 @@
     public boolean hasOneToOneSelected(GenerationContext context) {
         // Iterate the select expression and return true if one of it has a
         // oneToOne selected.
-        for (Iterator i = selectExpressions.iterator(); i.hasNext();) {
-            Node node = (Node)i.next();
+        for (Iterator<Node> i = selectExpressions.iterator(); i.hasNext();) {
+            Node node = i.next();
             if (hasOneToOneSelected(node, context)) {
                 return true;
             }
@@ -230,9 +230,9 @@
         }
 
         if (node.isConstructorNode()) {
-            List args = ((ConstructorNode)node).getConstructorItems();
-            for (Iterator i = args.iterator(); i.hasNext();) {
-                Node arg = (Node)i.next();
+            List<Node> args = ((ConstructorNode)node).getConstructorItems();
+            for (Iterator<Node> i = args.iterator(); i.hasNext();) {
+                Node arg = i.next();
                 if (hasOneToOneSelected(arg, context)) {
                     return true;
                 }
@@ -252,8 +252,8 @@
      * Invalid: SELECT OBJECT(badAlias) FROM Employee emp WHERE ...
      */
     public void verifySelectedAlias(GenerationContext context) {
-        for (Iterator i = selectExpressions.iterator(); i.hasNext();) {
-            Node node = (Node)i.next();
+        for (Iterator<Node> i = selectExpressions.iterator(); i.hasNext();) {
+            Node node = i.next();
             //if the node is a DotNode, there is no selected alias
             if (node.isDotNode()) {
                 return;
@@ -269,8 +269,8 @@
      * False: "SELECT OBJECT(somethingElse) ..." &amp; variableName = "emp"
      */
     public boolean isSelected(String variableName) {
-        for (Iterator i = selectExpressions.iterator(); i.hasNext();) {
-            Node node = (Node)i.next();
+        for (Iterator<Node> i = selectExpressions.iterator(); i.hasNext();) {
+            Node node = i.next();
             //Make sure we've SELECted a VariableNode
             if (node.isVariableNode() &&
                 ((VariableNode)node).getCanonicalVariableName().equals(variableName)) {
@@ -293,7 +293,7 @@
     @Override
     public Node qualifyAttributeAccess(ParseTreeContext context) {
         for (int i = 0; i < selectExpressions.size(); i++) {
-            Node item = (Node)selectExpressions.get(i);
+            Node item = selectExpressions.get(i);
             selectExpressions.set(i, item.qualifyAttributeAccess(context));
         }
         return this;
@@ -304,8 +304,8 @@
      */
     @Override
     public void validate(ParseTreeContext context) {
-        for (Iterator i = selectExpressions.iterator(); i.hasNext(); ) {
-            Node item = (Node)i.next();
+        for (Iterator<Node> i = selectExpressions.iterator(); i.hasNext(); ) {
+            Node item = i.next();
             item.validate(context);
         }
     }
@@ -314,7 +314,7 @@
      * Answer the class associated with my left node.
      */
     @Override
-    public Class resolveClass(GenerationContext context) {
+    public Class<?> resolveClass(GenerationContext context) {
         return getReferenceClass(context);
     }
 
@@ -331,12 +331,12 @@
      * @return the class this query is querying for
      */
     @Override
-    public Class getReferenceClass(GenerationContext context) {
+    public Class<?> getReferenceClass(GenerationContext context) {
         return getClassOfFirstVariable(context);
     }
 
-    private Class getClassOfFirstVariable(GenerationContext context) {
-        Class clazz = null;
+    private Class<?> getClassOfFirstVariable(GenerationContext context) {
+        Class<?> clazz = null;
         String variable = getParseTree().getFromNode().getFirstVariable();
         ParseTreeContext parseTreeContext = context.getParseTreeContext();
         if (parseTreeContext.isRangeVariable(variable)) {
@@ -357,8 +357,8 @@
      * Answer true if a variable in the IN clause is SELECTed
      */
     public boolean isVariableInINClauseSelected(GenerationContext context) {
-        for (Iterator i = selectExpressions.iterator(); i.hasNext();) {
-            Node node = (Node)i.next();
+        for (Iterator<Node> i = selectExpressions.iterator(); i.hasNext();) {
+            Node node = i.next();
 
             if (node.isVariableNode()) {
                 String variableNameForLeft = ((VariableNode)node).getCanonicalVariableName();
@@ -419,7 +419,7 @@
      */
     private Node getFirstSelectExpressionNode() {
         return selectExpressions.size() > 0 ?
-            (Node)selectExpressions.get(0) : null;
+                selectExpressions.get(0) : null;
     }
 
     private boolean isSingleSelectExpression() {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SetNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SetNode.java
index cb6843f..f81895f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SetNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SetNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -24,11 +24,11 @@
  * Slightly different from other nodes since holds more than two children in a list.
  */
 public class SetNode extends MajorNode {
-    private List assignmentNodes = null;
+    private List <Node>assignmentNodes = null;
 
     public SetNode() {
         super();
-        assignmentNodes = new Vector();
+        assignmentNodes = new Vector<>();
     }
 
     /**
@@ -36,7 +36,7 @@
      * built expressions on the query.
      */
     public void addUpdatesToQuery(UpdateAllQuery theQuery, GenerationContext context) {
-        Iterator iterator = assignmentNodes.iterator();
+        Iterator<Node> iterator = assignmentNodes.iterator();
         while (iterator.hasNext()) {
             EqualsAssignmentNode node = (EqualsAssignmentNode)iterator.next();
             Expression leftExpression = getExpressionForNode(node.getLeft(), theQuery.getReferenceClass(), context);
@@ -53,8 +53,8 @@
      */
     @Override
     public Node qualifyAttributeAccess(ParseTreeContext context) {
-        for (Iterator i = assignmentNodes.iterator(); i.hasNext(); ) {
-            Node item = (Node)i.next();
+        for (Iterator<Node> i = assignmentNodes.iterator(); i.hasNext(); ) {
+            Node item = i.next();
             item.qualifyAttributeAccess(context);
         }
         return this;
@@ -66,8 +66,8 @@
      */
     @Override
     public void validate(ParseTreeContext context) {
-        for (Iterator i = assignmentNodes.iterator(); i.hasNext(); ) {
-            Node item = (Node)i.next();
+        for (Iterator<Node> i = assignmentNodes.iterator(); i.hasNext(); ) {
+            Node item = i.next();
             item.validate(context);
         }
     }
@@ -77,7 +77,7 @@
      * We will assume that set_to nodes change elements that are direct mappings on the reference
      * class of the query.
      */
-    protected Expression getExpressionForNode(Node node, Class referenceClass, GenerationContext context) {
+    protected Expression getExpressionForNode(Node node, Class<?> referenceClass, GenerationContext context) {
         Expression expression = null;
         if (node.isAttributeNode()) {
             // look up a preexisting expression based on the reference class of the query.
@@ -97,7 +97,7 @@
     /**
      * INTERNAL
      */
-    public void setAssignmentNodes(List nodes) {
+    public void setAssignmentNodes(List<Node> nodes) {
         assignmentNodes = nodes;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SubqueryNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SubqueryNode.java
index b6df684..8f20524 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SubqueryNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SubqueryNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -29,7 +29,7 @@
 
     /** Set of names of variables declared in an outer scope and used in teh
      * subquery. */
-    private Set outerVars;
+    private Set<String> outerVars;
 
     /**
      * Return a new SubqueryNode.
@@ -85,7 +85,7 @@
         outerVars = context.getOuterScopeVariables();
         SelectNode selectNode = (SelectNode)subqueryParseTree.getQueryNode();
         // Get the select expression, subqueries only have one
-        Node selectExpr = (Node)selectNode.getSelectExpressions().get(0);
+        Node selectExpr = selectNode.getSelectExpressions().get(0);
         setType(selectExpr.getType());
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SumNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SumNode.java
index 5fafc15..1cd3bb9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SumNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/SumNode.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -67,13 +67,13 @@
      * INTERNAL
      * This method calculates the return type of the SUM operation.
      */
-    protected Class calculateReturnType(GenerationContext context) {
-        Class returnType = null;
+    protected Class<?> calculateReturnType(GenerationContext context) {
+        Class<?> returnType = null;
         if (getLeft().isDotNode()){
             DotNode arg = (DotNode)getLeft();
-            Class fieldType = arg.getTypeOfDirectToField(context);
+            Class<?> fieldType = arg.getTypeOfDirectToField(context);
             TypeHelper helper = context.getParseTreeContext().getTypeHelper();
-            returnType = (Class)calculateReturnType(fieldType, helper);
+            returnType = (Class<?>)calculateReturnType(fieldType, helper);
         }
         return returnType;
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelper.java
index 48ca124..4766f71 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelper.java
@@ -26,7 +26,7 @@
     String getTypeName(Object type);
 
     /** Returns the class object of the specified type. */
-    Class getJavaClass(Object type);
+    Class<?> getJavaClass(Object type);
 
     /** Returns a type representation for the specified type name or null if
      * there is no such type. */
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelperImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelperImpl.java
index b0fe3ec..c0e3b3b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelperImpl.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/TypeHelperImpl.java
@@ -18,9 +18,6 @@
 import java.security.PrivilegedActionException;
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.mappings.AggregateCollectionMapping;
-import org.eclipse.persistence.mappings.AggregateMapping;
-import org.eclipse.persistence.mappings.CollectionMapping;
 import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.DirectCollectionMapping;
 import org.eclipse.persistence.mappings.querykeys.ForeignReferenceQueryKey;
@@ -119,7 +116,7 @@
      */
     @Override
     public Object resolveEnumConstant(Object type, String constant) {
-        Class clazz = getJavaClass(type);
+        Class<?> clazz = getJavaClass(type);
         Object[] constants = clazz.getEnumConstants();
         if (constants != null) {
             for (int i = 0; i < constants.length; i++) {
@@ -209,7 +206,7 @@
     private ClassDescriptor getDescriptor(Object type) {
         ClassDescriptor desc = null;
         if (type instanceof Class) {
-            desc = session.getDescriptor((Class)type);
+            desc = session.getDescriptor((Class<?>)type);
         } else if (type instanceof ClassDescriptor) {
             desc = (ClassDescriptor)type;
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/VariableNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/VariableNode.java
index c87564e..842df22 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/VariableNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/jpa/parsing/VariableNode.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
@@ -107,13 +107,13 @@
                                             Expression expression,
                                             GenerationContext context) {
         String name = getCanonicalVariableName();
-        List fetchJoinNodes = context.getParseTreeContext().getFetchJoins(name);
+        List<Node> fetchJoinNodes = context.getParseTreeContext().getFetchJoins(name);
         if (fetchJoinNodes == null) {
             reportQuery.addAttribute(name, expression);
         } else {
-            List fetchJoinExprs = new ArrayList(fetchJoinNodes.size());
-            for (Iterator i = fetchJoinNodes.iterator(); i.hasNext(); ) {
-                Node node = (Node)i.next();
+            List<Expression> fetchJoinExprs = new ArrayList<>(fetchJoinNodes.size());
+            for (Iterator<Node> i = fetchJoinNodes.iterator(); i.hasNext(); ) {
+                Node node = i.next();
                 fetchJoinExprs.add(node.generateExpression(context));
             }
             reportQuery.addItem(name, expression, fetchJoinExprs);
@@ -129,10 +129,10 @@
     private void addFetchJoins(ObjectLevelReadQuery theQuery,
                                GenerationContext context) {
         String name = getCanonicalVariableName();
-        List fetchJoinNodes = context.getParseTreeContext().getFetchJoins(name);
+        List<Node> fetchJoinNodes = context.getParseTreeContext().getFetchJoins(name);
         if (fetchJoinNodes != null) {
-            for (Iterator i = fetchJoinNodes.iterator(); i.hasNext(); ) {
-                Node node = (Node)i.next();
+            for (Iterator<Node> i = fetchJoinNodes.iterator(); i.hasNext(); ) {
+                Node node = i.next();
                 theQuery.addJoinedAttribute(node.generateExpression(context));
             }
         }
@@ -261,8 +261,8 @@
      * an alias, where the variableName is registered to an alias.
      */
     @Override
-    public Class resolveClass(GenerationContext generationContext) {
-        Class clazz = null;
+    public Class<?> resolveClass(GenerationContext generationContext) {
+        Class<?> clazz = null;
         String name = getCanonicalVariableName();
         ParseTreeContext context = generationContext.getParseTreeContext();
         if (context.isRangeVariable(name)) {
@@ -284,7 +284,7 @@
     public String toString(int indent) {
         StringBuilder buffer = new StringBuilder();
         toStringIndent(indent, buffer);
-        buffer.append(toStringDisplayName() + "[" + getVariableName() + "]");
+        buffer.append(toStringDisplayName()).append("[").append(getVariableName()).append("]");
         return buffer.toString();
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/mappings/converters/AttributeNamePrefix.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/mappings/converters/AttributeNamePrefix.java
index 8e057ed..304604f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/mappings/converters/AttributeNamePrefix.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/mappings/converters/AttributeNamePrefix.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
@@ -73,7 +73,7 @@
      * Creates an instance of attribute name prefix enumeration element.
      * @param name Attribute name prefix identifier.
      */
-    private AttributeNamePrefix(final String name) {
+    AttributeNamePrefix(final String name) {
         this.name = name;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/Context.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/Context.java
index d062f91..d73dc24 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/Context.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/Context.java
@@ -266,7 +266,7 @@
 
     }
 
-    private class XPathQueryResult {
+    private static class XPathQueryResult {
         /*
          * Mapping corresponding to the XPath query
          */
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolver.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolver.java
index a4648d6..d6698af 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolver.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/NamespaceResolver.java
@@ -248,11 +248,11 @@
      * Returns the list of prefixes in the NamespaceResolver
      * @return An Enumeration containing the prefixes in the NamespaceResolver
      */
-    public Enumeration getPrefixes() {
+    public Enumeration<String> getPrefixes() {
         if (hasPrefixesToNamespaces()) {
-            return new IteratorEnumeration(getPrefixesToNamespaces().keySet().iterator());
+            return new IteratorEnumeration<>(getPrefixesToNamespaces().keySet().iterator());
         } else {
-            return new IteratorEnumeration(null);
+            return new IteratorEnumeration<>(null);
         }
     }
 
@@ -262,7 +262,7 @@
      * Used for deployment XML
      * @return A Vector containing the namespace URIs in the namespace resolver
      */
-    public Vector getNamespaces() {
+    public Vector<Namespace> getNamespaces() {
         if (!hasPrefixesToNamespaces()) {
             return EMPTY_VECTOR;
         }
@@ -320,11 +320,11 @@
         return null;
     }
 
-    private static class IteratorEnumeration implements Enumeration {
+    private static class IteratorEnumeration<E> implements Enumeration<E> {
 
-        private Iterator iterator;
+        private final Iterator<E> iterator;
 
-        public IteratorEnumeration(Iterator iterator) {
+        public IteratorEnumeration(Iterator<E> iterator) {
             this.iterator = iterator;
         }
 
@@ -337,7 +337,7 @@
         }
 
         @Override
-        public Object nextElement() {
+        public E nextElement() {
             return iterator.next();
         }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/UnmarshalXPathEngine.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/UnmarshalXPathEngine.java
index 29fb44b..ca8dc71 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/UnmarshalXPathEngine.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/UnmarshalXPathEngine.java
@@ -26,7 +26,6 @@
 import org.eclipse.persistence.platform.xml.XMLNamespaceResolver;
 import org.eclipse.persistence.platform.xml.XMLNodeList;
 import org.eclipse.persistence.platform.xml.XMLPlatform;
-import org.eclipse.persistence.platform.xml.XMLPlatformException;
 import org.eclipse.persistence.platform.xml.XMLPlatformFactory;
 import org.w3c.dom.Attr;
 import org.w3c.dom.Element;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/VectorUtils.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/VectorUtils.java
index 2f7806f..f1dad4f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/VectorUtils.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/VectorUtils.java
@@ -210,27 +210,39 @@
 
         @Override
         public ListIterator<E> listIterator(final int index) {
-            return new ListIterator<E>() {
+            return new ListIterator<>() {
                 private final ListIterator<? extends E> i
-                    = listIterator(index);
+                        = listIterator(index);
 
                 @Override
-                public boolean hasNext() {return i.hasNext();}
+                public boolean hasNext() {
+                    return i.hasNext();
+                }
 
                 @Override
-                public E next() {return i.next();}
+                public E next() {
+                    return i.next();
+                }
 
                 @Override
-                public boolean hasPrevious() {return i.hasPrevious();}
+                public boolean hasPrevious() {
+                    return i.hasPrevious();
+                }
 
                 @Override
-                public E previous() {return i.previous();}
+                public E previous() {
+                    return i.previous();
+                }
 
                 @Override
-                public int nextIndex() {return i.nextIndex();}
+                public int nextIndex() {
+                    return i.nextIndex();
+                }
 
                 @Override
-                public int previousIndex() {return i.previousIndex();}
+                public int previousIndex() {
+                    return i.previousIndex();
+                }
 
                 @Override
                 public void remove() {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLChoiceCollectionMappingMarshalNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLChoiceCollectionMappingMarshalNodeValue.java
index 8c0a46f..87e9e12 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLChoiceCollectionMappingMarshalNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLChoiceCollectionMappingMarshalNodeValue.java
@@ -328,7 +328,7 @@
                 if(xmlChoiceCollectionMapping.isAny()) {
                     return this.anyNodeValue;
                 }
-                Class<? extends Object> theClass = fieldValue.getClass();
+                Class<?> theClass = fieldValue.getClass();
                 while(associatedField == null) {
                     associatedField = (Field) xmlChoiceCollectionMapping.getClassToFieldMappings().get(theClass);
                     if(theClass.getSuperclass() != null) {
@@ -342,7 +342,7 @@
                 nodeValue = this.fieldToNodeValues.get(associatedField);
             }
         } else {
-            Class<? extends Object> theClass = value.getClass();
+            Class<?> theClass = value.getClass();
             while(associatedField == null) {
                 associatedField = (Field) xmlChoiceCollectionMapping.getClassToFieldMappings().get(theClass);
                 List<FieldNodeValue> fieldNodes = classToNodeValues.get(theClass);
@@ -374,7 +374,7 @@
         if(associatedField == null) {
             //check the field associations
             List<Field> sourceFields = null;
-            Class<? extends Object> theClass = value.getClass();
+            Class<?> theClass = value.getClass();
             while(theClass != null) {
                 sourceFields = (List<Field>) xmlChoiceCollectionMapping.getClassToSourceFieldsMappings().get(theClass);
                 if(sourceFields != null) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.java
index ab82092..e172cd2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeCollectionMappingNodeValue.java
@@ -303,7 +303,7 @@
         if(descriptor == null){
             descriptor = (Descriptor) session.getDescriptor(value.getClass());
         }else if(descriptor.hasInheritance()){
-            Class<? extends Object> objectValueClass = value.getClass();
+            Class<?> objectValueClass = value.getClass();
             if(!(objectValueClass == descriptor.getJavaClass())){
                 descriptor = (Descriptor) session.getDescriptor(objectValueClass);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeObjectMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeObjectMappingNodeValue.java
index 6fad5f2..c55ad0c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeObjectMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLCompositeObjectMappingNodeValue.java
@@ -215,7 +215,7 @@
         if(descriptor == null){
             descriptor = (Descriptor) session.getDescriptor(objectValue.getClass());
         }else if(descriptor.hasInheritance()){
-            Class<? extends Object> objectValueClass = objectValue.getClass();
+            Class<?> objectValueClass = objectValue.getClass();
             if(!(objectValueClass == descriptor.getJavaClass())){
                 descriptor = (Descriptor) session.getDescriptor(objectValueClass);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLConversionManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLConversionManager.java
index 3bde576..9299731 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLConversionManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLConversionManager.java
@@ -1695,7 +1695,6 @@
     public String convertListToString(Object sourceObject, QName schemaType) throws ConversionException {
         StringBuilder returnStringBuilder = new StringBuilder();
         if (sourceObject instanceof List) {
-            @SuppressWarnings({"unchecked"})
             List<?> list = (List<?>) sourceObject;
             for (int i = 0, listSize = list.size(); i < listSize; i++) {
                 Object next = list.get(i);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLMarshaller.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLMarshaller.java
index d4c02c2..b21f9ac 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLMarshaller.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLMarshaller.java
@@ -487,7 +487,7 @@
     }
 
     protected boolean isSimpleXMLRoot(Root xmlRoot) {
-        Class<? extends Object> xmlRootObjectClass = xmlRoot.getObject().getClass();
+        Class<?> xmlRootObjectClass = xmlRoot.getObject().getClass();
 
         ConversionManager conversionManager = (ConversionManager) context.getSession().getDatasourcePlatform().getConversionManager();
         if (conversionManager.schemaType(xmlRootObjectClass) != null || CoreClassConstants.List_Class.isAssignableFrom(xmlRootObjectClass) || CoreClassConstants.XML_GREGORIAN_CALENDAR.isAssignableFrom(xmlRootObjectClass) || CoreClassConstants.DURATION.isAssignableFrom(xmlRootObjectClass)) {
@@ -545,7 +545,7 @@
                 }
             }
         }else{
-            Class<? extends Object> objectClass = object.getClass();
+            Class<?> objectClass = object.getClass();
             session = context.getSession(objectClass);
             xmlDescriptor = getDescriptor(objectClass, session);
         }
@@ -587,7 +587,7 @@
                 }
             }
         }else{
-            Class<? extends Object> objectClass = object.getClass();
+            Class<?> objectClass = object.getClass();
             session = context.getSession(objectClass);
             xmlDescriptor = getDescriptor(objectClass, session);
         }
@@ -853,7 +853,7 @@
                 }
             }
         }else{
-            Class<? extends Object> objectClass = object.getClass();
+            Class<?> objectClass = object.getClass();
             session = context.getSession(objectClass);
             xmlDescriptor = getDescriptor(objectClass, session);
         }
@@ -980,7 +980,7 @@
                 }
             }
         }else{
-            Class<? extends Object> objectClass = object.getClass();
+            Class<?> objectClass = object.getClass();
             session = context.getSession(objectClass);
             xmlDescriptor = getDescriptor(objectClass, session);
         }
@@ -1135,7 +1135,7 @@
                 }
             }
         }else{
-            Class<? extends Object> objectClass = object.getClass();
+            Class<?> objectClass = object.getClass();
             if(object instanceof Collection) {
                 int valueSize = ((Collection)object).size();
                 if(marshalRecord.getMarshaller().isApplicationJSON() && (valueSize > 1 || !marshalRecord.getMarshaller().isReduceAnyArrays())) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLVariableXPathMappingNodeValue.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLVariableXPathMappingNodeValue.java
index ceef000..31fc805 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLVariableXPathMappingNodeValue.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XMLVariableXPathMappingNodeValue.java
@@ -86,7 +86,7 @@
         Descriptor descriptor = (Descriptor)mapping.getReferenceDescriptor();
 
         if(descriptor.hasInheritance()){
-              Class<? extends Object> objectValueClass = value.getClass();
+              Class<?> objectValueClass = value.getClass();
                if(!(objectValueClass == descriptor.getJavaClass())){
                    descriptor = (Descriptor) session.getDescriptor(objectValueClass);
                }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathEngine.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathEngine.java
index a36a4f2..18c3edd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathEngine.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/XPathEngine.java
@@ -674,7 +674,7 @@
         for (int i = 0; i < size; i++) {
             next = elements.item(i);
             if (next.getNodeType() == Node.ELEMENT_NODE) {
-                Class<? extends Object> valueClass = values.get(i).getClass();
+                Class<?> valueClass = values.get(i).getClass();
                 if(valueClass != CoreClassConstants.STRING){
                     ConversionManager conversionManager = (ConversionManager) session.getDatasourcePlatform().getConversionManager();
                     QName qname = field.getXMLType(valueClass, conversionManager);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/CharacterEscapeHandlerWrapper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/CharacterEscapeHandlerWrapper.java
index 723f411..4cabc55 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/CharacterEscapeHandlerWrapper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/CharacterEscapeHandlerWrapper.java
@@ -33,15 +33,15 @@
 public class CharacterEscapeHandlerWrapper implements CharacterEscapeHandler {
 
     private final static String ESCAPE_METHOD_NAME = "escape";
-    private final static Class[] PARAMS = new Class[] {
+    private final static Class<?>[] PARAMS = new Class<?>[] {
         CoreClassConstants.APCHAR, CoreClassConstants.PINT, CoreClassConstants.PINT, CoreClassConstants.PBOOLEAN, Writer.class };
 
-    private Object handler;
-    private Method escapeMethod;
+    private final Object handler;
+    private final Method escapeMethod;
 
     public CharacterEscapeHandlerWrapper(Object sunHandler) {
         this.handler = sunHandler;
-        Class<? extends Object> handlerClass = sunHandler.getClass();
+        Class<?> handlerClass = sunHandler.getClass();
 
         try {
             this.escapeMethod = PrivilegedAccessHelper.getMethod(handlerClass, ESCAPE_METHOD_NAME, PARAMS, false);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DomToXMLEventWriter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DomToXMLEventWriter.java
index 1c0fefd..0b7debe 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DomToXMLEventWriter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DomToXMLEventWriter.java
@@ -28,10 +28,9 @@
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
 
 public class DomToXMLEventWriter{
-    private XMLEventFactory xmlEventFactory;
+    private final XMLEventFactory xmlEventFactory;
 
     public DomToXMLEventWriter() {
         this.xmlEventFactory = XMLEventFactory.newInstance();
@@ -128,7 +127,6 @@
         for(int i = 0; i < attrs.getLength(); i++) {
             Attr next = (Attr)attrs.item(i);
             if(next.getNodeType() == Node.ATTRIBUTE_NODE) {
-                Attr attribute = next;
                 if(next.getPrefix() != null && next.getPrefix().equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE)) {
                     String currentUri = xew.getNamespaceContext().getNamespaceURI(next.getLocalName());
                     if(currentUri == null || !currentUri.equals(next.getValue())) {
@@ -140,7 +138,7 @@
                         xew.add(xmlEventFactory.createNamespace(next.getValue()));
                         needToAddDefaultNS = false;
                     }else{
-                        nonNamespaceDeclAttrs.add(attribute);
+                        nonNamespaceDeclAttrs.add(next);
                     }
                 }
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DomToXMLStreamWriter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DomToXMLStreamWriter.java
index 47d131b..a0329c8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DomToXMLStreamWriter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/DomToXMLStreamWriter.java
@@ -28,7 +28,6 @@
 import org.w3c.dom.NamedNodeMap;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
-import org.w3c.dom.Text;
 
 public class DomToXMLStreamWriter{
 
@@ -123,7 +122,6 @@
         for(int i = 0; i < attrs.getLength(); i++) {
             Attr next = (Attr)attrs.item(i);
             if(next.getNodeType() == Node.ATTRIBUTE_NODE) {
-                Attr attribute = next;
                 if(next.getPrefix() != null && next.getPrefix().equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE)) {
                     String currentUri = xsw.getNamespaceContext().getNamespaceURI(next.getLocalName());
                     if(currentUri == null || !currentUri.equals(next.getValue())) {
@@ -135,7 +133,7 @@
                         xsw.writeDefaultNamespace(next.getValue());
                         needToAddDefaultNS = false;
                     }else{
-                        nonNamespaceDeclAttrs.add(attribute);
+                        nonNamespaceDeclAttrs.add(next);
                     }
                 }
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/namespaces/NamespacePrefixMapperWrapper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/namespaces/NamespacePrefixMapperWrapper.java
index 19a49b1..51abccf 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/namespaces/NamespacePrefixMapperWrapper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/record/namespaces/NamespacePrefixMapperWrapper.java
@@ -28,23 +28,23 @@
  * This allows for backwards compatibility with the JAXB RI.
  */
 public class NamespacePrefixMapperWrapper extends NamespacePrefixMapper {
-    private static String GET_PREF_PREFIX_METHOD_NAME = "getPreferredPrefix";
-    private static String GET_PRE_DECL_NAMESPACE_URIS_METHOD_NAME = "getPreDeclaredNamespaceUris";
-    private static String GET_PRE_DECL_NAMESPACE_URIS2_METHOD_NAME = "getPreDeclaredNamespaceUris2";
-    private static String GET_CONTEXTUAL_NAMESPACE_DECL_METHOD_NAME = "getContextualNamespaceDecls";
+    private static final String GET_PREF_PREFIX_METHOD_NAME = "getPreferredPrefix";
+    private static final String GET_PRE_DECL_NAMESPACE_URIS_METHOD_NAME = "getPreDeclaredNamespaceUris";
+    private static final String GET_PRE_DECL_NAMESPACE_URIS2_METHOD_NAME = "getPreDeclaredNamespaceUris2";
+    private static final String GET_CONTEXTUAL_NAMESPACE_DECL_METHOD_NAME = "getContextualNamespaceDecls";
 
-    private static final Class[] EMPTY_CLASS_ARRAY = new Class[]{};
-    private static final Class[] PREF_PREFIX_PARAM_TYPES = new Class[] {CoreClassConstants.STRING, CoreClassConstants.STRING, CoreClassConstants.PBOOLEAN};
+    private static final Class<?>[] EMPTY_CLASS_ARRAY = new Class<?>[]{};
+    private static final Class<?>[] PREF_PREFIX_PARAM_TYPES = new Class<?>[] {CoreClassConstants.STRING, CoreClassConstants.STRING, CoreClassConstants.PBOOLEAN};
 
-    private Object prefixMapper;
-    private Method getPreferredPrefixMethod;
-    private Method getPredeclaredNamespaceUrisMethod;
-    private Method getPredeclaredNamespaceUris2Method;
-    private Method getContextualNamespaceDeclsMethod;
+    private final Object prefixMapper;
+    private final Method getPreferredPrefixMethod;
+    private final Method getPredeclaredNamespaceUrisMethod;
+    private final Method getPredeclaredNamespaceUris2Method;
+    private final Method getContextualNamespaceDeclsMethod;
 
     public NamespacePrefixMapperWrapper(Object prefixMapper) {
         this.prefixMapper = prefixMapper;
-        Class<? extends Object> prefixMapperClass = prefixMapper.getClass();
+        Class<?> prefixMapperClass = prefixMapper.getClass();
         try {
             this.getPreferredPrefixMethod = PrivilegedAccessHelper.getMethod(prefixMapperClass, GET_PREF_PREFIX_METHOD_NAME, PREF_PREFIX_PARAM_TYPES, false);
         } catch(Exception ex) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/SchemaModelGenerator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/SchemaModelGenerator.java
index 5f54411..7a32186 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/SchemaModelGenerator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/SchemaModelGenerator.java
@@ -963,7 +963,7 @@
         Schema s = getSchema(fragUri, null, schemaForNamespace, properties);
         String targetNS = workingSchema.getTargetNamespace();
         if ((s.isElementFormDefault() && !fragUri.equals(targetNS)) || (!s.isElementFormDefault() && fragUri.length() > 0)) {
-            globalElement = (Element) s.getTopLevelElements().get(frag.getLocalName());
+            globalElement = s.getTopLevelElements().get(frag.getLocalName());
             if (globalElement == null) {
                 globalElement = new Element();
                 globalElement.setName(frag.getLocalName());
@@ -1040,7 +1040,7 @@
             if ((s.isElementFormDefault() && !fragUri.equals(targetNS)) || (!s.isElementFormDefault() && fragUri.length() > 0)) {
                 // must generate a global element are create a reference to it
                 // if the global element exists, use it; otherwise create a new one
-                globalElement = (Element) s.getTopLevelElements().get(frag.getLocalName());
+                globalElement = s.getTopLevelElements().get(frag.getLocalName());
                 if (globalElement == null) {
                     globalElement = new Element();
                     globalElement.setName(frag.getLocalName());
@@ -1375,7 +1375,7 @@
      *
      */
     protected boolean isComplexTypeWithSimpleContentRequired(Descriptor desc) {
-        return desc.getMappings().size() > 1 ? true : false;
+        return desc.getMappings().size() > 1;
     }
 
     /**
@@ -1393,10 +1393,7 @@
         }
 
         Collection<String> fieldValues = ((EnumTypeConverter) converter).getAttributeToFieldValues().values();
-        ArrayList facets = new ArrayList();
-        for (String field : fieldValues) {
-            facets.add(field);
-        }
+        List<String> facets = new ArrayList<>(fieldValues);
 
         Restriction restriction = new Restriction();
         restriction.setEnumerationFacets(facets);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Annotation.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Annotation.java
index a381ba0..c181eb8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Annotation.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Annotation.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,26 +14,30 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.oxm.schema.model;
 
+import org.w3c.dom.Element;
+
+import java.util.List;
+
 public class Annotation {
-    private java.util.List documentation;
-    private java.util.List appInfo;
+    private java.util.List<String> documentation;
+    private java.util.List<org.w3c.dom.Element> appInfo;
 
     public Annotation() {
     }
 
-    public void setDocumentation(java.util.List documentation) {
+    public void setDocumentation(List<String> documentation) {
         this.documentation = documentation;
     }
 
-    public java.util.List getDocumentation() {
+    public List<String> getDocumentation() {
         return documentation;
     }
 
-    public void setAppInfo(java.util.List appInfo) {
+    public void setAppInfo(List<org.w3c.dom.Element> appInfo) {
         this.appInfo = appInfo;
     }
 
-    public java.util.List getAppInfo() {
+    public List<Element> getAppInfo() {
         return appInfo;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/AttributeGroup.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/AttributeGroup.java
index 37ad429..601b109 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/AttributeGroup.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/AttributeGroup.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -15,22 +15,23 @@
 package org.eclipse.persistence.internal.oxm.schema.model;
 
 import java.util.ArrayList;
+import java.util.List;
 
 public class AttributeGroup {
-    private java.util.List attributes;
+    private java.util.List<Attribute> attributes;
     private AnyAttribute anyAttribute;
     private String name;
     private String ref;
 
     public AttributeGroup() {
-        attributes = new ArrayList();
+        attributes = new ArrayList<>();
     }
 
-    public void setAttributes(java.util.List attributes) {
+    public void setAttributes(List<Attribute> attributes) {
         this.attributes = attributes;
     }
 
-    public java.util.List getAttributes() {
+    public List<Attribute> getAttributes() {
         return attributes;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Choice.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Choice.java
index 3141a0f..f260eff 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Choice.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Choice.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -15,6 +15,7 @@
 package org.eclipse.persistence.internal.oxm.schema.model;
 
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p><b>Purpose</b>: Class to represent a Choice in a Schema
@@ -35,16 +36,16 @@
         for (int i = 0; i < newElements.size(); i++) {
             Object next = newElements.get(i);
             if (next instanceof Element) {
-                getElements().add(next);
+                getElements().add((Element) next);
             }
         }
     }
 
     @Override
-    public void setSequences(java.util.List sequences) {
+    public void setSequences(List<Sequence> sequences) {
         if ((sequences != null) && (sequences.size() > 0)) {
             for (int i = 0; i < sequences.size(); i++) {
-                ((Sequence)sequences.get(i)).setOwner(this);
+                sequences.get(i).setOwner(this);
             }
 
             orderedElements.addAll(sequences);
@@ -52,19 +53,19 @@
     }
 
     @Override
-    public void setChoices(java.util.List choices) {
+    public void setChoices(List<Choice> choices) {
         if ((choices != null) && (choices.size() > 0)) {
             for (int i = 0; i < choices.size(); i++) {
-                ((Choice)choices.get(i)).setOwner(this);
+                choices.get(i).setOwner(this);
             }
 
             orderedElements.addAll(choices);
         }
     }
 
-    public void setNestedParticles(java.util.List nestedParticles) {
+    public void setNestedParticles(java.util.List<NestedParticle> nestedParticles) {
         for (int i = 0; i < nestedParticles.size(); i++) {
-            NestedParticle next = (NestedParticle)nestedParticles.get(i);
+            NestedParticle next = nestedParticles.get(i);
             if (next instanceof Choice) {
                 addChoice((Choice)next);
             } else if (next instanceof Sequence) {
@@ -98,13 +99,13 @@
     }
 
     @Override
-    public void setElements(java.util.List elements) {
+    public void setElements(List<Element> elements) {
         orderedElements.addAll(elements);
         getElements().addAll(elements);
     }
 
     @Override
-    public void setAnys(java.util.List anys) {
+    public void setAnys(List<Any> anys) {
         orderedElements.addAll(anys);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/ComplexType.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/ComplexType.java
index 5d6d7d3..cc98073b 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/ComplexType.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/ComplexType.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,8 +14,10 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.oxm.schema.model;
 
+import javax.xml.namespace.QName;
 import java.util.ArrayList;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -34,13 +36,13 @@
     //simple content or complex content or typedef and attrDecls
     private ComplexContent complexContent;
     private SimpleContent simpleContent;
-    private Map attributesMap;
+    private Map<QName, String> attributesMap;
     private Annotation annotation;
-    private java.util.List orderedAttributes;
+    private java.util.List<Attribute> orderedAttributes;
 
     public ComplexType() {
-        orderedAttributes = new ArrayList();
-        attributesMap = new HashMap();
+        orderedAttributes = new ArrayList<>();
+        attributesMap = new HashMap<>();
     }
 
     public void setName(String name) {
@@ -166,11 +168,11 @@
         this.owner = owner;
     }
 
-    public void setAttributesMap(Map attributesMap) {
+    public void setAttributesMap(Map<QName, String> attributesMap) {
         this.attributesMap = attributesMap;
     }
 
-    public Map getAttributesMap() {
+    public Map<QName, String> getAttributesMap() {
         return attributesMap;
     }
 
@@ -182,11 +184,11 @@
         return annotation;
     }
 
-    public void setOrderedAttributes(java.util.List orderedAttributes) {
+    public void setOrderedAttributes(List<Attribute> orderedAttributes) {
         this.orderedAttributes = orderedAttributes;
     }
 
-    public java.util.List getOrderedAttributes() {
+    public List<Attribute> getOrderedAttributes() {
         return orderedAttributes;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Extension.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Extension.java
index c3c169a..97015ff 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Extension.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Extension.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -15,12 +15,13 @@
 package org.eclipse.persistence.internal.oxm.schema.model;
 
 import java.util.ArrayList;
+import java.util.List;
 
 public class Extension {
     private String baseType;//QName lateR??
     private java.util.List attributes;
     private Content owner;
-    private java.util.List orderedAttributes;
+    private java.util.List<Attribute> orderedAttributes;
     private TypeDefParticle typeDefParticle;
     private Choice choice;
     private Sequence sequence;
@@ -28,7 +29,7 @@
     private AnyAttribute anyAttribute;
 
     public Extension() {
-        orderedAttributes = new ArrayList();
+        orderedAttributes = new ArrayList<>();
     }
 
     public void setBaseType(String baseType) {
@@ -102,11 +103,11 @@
         return null;
     }
 
-    public void setOrderedAttributes(java.util.List orderedAttributes) {
+    public void setOrderedAttributes(List<Attribute> orderedAttributes) {
         this.orderedAttributes = orderedAttributes;
     }
 
-    public java.util.List getOrderedAttributes() {
+    public List<Attribute> getOrderedAttributes() {
         return orderedAttributes;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/NestedParticle.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/NestedParticle.java
index 7170f78..7d7c9d2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/NestedParticle.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/NestedParticle.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
@@ -14,6 +14,8 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.oxm.schema.model;
 
+import java.util.List;
+
 /**
  * <p><b>Purpose</b>: Interface to represent a Choice or Sequence
  * @see org.eclipse.persistence.internal.oxm.schema.model.Sequence
@@ -30,13 +32,13 @@
 
     boolean hasAny();
 
-    void setSequences(java.util.List sequences);
+    void setSequences(List<Sequence> sequences);
 
-    void setChoices(java.util.List choices);
+    void setChoices(List<Choice> choices);
 
-    void setAnys(java.util.List anys);
+    void setAnys(List<Any> anys);
 
-    void setElements(java.util.List elements);
+    void setElements(List<Element> elements);
 
     void setMinOccurs(String minOccurs);
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Restriction.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Restriction.java
index 2aac77d..6286cef 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Restriction.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Restriction.java
@@ -26,7 +26,7 @@
     private Sequence sequence;
     private All all;
     private SimpleType simpleType;
-    private java.util.ArrayList enumerationFacets;
+    private List enumerationFacets;
     private AnyAttribute anyAttribute;
     private String minInclusive;
     private String maxInclusive;
@@ -40,7 +40,7 @@
     private String maxLength;
 
     //private List facets
-    private java.util.List attributes;
+    private List<Attribute> attributes;
     private Restrictable owner;
 
     public Restriction() {
@@ -142,19 +142,19 @@
         return simpleType;
     }
 
-    public void setAttributes(java.util.List attributes) {
+    public void setAttributes(List<Attribute> attributes) {
         this.attributes = attributes;
     }
 
-    public java.util.List getAttributes() {
+    public List<Attribute> getAttributes() {
         return attributes;
     }
 
-    public java.util.ArrayList getEnumerationFacets() {
+    public List getEnumerationFacets() {
         return enumerationFacets;
     }
 
-    public void setEnumerationFacets(java.util.ArrayList values) {
+    public void setEnumerationFacets(List values) {
         enumerationFacets = values;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Schema.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Schema.java
index 0a9d4c9..541a1f7 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Schema.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Schema.java
@@ -17,6 +17,7 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
@@ -27,38 +28,38 @@
 
 public class Schema {
     private String name;//non-persistant, used to give a schema an identifier
-    private java.util.List imports;
-    private java.util.List includes;
+    private List<Import> imports;
+    private List<Include> includes;
     private String targetNamespace;
     private String defaultNamespace;
 
     private boolean elementFormDefault;//error mapping in mw
     private boolean attributeFormDefault;//error mapping in mw
-    private Map topLevelSimpleTypes;
-    private Map topLevelComplexTypes;
-    private Map topLevelElements;
-    private Map topLevelAttributes;
+    private Map<String, SimpleType> topLevelSimpleTypes;
+    private Map<String, ComplexType> topLevelComplexTypes;
+    private Map<String, Element> topLevelElements;
+    private Map<String, Attribute> topLevelAttributes;
     private NamespaceResolver namespaceResolver;
-    private Map attributesMap;
-    private Map attributeGroups;
-    private Map groups;
+    private Map<QName, String> attributesMap;
+    private Map<String, AttributeGroup> attributeGroups;
+    private Map<String, Group> groups;
     private Annotation annotation;
     private Result result;
 
     public Schema() {
         namespaceResolver = new NamespaceResolver();
-        imports = new ArrayList();
-        includes = new ArrayList();
+        imports = new ArrayList<>();
+        includes = new ArrayList<>();
         //LinkedHashMaps are needed to force determinism of generated schemas.
         //It is important to generate always the same schema (e.g. with SchemaGenerator) with given input Schema.
         //Without LinkedHashMap it would be JDK dependent and the output schema would be different with different JDKs used.
-        topLevelSimpleTypes = new LinkedHashMap();
-        topLevelComplexTypes = new LinkedHashMap();
-        topLevelElements = new LinkedHashMap();
-        topLevelAttributes = new LinkedHashMap();
-        attributesMap = new LinkedHashMap();
-        attributeGroups = new LinkedHashMap();
-        groups = new LinkedHashMap();
+        topLevelSimpleTypes = new LinkedHashMap<>();
+        topLevelComplexTypes = new LinkedHashMap<>();
+        topLevelElements = new LinkedHashMap<>();
+        topLevelAttributes = new LinkedHashMap<>();
+        attributesMap = new LinkedHashMap<>();
+        attributeGroups = new LinkedHashMap<>();
+        groups = new LinkedHashMap<>();
     }
 
     public void setTargetNamespace(String targetNamespace) {
@@ -77,11 +78,11 @@
         return this.defaultNamespace;
     }
 
-    public void setTopLevelSimpleTypes(Map topLevelSimpleTypes) {
+    public void setTopLevelSimpleTypes(Map<String, SimpleType> topLevelSimpleTypes) {
         this.topLevelSimpleTypes = topLevelSimpleTypes;
     }
 
-    public Map getTopLevelSimpleTypes() {
+    public Map<String, SimpleType> getTopLevelSimpleTypes() {
         return topLevelSimpleTypes;
     }
 
@@ -89,11 +90,11 @@
         topLevelSimpleTypes.put(simpleType.getName(), simpleType);
     }
 
-    public void setTopLevelComplexTypes(Map topLevelComplexTypes) {
+    public void setTopLevelComplexTypes(Map<String, ComplexType> topLevelComplexTypes) {
         this.topLevelComplexTypes = topLevelComplexTypes;
     }
 
-    public Map getTopLevelComplexTypes() {
+    public Map<String, ComplexType> getTopLevelComplexTypes() {
         return topLevelComplexTypes;
     }
 
@@ -101,11 +102,11 @@
         topLevelComplexTypes.put(complexType.getName(), complexType);
     }
 
-    public void setTopLevelElements(Map topLevelElements) {
+    public void setTopLevelElements(Map<String, Element> topLevelElements) {
         this.topLevelElements = topLevelElements;
     }
 
-    public Map getTopLevelElements() {
+    public Map<String, Element> getTopLevelElements() {
         return topLevelElements;
     }
 
@@ -129,11 +130,11 @@
         return attributeFormDefault;
     }
 
-    public void setTopLevelAttributes(Map topLevelAttributes) {
+    public void setTopLevelAttributes(Map<String, Attribute> topLevelAttributes) {
         this.topLevelAttributes = topLevelAttributes;
     }
 
-    public Map getTopLevelAttributes() {
+    public Map<String, Attribute> getTopLevelAttributes() {
         return topLevelAttributes;
     }
 
@@ -145,30 +146,30 @@
         return namespaceResolver;
     }
 
-    public void setImports(java.util.List imports) {
+    public void setImports(List<Import> imports) {
         this.imports = imports;
     }
 
-    public java.util.List getImports() {
+    public List<Import> getImports() {
         return imports;
     }
 
-    public void setIncludes(java.util.List includes) {
+    public void setIncludes(List<Include> includes) {
         this.includes = includes;
     }
 
-    public java.util.List getIncludes() {
+    public List<Include> getIncludes() {
         return includes;
     }
 
-    public void setAttributesMap(Map attributesMap) {
+    public void setAttributesMap(Map<QName, String> attributesMap) {
         this.attributesMap = attributesMap;
-        Iterator<Entry> iter = attributesMap.entrySet().iterator();
+        Iterator<Entry<QName, String>> iter = attributesMap.entrySet().iterator();
         while (iter.hasNext()) {
-            Entry nextEntry = iter.next();
-            QName key = (QName)nextEntry.getKey();
+            Entry<QName, String> nextEntry = iter.next();
+            QName key = nextEntry.getKey();
             if (key.getNamespaceURI().equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE_NS_URI)) {
-                String value = (String)nextEntry.getValue();
+                String value = nextEntry.getValue();
                 String prefix = key.getLocalPart();
                 int index = prefix.indexOf(':');
                 if (index > -1) {
@@ -179,7 +180,7 @@
         }
     }
 
-    public Map getAttributesMap() {
+    public Map<QName, String> getAttributesMap() {
         return attributesMap;
     }
 
@@ -191,76 +192,70 @@
         return this.name;
     }
 
-    public void setAttributeGroups(Map attributeGroups) {
+    public void setAttributeGroups(Map<String, AttributeGroup> attributeGroups) {
         this.attributeGroups = attributeGroups;
     }
 
-    public Map getAttributeGroups() {
+    public Map<String, AttributeGroup> getAttributeGroups() {
         return attributeGroups;
     }
 
     public AttributeGroup getAttributeGroup(String uri, String localName) {
-        AttributeGroup globalAttributeGroup = null;
         if (uri.equals(targetNamespace)) {
-            globalAttributeGroup = (AttributeGroup)getAttributeGroups().get(localName);
+            AttributeGroup globalAttributeGroup = getAttributeGroups().get(localName);
             if (globalAttributeGroup != null) {
                 return globalAttributeGroup;
             }
         }
-        globalAttributeGroup = getAttributeGroupFromReferencedSchemas(uri, localName);
-
-        return globalAttributeGroup;
+        return getAttributeGroupFromReferencedSchemas(uri, localName);
     }
 
     protected AttributeGroup getAttributeGroupFromReferencedSchemas(String uri, String localName) {
         AttributeGroup globalAttributeGroup = null;
-        Iterator iter = getIncludes().iterator();
+        Iterator<Include> iter = getIncludes().iterator();
         while (iter.hasNext() && (globalAttributeGroup == null)) {
-            Schema includedSchema = ((Include)iter.next()).getSchema();
+            Schema includedSchema = iter.next().getSchema();
             globalAttributeGroup = includedSchema.getAttributeGroup(uri, localName);
         }
         if (globalAttributeGroup == null) {
-            iter = getImports().iterator();
-             while (iter.hasNext() && (globalAttributeGroup == null)) {
-                Schema importedSchema = ((Import)iter.next()).getSchema();
+            Iterator<Import> iter2 = getImports().iterator();
+             while (iter2.hasNext() && (globalAttributeGroup == null)) {
+                Schema importedSchema = iter2.next().getSchema();
                 globalAttributeGroup = importedSchema.getAttributeGroup(uri, localName);
             }
         }
         return globalAttributeGroup;
     }
 
-    public void setGroups(Map groups) {
+    public void setGroups(Map<String, Group> groups) {
         this.groups = groups;
     }
 
-    public Map getGroups() {
+    public Map<String, Group> getGroups() {
         return groups;
     }
 
     public Group getGroup(String uri, String localName) {
-        Group globalGroup = null;
         if (uri.equals(targetNamespace)) {
-            globalGroup = (Group)getGroups().get(localName);
+            Group globalGroup = getGroups().get(localName);
             if (globalGroup != null) {
                 return globalGroup;
             }
         }
-        globalGroup = getGroupFromReferencedSchemas(uri, localName);
-
-        return globalGroup;
+        return getGroupFromReferencedSchemas(uri, localName);
     }
 
     protected Group getGroupFromReferencedSchemas(String uri, String localName) {
         Group globalGroup = null;
-        Iterator iter = getIncludes().iterator();
+        Iterator<Include> iter = getIncludes().iterator();
         while (iter.hasNext() && (globalGroup == null)) {
-            Schema includedSchema = ((Include)iter.next()).getSchema();
+            Schema includedSchema = iter.next().getSchema();
             globalGroup = includedSchema.getGroup(uri, localName);
         }
         if (globalGroup == null) {
-            iter = getImports().iterator();
-            while (iter.hasNext() && (globalGroup == null)) {
-                Schema importedSchema = ((Import)iter.next()).getSchema();
+            Iterator<Import> iter2 = getImports().iterator();
+            while (iter2.hasNext() && (globalGroup == null)) {
+                Schema importedSchema = iter2.next().getSchema();
                 globalGroup = importedSchema.getGroup(uri, localName);
             }
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Sequence.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Sequence.java
index c979778..7a80732 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Sequence.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Sequence.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -15,6 +15,7 @@
 package org.eclipse.persistence.internal.oxm.schema.model;
 
 import java.util.ArrayList;
+import java.util.List;
 
 /**
  * <p><b>Purpose</b>: Class to represent a Sequence in a Schema
@@ -35,16 +36,16 @@
         for (int i = 0; i < newElements.size(); i++) {
             Object next = newElements.get(i);
             if (next instanceof Element) {
-                getElements().add(next);
+                getElements().add((Element) next);
             }
         }
     }
 
     @Override
-    public void setSequences(java.util.List sequences) {
+    public void setSequences(List<Sequence> sequences) {
         if ((sequences != null) && (sequences.size() > 0)) {
             for (int i = 0; i < sequences.size(); i++) {
-                ((Sequence)sequences.get(i)).setOwner(this);
+                sequences.get(i).setOwner(this);
             }
 
             orderedElements.addAll(sequences);
@@ -52,19 +53,19 @@
     }
 
     @Override
-    public void setChoices(java.util.List choices) {
+    public void setChoices(List<Choice> choices) {
         if ((choices != null) && (choices.size() > 0)) {
             for (int i = 0; i < choices.size(); i++) {
-                ((Choice)choices.get(i)).setOwner(this);
+                choices.get(i).setOwner(this);
             }
 
             orderedElements.addAll(choices);
         }
     }
 
-    public void setNestedParticles(java.util.List nestedParticles) {
+    public void setNestedParticles(List<? extends NestedParticle> nestedParticles) {
         for (int i = 0; i < nestedParticles.size(); i++) {
-            NestedParticle next = (NestedParticle)nestedParticles.get(i);
+            NestedParticle next = nestedParticles.get(i);
             if (next instanceof Choice) {
                 addChoice((Choice)next);
             } else if (next instanceof Sequence) {
@@ -98,13 +99,13 @@
     }
 
     @Override
-    public void setElements(java.util.List elements) {
+    public void setElements(List<Element> elements) {
         orderedElements.addAll(elements);
         getElements().addAll(elements);
     }
 
     @Override
-    public void setAnys(java.util.List anys) {
+    public void setAnys(List<Any> anys) {
         orderedElements.addAll(anys);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/SimpleComponent.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/SimpleComponent.java
index 6bb3fc6..a803e51 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/SimpleComponent.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/SimpleComponent.java
@@ -14,6 +14,7 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.oxm.schema.model;
 
+import javax.xml.namespace.QName;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -24,13 +25,13 @@
     private String defaultValue;
     private boolean isSetDefaultValue = false;
     private String fixed;
-    private Map attributesMap;
+    private Map<QName, String> attributesMap;
     private Annotation annotation;
     private String form;
     private String ref;
 
     protected SimpleComponent() {
-        attributesMap = new HashMap();
+        attributesMap = new HashMap<>();
     }
 
     public void setSimpleType(SimpleType simpleType) {
@@ -74,11 +75,11 @@
         return fixed;
     }
 
-    public void setAttributesMap(Map attributesMap) {
+    public void setAttributesMap(Map<QName, String> attributesMap) {
         this.attributesMap = attributesMap;
     }
 
-    public Map getAttributesMap() {
+    public Map<QName, String> getAttributesMap() {
         return attributesMap;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/SimpleType.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/SimpleType.java
index 553bb3d..268ba28 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/SimpleType.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/SimpleType.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -14,6 +14,7 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.oxm.schema.model;
 
+import javax.xml.namespace.QName;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -22,11 +23,11 @@
     private List list;
     private Union union;
     private Restriction restriction;
-    private Map attributesMap;
+    private Map<QName, String> attributesMap;
     private Annotation annotation;
 
     public SimpleType() {
-        attributesMap = new HashMap();
+        attributesMap = new HashMap<>();
     }
 
     public void setName(String name) {
@@ -80,11 +81,11 @@
         return union;
     }
 
-    public void setAttributesMap(Map attributesMap) {
+    public void setAttributesMap(Map<QName, String> attributesMap) {
         this.attributesMap = attributesMap;
     }
 
-    public Map getAttributesMap() {
+    public Map<QName, String> getAttributesMap() {
         return attributesMap;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/TypeDefParticle.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/TypeDefParticle.java
index 338fa03..62806ff 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/TypeDefParticle.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/TypeDefParticle.java
@@ -27,7 +27,7 @@
     private TypeDefParticleOwner owner;
     private String minOccurs;
     private String maxOccurs;
-    private java.util.List elements;
+    private java.util.List<Element> elements;
 
     //Group??
     protected TypeDefParticle() {
@@ -37,13 +37,13 @@
         getElements().add(elem);
     }
 
-    public void setElements(List elements) {
+    public void setElements(List<Element> elements) {
         this.elements = elements;
     }
 
-    public List getElements() {
+    public List<Element> getElements() {
         if (elements == null) {
-            elements = new ArrayList();
+            elements = new ArrayList<>();
         }
         return elements;
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Union.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Union.java
index fd1815d..7bb0d53 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Union.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/oxm/schema/model/Union.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -15,35 +15,35 @@
 package org.eclipse.persistence.internal.oxm.schema.model;
 
 import java.util.ArrayList;
+import java.util.List;
 
 public class Union implements SimpleDerivation {
-    private java.util.List memberTypes;
-    private java.util.List simpleTypes;
+    private List<String> memberTypes;
+    private List<SimpleType> simpleTypes;
 
     public Union() {
     }
 
-    public void setMemberTypes(java.util.List memberTypes) {
+    public void setMemberTypes(List<String> memberTypes) {
         this.memberTypes = memberTypes;
     }
 
-    public java.util.List getMemberTypes() {
+    public List<String> getMemberTypes() {
         return memberTypes;
     }
 
-    public void setSimpleTypes(java.util.List simpleTypes) {
+    public void setSimpleTypes(List<SimpleType> simpleTypes) {
         this.simpleTypes = simpleTypes;
     }
 
-    public java.util.List getSimpleTypes() {
+    public List<SimpleType> getSimpleTypes() {
         return simpleTypes;
     }
 
-    public java.util.List getAllMemberTypes() {
-        ArrayList allTypes = new ArrayList();
-        allTypes.addAll(getMemberTypes());
+    public List<String> getAllMemberTypes() {
+        List<String> allTypes = new ArrayList<>(getMemberTypes());
         for (int i = 0; i < getSimpleTypes().size(); i++) {
-            SimpleType next = (SimpleType)getSimpleTypes().get(i);
+            SimpleType next = getSimpleTypes().get(i);
             if (next.getRestriction() != null) {
                 allTypes.add(next.getRestriction().getBaseType());
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/DatasourceCallQueryMechanism.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/DatasourceCallQueryMechanism.java
index 0d23fa4..99aacc4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/DatasourceCallQueryMechanism.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/DatasourceCallQueryMechanism.java
@@ -37,10 +37,8 @@
 import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.helper.DatabaseTable;
 import org.eclipse.persistence.internal.helper.Helper;
-import org.eclipse.persistence.internal.helper.NonSynchronizedVector;
 import org.eclipse.persistence.internal.sessions.AbstractRecord;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
-import org.eclipse.persistence.mappings.DatabaseMapping;
 import org.eclipse.persistence.mappings.DatabaseMapping.WriteType;
 import org.eclipse.persistence.queries.ConstructorReportItem;
 import org.eclipse.persistence.queries.DatabaseQuery;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/InterfaceContainerPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/InterfaceContainerPolicy.java
index 8ea0a02..cb43ae7 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/InterfaceContainerPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/queries/InterfaceContainerPolicy.java
@@ -108,7 +108,7 @@
         }
 
         Method cloneMethod;
-        Class<? extends Object> javaClass = container.getClass();
+        Class<?> javaClass = container.getClass();
         if (javaClass == getContainerClass()) {
             cloneMethod = getCloneMethod();
         } else {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/ClientSessionSequencing.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/ClientSessionSequencing.java
index 0c24675..3b1fefd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/ClientSessionSequencing.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/ClientSessionSequencing.java
@@ -67,7 +67,6 @@
     * SequencingServer.getNextValue takes two arguments
     * the first argument being a session which owns write connection
     * (either DatabaseSession or ClientSession).
-     * @param cls
      */
     @Override
     public Object getNextValue(Class<?> cls) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingManager.java
index 7935581..6d54511 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingManager.java
@@ -719,7 +719,7 @@
      * The writeSession is always in a transaction, so a transaction is never required.
      * Table or sequence object with preallocation size 1 still goes through the preallocation state.
      */
-    class NoPreallocation_State extends State {
+    static class NoPreallocation_State extends State {
         @Override
         public Object getNextValue(Sequence sequence, AbstractSession writeSession) {
             return sequence.getGeneratedValue(null, writeSession);
@@ -752,7 +752,6 @@
 
     /**
      * If sequencing is connected initialize the sequences used by descriptors, otherwise connect.
-     * @param descriptors
      */
     @Override
     public void onAddDescriptors(Collection<ClassDescriptor> descriptors) {
@@ -1143,7 +1142,7 @@
         return state.getNextValue(sequence, writeSession);
     }
 
-    @SuppressWarnings({"unchecked", "rawtypes"})
+    @SuppressWarnings({"unchecked"})
     protected void logDebugSequencingConnected(int nAlreadyConnectedSequences) {
         Vector<Sequence>[] sequenceVectors = (Vector<Sequence>[]) new Vector[NUMBER_OF_STATES];
         int size = connectedSequences.size();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/AbstractRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/AbstractRecord.java
index c0a345d..ded5cdb 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/AbstractRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/AbstractRecord.java
@@ -21,7 +21,6 @@
 import org.eclipse.persistence.internal.helper.*;
 import org.eclipse.persistence.exceptions.*;
 import org.eclipse.persistence.sessions.DataRecord;
-import org.eclipse.persistence.internal.helper.DatabaseField;
 
 /**
  * <p>
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 e5ba424..29b0126 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
@@ -42,7 +42,6 @@
 import java.security.AccessController;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -1180,8 +1179,8 @@
         try{
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     Class<InjectionManager<T>> elim = AccessController.doPrivileged(new PrivilegedClassForName<>(InjectionManager.DEFAULT_CDI_INJECTION_MANAGER, true, getLoader()));
-                    Constructor<InjectionManager<T>> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<InjectionManager<T>>(elim, new Class[] {String.class}, false));
-                    return AccessController.doPrivileged(new PrivilegedInvokeConstructor<InjectionManager<T>>(constructor, new Object[] {beanManager}));
+                    Constructor<InjectionManager<T>> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(elim, new Class[]{String.class}, false));
+                    return AccessController.doPrivileged(new PrivilegedInvokeConstructor<>(constructor, new Object[]{beanManager}));
             } else {
                 Class<InjectionManager<T>> elim = org.eclipse.persistence.internal.security.PrivilegedAccessHelper.getClassForName(InjectionManager.DEFAULT_CDI_INJECTION_MANAGER, true, getLoader());
                 Constructor<InjectionManager<T>> constructor = PrivilegedAccessHelper.<InjectionManager<T>>getConstructorFor(elim, new Class[] {Object.class}, false);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ArrayRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ArrayRecord.java
index 331da6b..5965eb0 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ArrayRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/ArrayRecord.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -18,7 +18,6 @@
 import java.util.*;
 import org.eclipse.persistence.internal.helper.*;
 import org.eclipse.persistence.sessions.DatabaseRecord;
-import org.eclipse.persistence.internal.helper.DatabaseField;
 
 /**
  * PERF: Optimized record implementation using arrays instead of Vector.
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 9cc2189..de48c91 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
@@ -1070,7 +1070,7 @@
      */
     @Override
     public Object removeFromIdentityMap(Object object) {
-        Class<? extends Object> theClass = object.getClass();
+        Class<?> theClass = object.getClass();
         return removeFromIdentityMap(getSession().getId(object), theClass, getSession().getDescriptor(theClass), object);
     }
 
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 4b67faa..d1f04b8 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
@@ -1375,7 +1375,7 @@
                 @SuppressWarnings({"unchecked"})
                 List<QueryArgument> queryArguments = (List<QueryArgument>)value;
                 List<String> arguments = new ArrayList<>(queryArguments.size());
-                List<Class> types = new ArrayList<>(queryArguments.size());
+                List<Class<?>> types = new ArrayList<>(queryArguments.size());
                 List<Object> values = new ArrayList<>(queryArguments.size());
                 for (int index = 0; index < queryArguments.size(); index++) {
                     QueryArgument queryArgument = queryArguments.get(index);
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 e6f2396..6b2f55d 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
@@ -1452,7 +1452,7 @@
          }
 
          @Override
-         @SuppressWarnings({"unchecked", "rawtypes"})
+         @SuppressWarnings({"unchecked"})
          public void setAttributeValueInObject(Object object, Object value) throws DescriptorException {
              try {
                  // Get the Class of each entry in the collection
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 68ffb18..0da9047 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
@@ -736,7 +736,7 @@
     /**
      * INTERNAL:
      */
-    @SuppressWarnings({"unchecked", "rawtypes"})
+    @SuppressWarnings({"unchecked"})
     protected ServerPlatform buildCustomServerPlatformConfig(CustomServerPlatformConfig platformConfig, DatabaseSessionImpl session) {
         ServerPlatform platform;
 
@@ -1083,7 +1083,7 @@
     /**
      * INTERNAL:
      */
-    @SuppressWarnings({"unchecked", "rawtypes"})
+    @SuppressWarnings({"unchecked"})
     protected void buildOc4jJGroupsTransportManagerConfig(Oc4jJGroupsTransportManagerConfig tmConfig, RemoteCommandManager rcm) {
         TransportManager tm = null;
         try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigWriter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigWriter.java
index 5d55af0..bc8193c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigWriter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigWriter.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 import java.io.OutputStreamWriter;
 import java.io.Writer;
+import java.nio.charset.StandardCharsets;
 
 import org.eclipse.persistence.exceptions.ValidationException;
 import org.eclipse.persistence.internal.sessions.factories.model.SessionConfigs;
@@ -43,7 +44,7 @@
      */
     public static void write(SessionConfigs eclipseLinkSessions, String fileName) {
         //Bug#4305370 Needs to be utf-8 encoded.
-        try (Writer writer = new OutputStreamWriter(new FileOutputStream(fileName), "UTF-8")) {
+        try (Writer writer = new OutputStreamWriter(new FileOutputStream(fileName), StandardCharsets.UTF_8)) {
             write(eclipseLinkSessions, writer);
         } catch (IOException exception) {
             throw ValidationException.fileError(exception);
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 036750e..0f3a177 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
@@ -2063,7 +2063,7 @@
             int oldSize = changeRecord.getOldSize();
             int newSize = changeRecord.getNewSize();
             int delta = newSize - oldSize;
-            Object newTail[] = null;
+            Object[] newTail = null;
             if(delta > 0) {
                 newTail = new Object[delta];
             }
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 c6f0c84..ee61986 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
@@ -451,7 +451,7 @@
 
             // DatabaseField overrides equals, so we need to use an IdentifyHashMap for this implementation
             // to make sure we are using the object references to lookup clone references
-            AbstractMap<DatabaseField, DatabaseField> fieldToCloneMap = new IdentityHashMap<DatabaseField, DatabaseField>(getTargetToSourceKeyFields().size());
+            AbstractMap<DatabaseField, DatabaseField> fieldToCloneMap = new IdentityHashMap<>(getTargetToSourceKeyFields().size());
 
             //clone foreign keys and save the clones in a lookup table
             for (Enumeration<DatabaseField> enumtr = getForeignKeyFields().elements(); enumtr.hasMoreElements();) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ConverterClass.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ConverterClass.java
index ef6a3cb..c0f087d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ConverterClass.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/mappings/converters/ConverterClass.java
@@ -126,7 +126,7 @@
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
-                    return AccessController.doPrivileged(new PrivilegedClassForName<T>(attributeConverterClassName, true, classLoader));
+                    return AccessController.doPrivileged(new PrivilegedClassForName<>(attributeConverterClassName, true, classLoader));
                 } catch (PrivilegedActionException exception) {
                     throw ValidationException.classNotFoundWhileConvertingClassNames(attributeConverterClassName, exception.getException());
                 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/MediaType.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/MediaType.java
index 7b20d06..ad8324d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/MediaType.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/MediaType.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,7 +24,7 @@
 
     private final String mediaType;
 
-    private MediaType(String mediaType) {
+    MediaType(String mediaType) {
         this.mediaType = mediaType;
     }
 
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 65e6951..35b52b7 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
@@ -1079,13 +1079,13 @@
         xmlField.setNamespaceResolver(namespaceResolver);
         while(stringTokenizer.hasMoreElements()) {
             String nextToken = stringTokenizer.nextToken();
-            xmlField.setXPath(xPath.toString() + nextToken);
+            xmlField.setXPath(xPath + nextToken);
             xmlField.initialize();
             DatabaseMapping mapping = objectBuilder.getMappingForField(xmlField);
             if(null == mapping) {
                 XPathFragment xPathFragment = new XPathFragment(nextToken);
                 if(xPathFragment.getIndexValue() > 0) {
-                    xmlField.setXPath(xPath.toString() + nextToken.substring(0, nextToken.indexOf('[')));
+                    xmlField.setXPath(xPath + nextToken.substring(0, nextToken.indexOf('[')));
                     xmlField.initialize();
                     mapping = objectBuilder.getMappingForField(xmlField);
                     if(null != mapping) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLMarshaller.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLMarshaller.java
index 90b9b47..56c65df 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLMarshaller.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/XMLMarshaller.java
@@ -147,7 +147,7 @@
                 }
             }
         }else{
-            Class<? extends Object> objectClass = object.getClass();
+            Class<?> objectClass = object.getClass();
             if(result instanceof ExtendedResult){
                 MarshalRecord writerRecord = ((ExtendedResult)result).createRecord();
                 if(object instanceof Collection){
@@ -374,7 +374,7 @@
                 }
             }
         }else{
-            Class<? extends Object> objectClass = object.getClass();
+            Class<?> objectClass = object.getClass();
             session = context.getSession(objectClass);
             descriptor = getDescriptor(objectClass, session);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceObjectMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceObjectMapping.java
index 3240233..b647a13 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceObjectMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLChoiceObjectMapping.java
@@ -269,7 +269,7 @@
     @Override
     public void writeFromObjectIntoRow(Object object, AbstractRecord row, AbstractSession session, WriteType writeType) throws DescriptorException {
         Object value = getAttributeValueFromObject(object);
-        Class<? extends Object> valueClass = value.getClass();
+        Class<?> valueClass = value.getClass();
         if(valueClass == XMLRoot.class) {
             //look for a nested mapping based on the Root's QName
             XMLRoot root = (XMLRoot)value;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLInverseReferenceMapping.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLInverseReferenceMapping.java
index 0979d33..b0c9584 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLInverseReferenceMapping.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/mappings/XMLInverseReferenceMapping.java
@@ -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
@@ -90,7 +90,7 @@
     @Override
     public void initialize(AbstractSession session) throws DescriptorException {
         super.initialize(session);
-        setFields(new Vector<DatabaseField> ());
+        setFields(new Vector<>());
         if(inlineMapping != null){
             inlineMapping.initialize(session);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/WriterRecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/WriterRecord.java
index 6d940f3..45030b1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/WriterRecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/oxm/record/WriterRecord.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
@@ -248,7 +248,7 @@
             try {
                 StringWriter sw = new StringWriter();
                 escapeHandler.escape(value.toCharArray(), 0, value.length(), isAttribute, sw);
-                writer.append(sw.toString());
+                writer.append(sw);
             } catch (IOException e) {
                 throw XMLMarshalException.marshalException(e);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java
index a09f8dd..81b89be 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DB2ZPlatform.java
@@ -158,8 +158,8 @@
     @Override
     public void registerOutputParameter(CallableStatement statement, String name, int jdbcType) throws SQLException {
         try {
-            Class<?> clazz = null;
-            Method method = null;
+            Class<?> clazz;
+            Method method;
             String methodName = "registerJccOutParameterAtName";
             Class<?>[] methodArgs = (Class<?>[]) new Class[] {String.class, int.class};
             Object[] parameters = new Object[] {name, jdbcType};
@@ -197,10 +197,9 @@
     @Override
     public void registerOutputParameter(CallableStatement statement, String name, int jdbcType, String typeName) throws SQLException {
         try {
-            Class<?> clazz = null;
-            Method method = null;
+            Class<?> clazz;
+            Method method;
             String methodName = "registerJccOutParameterAtName";
-            @SuppressWarnings({"rawtypes"})
             Class<?>[] methodArgs = (Class<?>[]) new Class[] {String.class, int.class, String.class};
             Object[] parameters = new Object[] {name, jdbcType, typeName};
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
@@ -401,8 +400,8 @@
 
         if(methodName != null) {
             try {
-                Class<?> clazz = null;
-                Method method = null;
+                Class<?> clazz;
+                Method method;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
                         ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
@@ -432,11 +431,10 @@
     }
 
     @Override
-    @SuppressWarnings({"rawtypes"})
     protected void setNullFromDatabaseField(DatabaseField databaseField, CallableStatement statement, String name) throws SQLException {
-        String methodName = null;
-        Class<?>[] methodArgs = null;
-        Object[] parameters = null;
+        String methodName;
+        Class<?>[] methodArgs;
+        Object[] parameters;
         if (databaseField instanceof ObjectRelationalDatabaseField) {
             ObjectRelationalDatabaseField field = (ObjectRelationalDatabaseField)databaseField;
             methodName = "setJccNullAtName";
@@ -450,8 +448,8 @@
         }
 
         try {
-            Class<?> clazz = null;
-            Method method = null;
+            Class<?> clazz;
+            Method method;
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                 try {
                     ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
@@ -480,44 +478,41 @@
     }
 
     @Override
-    @SuppressWarnings({"rawtypes"})
     public Object getParameterValueFromDatabaseCall(CallableStatement statement, String name, AbstractSession session)
                 throws SQLException {
-        String methodName = null;
-        Class<?>[] methodArgs = null;
-        Object[] parameters = null;
+        String methodName;
+        Class<?>[] methodArgs;
+        Object[] parameters;
 
         methodName = "getJccObjectAtName";
         methodArgs = (Class<?>[]) new Class[] {String.class};
         parameters = new Object[] {name};
 
-        if(methodName != null) {
-            try {
-                Class<?> clazz = null;
-                Method method = null;
-                if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    try {
-                        ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
-                        clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(DB2_CALLABLESTATEMENT_CLASS, true, cl));
-                        method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, methodName, methodArgs, true));
-                        Object o = statement.unwrap(clazz);
-                        return AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, o, parameters));
-                    } catch (PrivilegedActionException ex) {
-                        if (ex.getCause() instanceof ClassNotFoundException) {
-                            throw (ClassNotFoundException) ex.getCause();
-                        }
-                        throw (RuntimeException) ex.getCause();
-                    }
-                } else {
-                    ClassLoader cl = PrivilegedAccessHelper.getContextClassLoader(Thread.currentThread());
-                    clazz = PrivilegedAccessHelper.getClassForName(DB2_CALLABLESTATEMENT_CLASS, true, cl);
-                    method = PrivilegedAccessHelper.getMethod(clazz, methodName, methodArgs, true);
+        try {
+            Class<?> clazz;
+            Method method;
+            if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
+                try {
+                    ClassLoader cl = AccessController.doPrivileged(new PrivilegedGetContextClassLoader(Thread.currentThread()));
+                    clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(DB2_CALLABLESTATEMENT_CLASS, true, cl));
+                    method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, methodName, methodArgs, true));
                     Object o = statement.unwrap(clazz);
-                    return PrivilegedAccessHelper.invokeMethod(method, o, parameters);
+                    return AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, o, parameters));
+                } catch (PrivilegedActionException ex) {
+                    if (ex.getCause() instanceof ClassNotFoundException) {
+                        throw (ClassNotFoundException) ex.getCause();
+                    }
+                    throw (RuntimeException) ex.getCause();
                 }
-            } catch (ReflectiveOperationException e) {
-                AbstractSessionLog.getLog().logThrowable(SessionLog.WARNING, null, e);
+            } else {
+                ClassLoader cl = PrivilegedAccessHelper.getContextClassLoader(Thread.currentThread());
+                clazz = PrivilegedAccessHelper.getClassForName(DB2_CALLABLESTATEMENT_CLASS, true, cl);
+                method = PrivilegedAccessHelper.getMethod(clazz, methodName, methodArgs, true);
+                Object o = statement.unwrap(clazz);
+                return PrivilegedAccessHelper.invokeMethod(method, o, parameters);
             }
+        } catch (ReflectiveOperationException e) {
+            AbstractSessionLog.getLog().logThrowable(SessionLog.WARNING, null, e);
         }
         //Didn't work, fall back. This most likely still won't work, but the driver exception from there will be helpful.
         return super.getParameterValueFromDatabaseCall(statement, name, session);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DerbyPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DerbyPlatform.java
index db2e86e..59b5757 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DerbyPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/DerbyPlatform.java
@@ -233,8 +233,8 @@
      */
     @Override
     public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table,
-                                                     Collection pkFields,
-                                                     Collection assignedFields) throws IOException
+                                                    Collection<DatabaseField> pkFields,
+                                                    Collection<DatabaseField> assignedFields) throws IOException
     {
         writer.write("UPDATE ");
         String tableName = table.getQualifiedNameDelimited(this);
@@ -243,14 +243,14 @@
 
         String tempTableName = getTempTableForTable(table).getQualifiedNameDelimited(this);
         boolean isFirst = true;
-        Iterator itFields = assignedFields.iterator();
+        Iterator<DatabaseField> itFields = assignedFields.iterator();
         while(itFields.hasNext()) {
             if(isFirst) {
                 isFirst = false;
             } else {
                 writer.write(", ");
             }
-            DatabaseField field = (DatabaseField)itFields.next();
+            DatabaseField field = itFields.next();
             String fieldName = field.getNameDelimited(this);
             writer.write(fieldName);
             writer.write(" = (SELECT ");
@@ -262,7 +262,7 @@
         }
 
         writer.write(" WHERE EXISTS(SELECT ");
-        writer.write(((DatabaseField)pkFields.iterator().next()).getNameDelimited(this));
+        writer.write(pkFields.iterator().next().getNameDelimited(this));
         writer.write(" FROM ");
         writer.write(tempTableName);
         writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/H2Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/H2Platform.java
index d8eb4c2..0626b85 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/H2Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/H2Platform.java
@@ -174,8 +174,8 @@
      */
     @Override
     public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table,
-                                                     Collection pkFields,
-                                                     Collection assignedFields) throws IOException
+                                                    Collection<DatabaseField> pkFields,
+                                                    Collection<DatabaseField> assignedFields) throws IOException
     {
         writer.write("UPDATE ");
         String tableName = table.getQualifiedNameDelimited(this);
@@ -195,7 +195,7 @@
         writer.write(tempTableName);
         writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
         writer.write(") WHERE EXISTS(SELECT ");
-        writer.write(((DatabaseField)pkFields.iterator().next()).getNameDelimited(this));
+        writer.write(pkFields.iterator().next().getNameDelimited(this));
         writer.write(" FROM ");
         writer.write(tempTableName);
         writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/HSQLPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/HSQLPlatform.java
index 18fd1e8..f389ef9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/HSQLPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/HSQLPlatform.java
@@ -270,8 +270,8 @@
      */
      @Override
     public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table,
-                                                     Collection pkFields,
-                                                     Collection assignedFields) throws IOException
+                                                    Collection<DatabaseField> pkFields,
+                                                    Collection<DatabaseField> assignedFields) throws IOException
     {
         writer.write("UPDATE ");
         String tableName = table.getQualifiedNameDelimited(this);
@@ -280,14 +280,14 @@
 
         String tempTableName = getTempTableForTable(table).getQualifiedNameDelimited(this);
         boolean isFirst = true;
-        Iterator itFields = assignedFields.iterator();
+        Iterator<DatabaseField> itFields = assignedFields.iterator();
         while(itFields.hasNext()) {
             if(isFirst) {
                 isFirst = false;
             } else {
                 writer.write(", ");
             }
-            DatabaseField field = (DatabaseField)itFields.next();
+            DatabaseField field = itFields.next();
             String fieldName = field.getNameDelimited(this);
             writer.write(fieldName);
             writer.write(" = (SELECT ");
@@ -299,7 +299,7 @@
         }
 
         writer.write(" WHERE EXISTS(SELECT ");
-        writer.write(((DatabaseField)pkFields.iterator().next()).getNameDelimited(this));
+        writer.write(pkFields.iterator().next().getNameDelimited(this));
         writer.write(" FROM ");
         writer.write(tempTableName);
         writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/Informix11Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/Informix11Platform.java
index c8fccab..0092b66 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/Informix11Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/Informix11Platform.java
@@ -392,7 +392,7 @@
    * bug 402037</a>
    */
   @Override
-  public void writeUpdateOriginalFromTempTableSql(final Writer writer, final DatabaseTable table, final Collection pkFields, final Collection assignedFields) throws IOException {
+  public void writeUpdateOriginalFromTempTableSql(final Writer writer, final DatabaseTable table, final Collection<DatabaseField> pkFields, final Collection<DatabaseField> assignedFields) throws IOException {
     writer.write("UPDATE ");
     final String tableName = table.getQualifiedNameDelimited(this);
     writer.write(tableName);
@@ -412,7 +412,7 @@
     writer.write(tempTableName);
     writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
     writer.write(") WHERE EXISTS(SELECT ");
-    writer.write(((DatabaseField)pkFields.iterator().next()).getNameDelimited(this));
+    writer.write(pkFields.iterator().next().getNameDelimited(this));
     writer.write(" FROM ");
     writer.write(tempTableName);
     writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/MySQLPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/MySQLPlatform.java
index eac34dc..1cae3bc 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/MySQLPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/MySQLPlatform.java
@@ -49,6 +49,7 @@
 import org.eclipse.persistence.internal.expressions.FunctionExpression;
 import org.eclipse.persistence.internal.expressions.SQLSelectStatement;
 import org.eclipse.persistence.internal.helper.ClassConstants;
+import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.helper.DatabaseTable;
 import org.eclipse.persistence.internal.helper.Helper;
 import org.eclipse.persistence.internal.sessions.AbstractRecord;
@@ -723,8 +724,8 @@
      */
     @Override
     public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table,
-                                                    Collection pkFields,
-                                                    Collection assignedFields) throws IOException
+                                                    Collection<DatabaseField> pkFields,
+                                                    Collection<DatabaseField> assignedFields) throws IOException
     {
         writer.write("UPDATE ");
         String tableName = table.getQualifiedNameDelimited(this);
@@ -742,8 +743,8 @@
      */
     @Override
     public void writeDeleteFromTargetTableUsingTempTableSql(Writer writer, DatabaseTable table, DatabaseTable targetTable,
-            Collection pkFields,
-            Collection targetPkFields, DatasourcePlatform platform) throws IOException
+                                                            Collection<DatabaseField> pkFields,
+                                                            Collection<DatabaseField> targetPkFields, DatasourcePlatform platform) throws IOException
     {
         writer.write("DELETE FROM ");
         String targetTableName = targetTable.getQualifiedNameDelimited(this);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/Oracle8Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/Oracle8Platform.java
index 5b66b59..20b3aba 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/Oracle8Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/Oracle8Platform.java
@@ -175,7 +175,6 @@
     /**
      * INTERNAL: Write LOB value - only on Oracle8 and up
      */
-    @SuppressWarnings("deprecation")
     @Override
     public void writeLOB(DatabaseField field, Object value, ResultSet resultSet, AbstractSession session)
             throws SQLException {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/OraclePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/OraclePlatform.java
index e0e81d8..3924c14 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/OraclePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/OraclePlatform.java
@@ -266,7 +266,7 @@
      * Returns null unless the platform supports call with returning
      */
     @Override
-    public DatabaseCall buildCallWithReturning(SQLCall sqlCall, Vector returnFields) {
+    public DatabaseCall buildCallWithReturning(SQLCall sqlCall, Vector<DatabaseField> returnFields) {
         SQLCall call = new SQLCall();
         call.setParameters(sqlCall.getParameters());
         call.setParameterTypes(sqlCall.getParameterTypes());
@@ -278,7 +278,7 @@
             writer.write(" RETURNING ");
 
             for (int i = 0; i < returnFields.size(); i++) {
-                DatabaseField field = (DatabaseField)returnFields.elementAt(i);
+                DatabaseField field = returnFields.elementAt(i);
                 writer.write(field.getNameDelimited(this));
                 if ((i + 1) < returnFields.size()) {
                     writer.write(", ");
@@ -288,7 +288,7 @@
             writer.write(" INTO ");
 
             for (int i = 0; i < returnFields.size(); i++) {
-                DatabaseField field = (DatabaseField)returnFields.elementAt(i);
+                DatabaseField field = returnFields.elementAt(i);
                 call.appendOut(writer, field);
                 if ((i + 1) < returnFields.size()) {
                     writer.write(", ");
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/PostgreSQLPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/PostgreSQLPlatform.java
index 29ffa90..46f0a6c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/PostgreSQLPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/PostgreSQLPlatform.java
@@ -555,16 +555,15 @@
      * for updating the original table from the temporary table. Precondition:
      * supportsTempTables() == true. Precondition: pkFields and assignFields
      * don't intersect.
-     *
-     * @param writer for writing the sql
+     *  @param writer for writing the sql
      * @param table is original table for which temp table is
      *            created.
      * @param pkFields - primary key fields for the original
-     *            table.
+ *            table.
      * @param assignedFields - fields to be assigned a new value.
      */
     @Override
-    public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table, Collection pkFields, Collection assignedFields) throws IOException {
+    public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table, Collection<DatabaseField> pkFields, Collection<DatabaseField> assignedFields) throws IOException {
         writer.write("UPDATE ");
         String tableName = table.getQualifiedNameDelimited(this);
         writer.write(tableName);
@@ -572,14 +571,14 @@
 
         String tempTableName = getTempTableForTable(table).getQualifiedNameDelimited(this);
         boolean isFirst = true;
-        Iterator itFields = assignedFields.iterator();
+        Iterator<DatabaseField> itFields = assignedFields.iterator();
         while (itFields.hasNext()) {
             if (isFirst) {
                 isFirst = false;
             } else {
                 writer.write(", ");
             }
-            DatabaseField field = (DatabaseField) itFields.next();
+            DatabaseField field = itFields.next();
             String fieldName = field.getNameDelimited(this);
             writer.write(fieldName);
             writer.write(" = (SELECT ");
@@ -591,7 +590,7 @@
         }
 
         writer.write(" WHERE EXISTS(SELECT ");
-        writer.write(((DatabaseField) pkFields.iterator().next()).getNameDelimited(this));
+        writer.write(pkFields.iterator().next().getNameDelimited(this));
         writer.write(" FROM ");
         writer.write(tempTableName);
         writeAutoJoinWhereClause(writer, null, tableName, pkFields, this);
@@ -612,7 +611,7 @@
      * Uses the returning clause on Postgres.
      */
     @Override
-    public DatabaseCall buildCallWithReturning(SQLCall sqlCall, Vector returnFields) {
+    public DatabaseCall buildCallWithReturning(SQLCall sqlCall, Vector<DatabaseField> returnFields) {
         SQLCall call = new SQLCall();
         call.setParameters(sqlCall.getParameters());
         call.setParameterTypes(sqlCall.getParameterTypes());
@@ -622,7 +621,7 @@
             writer.write(sqlCall.getSQLString());
             writer.write(" RETURNING ");
             for (int i = 0; i < returnFields.size(); i++) {
-                DatabaseField field = (DatabaseField)returnFields.elementAt(i);
+                DatabaseField field = returnFields.elementAt(i);
                 writer.write(field.getNameDelimited(this));
                 if ((i + 1) < returnFields.size()) {
                     writer.write(", ");
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/SQLServerPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/SQLServerPlatform.java
index 4608b89..df64578 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/SQLServerPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/SQLServerPlatform.java
@@ -778,8 +778,8 @@
      */
     @Override
     public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table,
-                                                    Collection pkFields,
-                                                    Collection assignedFields) throws IOException
+                                                    Collection<DatabaseField> pkFields,
+                                                    Collection<DatabaseField> assignedFields) throws IOException
     {
         writer.write("UPDATE ");
         String tableName = table.getQualifiedNameDelimited(this);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/SybasePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/SybasePlatform.java
index be72280..1284ef5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/SybasePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/SybasePlatform.java
@@ -48,6 +48,7 @@
 import org.eclipse.persistence.internal.databaseaccess.FieldTypeDefinition;
 import org.eclipse.persistence.internal.expressions.RelationExpression;
 import org.eclipse.persistence.internal.helper.ClassConstants;
+import org.eclipse.persistence.internal.helper.DatabaseField;
 import org.eclipse.persistence.internal.helper.DatabaseTable;
 import org.eclipse.persistence.internal.helper.Helper;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
@@ -792,8 +793,8 @@
      */
     @Override
     public void writeUpdateOriginalFromTempTableSql(Writer writer, DatabaseTable table,
-                                                    Collection pkFields,
-                                                    Collection assignedFields) throws IOException
+                                                    Collection<DatabaseField> pkFields,
+                                                    Collection<DatabaseField> assignedFields) throws IOException
     {
         writer.write("UPDATE ");
         String tableName = table.getQualifiedNameDelimited(this);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/jdbc/JDBCTypes.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/jdbc/JDBCTypes.java
index c31258a..024f22c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/jdbc/JDBCTypes.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/jdbc/JDBCTypes.java
@@ -78,7 +78,6 @@
  * @author  Mike Norman - michael.norman@oracle.com
  * @since  Oracle TopLink 11.x.x
  */
-@SuppressWarnings("unchecked")
 public enum JDBCTypes implements JDBCType {
 
         ARRAY_TYPE(ARRAY, "ARRAY"),
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/OraclePLSQLTypes.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/OraclePLSQLTypes.java
index d2aff92..64a30d2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/OraclePLSQLTypes.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/OraclePLSQLTypes.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
@@ -36,7 +36,6 @@
  * @author  Mike Norman - michael.norman@oracle.com
  * @since  Oracle TopLink 11.x.x
  */
-@SuppressWarnings("unchecked")
 public enum OraclePLSQLTypes implements SimpleDatabaseType, OraclePLSQLType {
 
     BinaryInteger("BINARY_INTEGER"),
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLCursor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLCursor.java
index bc586c5..4bd580d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLCursor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLCursor.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
@@ -24,7 +24,6 @@
 /**
  * <b>PUBLIC</b>: describe an Oracle PL/SQL Cursor type
  */
-@SuppressWarnings("unchecked")
 public class PLSQLCursor extends ComplexDatabaseType implements OraclePLSQLType, Cloneable {
 
     public PLSQLCursor() {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLStoredProcedureCall.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLStoredProcedureCall.java
index 5e8b38e..ece373a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLStoredProcedureCall.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLStoredProcedureCall.java
@@ -66,7 +66,6 @@
  * This handles conversion of PLSQL Record and Table types into SQL ARRAY (VARRAY) and STRUCT (OBJECT TYPE).
  * It also handles conversion of flat PLSQL Record types and PLSQL BOOLEAN and other basic types.
  */
-@SuppressWarnings("unchecked")
 public class PLSQLStoredProcedureCall extends StoredProcedureCall {
 
     // can't use Helper.cr(), Oracle PL/SQL parser only likes Unix-style newlines '\n'
@@ -94,7 +93,7 @@
     /**
      * Map of conversion function routines for converting complex PLSQL types.
      */
-    protected Map<String, TypeInfo> typesInfo;
+    private Map<String, TypeInfo> typesInfo;
     /**
      * Id used to generate unique local functions.
      */
@@ -640,8 +639,8 @@
      * Add the nested function string required for the type and its subtypes. The functions
      * must be added in inverse order to resolve dependencies.
      */
-    protected void addNestedFunctionsForArgument(List functions, PLSQLargument argument,
-                DatabaseType databaseType, Set<DatabaseType> processed) {
+    protected void addNestedFunctionsForArgument(List<String> functions, PLSQLargument argument,
+                                                 DatabaseType databaseType, Set<DatabaseType> processed) {
         if ((databaseType == null)
               || !databaseType.isComplexDatabaseType()
               || databaseType.isJDBCType()
@@ -697,14 +696,14 @@
     /**
      * INTERNAL: Generate the nested function to convert the PLSQL type to its compatible SQL type.
      */
-    protected TypeInfo generateNestedFunction(ComplexDatabaseType type) {
+    private TypeInfo generateNestedFunction(ComplexDatabaseType type) {
         return generateNestedFunction(type, false);
     }
 
     /**
      * INTERNAL: Generate the nested function to convert the PLSQL type to its compatible SQL type.
      */
-    protected TypeInfo generateNestedFunction(ComplexDatabaseType type, boolean isNonAssociativeCollection) {
+    private TypeInfo generateNestedFunction(ComplexDatabaseType type, boolean isNonAssociativeCollection) {
         TypeInfo info = new TypeInfo();
         info.pl2SqlName = PL2SQL_PREFIX + (this.functionId++);
         info.sql2PlName = SQL2PL_PREFIX + (this.functionId++);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLrecord.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLrecord.java
index 23d2b94..a7e8a93 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLrecord.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/database/oracle/plsql/PLSQLrecord.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
@@ -41,7 +41,6 @@
  * @author  Mike Norman - michael.norman@oracle.com
  * @since  Oracle TopLink 11.x.x
  */
-@SuppressWarnings("unchecked")
 public class PLSQLrecord extends ComplexDatabaseType implements OraclePLSQLType, Cloneable {
 
     protected List<PLSQLargument> fields =  new ArrayList<>();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/JMXServerPlatformBase.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/JMXServerPlatformBase.java
index a495c2f..3e78024 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/JMXServerPlatformBase.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/JMXServerPlatformBase.java
@@ -208,12 +208,12 @@
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     try {
                         mBeanServerList = AccessController.doPrivileged(
-                            new PrivilegedExceptionAction<List<MBeanServer>>() {
-                                @Override
-                                public List<MBeanServer> run() {
-                                    return MBeanServerFactory.findMBeanServer(null);
+                                new PrivilegedExceptionAction<>() {
+                                    @Override
+                                    public List<MBeanServer> run() {
+                                        return MBeanServerFactory.findMBeanServer(null);
+                                    }
                                 }
-                            }
                            );
                     } catch (PrivilegedActionException pae) {
                         getAbstractSession().log(SessionLog.WARNING, SessionLog.SERVER,
@@ -322,11 +322,10 @@
                     args[0] = developmentMBean;
                     args[1] = name;
                     try {
-                        @SuppressWarnings({"rawtypes"})
                         Method getMethod = PrivilegedAccessHelper.getPublicMethod(MBeanServer.class,
                                 "registerMBean", new Class[] {Object.class, ObjectName.class}, false);
                         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                            info = AccessController.doPrivileged(new PrivilegedMethodInvoker<ObjectInstance>(getMethod, mBeanServerRuntime, args));
+                            info = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(getMethod, mBeanServerRuntime, args));
                         } else {
                             info = mBeanServerRuntime.registerMBean(developmentMBean, name);
                         }
@@ -355,11 +354,10 @@
                         Object[] args = new Object[2];
                         args[0] = runtimeServicesMBean;
                         args[1] = name;
-                        @SuppressWarnings({"rawtypes"})
                         Method getMethod = PrivilegedAccessHelper.getPublicMethod(MBeanServer.class,
                                 "registerMBean", new Class[] {Object.class, ObjectName.class}, false);
                         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                           runtimeInstance = AccessController.doPrivileged(new PrivilegedMethodInvoker<ObjectInstance>(getMethod, mBeanServerRuntime, args));
+                           runtimeInstance = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(getMethod, mBeanServerRuntime, args));
                         } else {
                             runtimeInstance = mBeanServerRuntime.registerMBean(runtimeServicesMBean, name);
                         }
@@ -408,7 +406,6 @@
                         Object[] args = new Object[1];
                         args[0] = name;
                         try {
-                            @SuppressWarnings({"rawtypes"})
                             Method getMethod = PrivilegedAccessHelper.getPublicMethod(MBeanServer.class,
                                     "unregisterMBean", new Class[] {ObjectName.class}, false);
                             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
@@ -437,7 +434,6 @@
                         Object[] args = new Object[1];
                         args[0] = name;
                         try {
-                            @SuppressWarnings({"rawtypes"})
                             Method getMethod = PrivilegedAccessHelper.getPublicMethod(MBeanServer.class,
                                     "unregisterMBean", new Class[] {ObjectName.class}, false);
                             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/NoServerPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/NoServerPlatform.java
index acce956..04c397d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/NoServerPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/NoServerPlatform.java
@@ -61,7 +61,6 @@
      * @see #isJTAEnabled()
      * @see #disableJTA()
      * @see #initializeExternalTransactionController()
-     * @return
      */
     @Override
     public Class<? extends ExternalTransactionController> getExternalTransactionControllerClass() {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatform.java
index 9f9d1d0..9b3e7e6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatform.java
@@ -104,7 +104,6 @@
      * @see #isJTAEnabled()
      * @see #disableJTA()
      * @see #initializeExternalTransactionController()
-     * @param newClass
      */
     void setExternalTransactionControllerClass(Class<? extends ExternalTransactionController> newClass);
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformBase.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformBase.java
index 9b0f576..3e9e0e5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformBase.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformBase.java
@@ -264,7 +264,6 @@
      * @see #isJTAEnabled()
      * @see #disableJTA()
      * @see #initializeExternalTransactionController()
-     * @param newClass
      */
     @Override
     public void setExternalTransactionControllerClass(Class<? extends ExternalTransactionController> newClass) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformUtils.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformUtils.java
index 44d9f89..5c43d5c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformUtils.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/ServerPlatformUtils.java
@@ -44,7 +44,7 @@
  * A utility class to interact with ServerPlatforms.
  */
 public final class ServerPlatformUtils {
-    private static final List<ServerPlatformDetector> PLATFORMS = new ArrayList<ServerPlatformDetector>() {{
+    private static final List<ServerPlatformDetector> PLATFORMS = new ArrayList<>() {{
         add(new NoServerPlatformDetector());
         add(new WebSpherePlatformDetector());
         add(new WebLogicPlatformDetector());
@@ -105,7 +105,6 @@
      *
      * @see ServerPlatformBase#ServerPlatformBase(DatabaseSession)
      */
-    @SuppressWarnings({"rawtypes"})
     public static ServerPlatform createServerPlatform(DatabaseSession session, String platformClass, ClassLoader loader) {
         if (platformClass == null) {
             throw ServerPlatformException.invalidServerPlatformClass(null, null);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/glassfish/GlassfishPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/glassfish/GlassfishPlatform.java
index 227fbc2..657b50c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/glassfish/GlassfishPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/glassfish/GlassfishPlatform.java
@@ -107,7 +107,7 @@
         Connection unwrappedConnection;
 
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            unwrappedConnection = AccessController.doPrivileged(new PrivilegedAction<Connection>() {
+            unwrappedConnection = AccessController.doPrivileged(new PrivilegedAction<>() {
                 @Override
                 public Connection run() {
                     return unwrapGlassFishConnectionHelper(connection);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatform.java
index 0cc126c..8f35aa7 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatform.java
@@ -126,7 +126,6 @@
     protected Method getVendorConnectionMethod() {
         if ((this.vendorConnectionMethod == null) && (!getWebsphereUtilClass().equals(void.class))) {
             try {
-                @SuppressWarnings({"rawtypes"})
                 Class<?>[] args = (Class<?>[]) new Class[1];
                 args[0] = getWebsphereConnectionClass();
                 this.vendorConnectionMethod = PrivilegedAccessHelper.getDeclaredMethod(getWebsphereUtilClass(), "getNativeConnection", args);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatformDetector.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatformDetector.java
index 2cb4f9d..0e9f979 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatformDetector.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSpherePlatformDetector.java
@@ -49,7 +49,7 @@
 
     private boolean isLiberty() {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
+            return AccessController.doPrivileged(new PrivilegedAction<>() {
                 @Override
                 public Boolean run() {
                     return isLibertyInternal();
@@ -62,7 +62,7 @@
 
     private boolean isFullProfile() {
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
+            return AccessController.doPrivileged(new PrivilegedAction<>() {
                 @Override
                 public Boolean run() {
                     return isFullProfileInternal();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSphere_7_Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSphere_7_Platform.java
index bc94a11..bc2fb8a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSphere_7_Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/was/WebSphere_7_Platform.java
@@ -87,7 +87,7 @@
         SessionLog log = null;
         try {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                log = AccessController.doPrivileged(new PrivilegedExceptionAction<SessionLog>() {
+                log = AccessController.doPrivileged(new PrivilegedExceptionAction<>() {
                     @Override
                     public SessionLog run() throws Exception {
                         Class<SessionLog> cls = PrivilegedAccessHelper.getClassForName(SERVER_LOG_CLASS);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatform.java
index 5f96c07..1d9e05f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatform.java
@@ -132,7 +132,6 @@
     /**
      * Return the method for the WebLogic JDBC connection wrapper vendorConnection.
      */
-    @SuppressWarnings({"rawtypes"})
     protected Method getVendorConnectionMethod() {
         if ((this.vendorConnectionMethod == null) && (!getWebLogicConnectionClass().equals(void.class))) {
             try {
@@ -166,7 +165,6 @@
     /**
      * Return the method for the WebLogic connection clearStatementCache method.
      */
-    @SuppressWarnings({"rawtypes"})
     protected Method getClearStatementCacheMethod() {
         if ((this.clearStatementCacheMethod == null) && (!getWebLogicConnectionClass().equals(void.class))) {
             try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatformDetector.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatformDetector.java
index a9e1b4b..a6ee631 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatformDetector.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogicPlatformDetector.java
@@ -37,7 +37,7 @@
         String platform = null;
         String serverNameAndVersion;
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-            serverNameAndVersion = AccessController.doPrivileged(new PrivilegedAction<String>() {
+            serverNameAndVersion = AccessController.doPrivileged(new PrivilegedAction<>() {
                 @Override
                 public String run() {
                     return getServerNameAndVersionInternal();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_10_Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_10_Platform.java
index 72b40da..f890f13 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_10_Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_10_Platform.java
@@ -316,7 +316,6 @@
             try {
                 // perform a reflective public java.lang.String
                 // weblogic.work.ExecuteThreadRuntime.<getMethodName>
-                @SuppressWarnings({"rawtypes"})
                 Method getMethod = PrivilegedAccessHelper.getPublicMethod(executeThread.getClass(), getMethodName, new Class[] {}, false);
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                     classLoaderOrString = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(getMethod, executeThread, null));
@@ -400,7 +399,6 @@
      * so use this if available.
      */
     @Override
-    @SuppressWarnings({"rawtypes"})
     protected Method getVendorConnectionMethod() {
         if ((this.vendorConnectionMethod == null) && (!getWebLogicConnectionClass().equals(void.class))) {
             try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_12_Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_12_Platform.java
index e0bffcc..45548b9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_12_Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/server/wls/WebLogic_12_Platform.java
@@ -67,7 +67,7 @@
 
         static {
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                cicManagerClass = AccessController.doPrivileged(new PrivilegedAction<Class<?>>() {
+                cicManagerClass = AccessController.doPrivileged(new PrivilegedAction<>() {
                     @Override
                     public Class<?> run() {
                         return getCicManagerClass(CIC_MANAGER_RESOURCE_NAME, CIC_MANAGER_CLASS_NAME);
@@ -104,7 +104,6 @@
             }
         }
 
-        @SuppressWarnings({"rawtypes"})
         private void initialize(final Class<?> managerClass, final String contextClassName) {
             try {
                 // Get component invocation manager
@@ -160,7 +159,7 @@
         private String getStringFromMethod(final Method methodToCall) {
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    return AccessController.doPrivileged(new PrivilegedAction<String>() {
+                    return AccessController.doPrivileged(new PrivilegedAction<>() {
                         @Override
                         public String run() {
                             try {
@@ -189,7 +188,7 @@
         boolean isGlobalRuntime() {
             try {
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
-                    return AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
+                    return AccessController.doPrivileged(new PrivilegedAction<>() {
                         @Override
                         public Boolean run() {
                             try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/xml/jaxp/JAXPPlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/xml/jaxp/JAXPPlatform.java
index f54aa34..65dc8c8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/xml/jaxp/JAXPPlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/platform/xml/jaxp/JAXPPlatform.java
@@ -260,7 +260,7 @@
     }
       @Override
     public void namespaceQualifyFragment(Element next) {
-        namespaceQualifyFragment(next, new ArrayList<String>());
+        namespaceQualifyFragment(next, new ArrayList<>());
     }
 
     //pass list of prefixes declared and encountered
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/AttributeGroup.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/AttributeGroup.java
index f53b24c..6a33f39 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/AttributeGroup.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/AttributeGroup.java
@@ -151,7 +151,7 @@
         if (isFetchGroup()) {
             return (FetchGroup) this;
         }
-        return toFetchGroup(new HashMap<AttributeGroup, FetchGroup>());
+        return toFetchGroup(new HashMap<>());
     }
 
     /**
@@ -273,7 +273,7 @@
         if (this.isLoadGroup()) {
             return (LoadGroup) this;
         }
-        return toLoadGroup(new HashMap<AttributeGroup, LoadGroup>(), false);
+        return toLoadGroup(new HashMap<>(), false);
     }
 
     public LoadGroup toLoadGroup(Map<AttributeGroup, LoadGroup> cloneMap, boolean loadOnly){
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/BatchFetchPolicy.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/BatchFetchPolicy.java
index 5f9eb0e..ba81f24 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/BatchFetchPolicy.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/BatchFetchPolicy.java
@@ -57,8 +57,8 @@
 
     public BatchFetchPolicy(BatchFetchType type) {
         this.type = type;
-        this.dataResults = new HashMap<Object, List<AbstractRecord>>();
-        this.dataResults.put(this, new ArrayList<AbstractRecord>());
+        this.dataResults = new HashMap<>();
+        this.dataResults.put(this, new ArrayList<>());
     }
 
     @Override
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 4ae07cc..48cc4d0 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
@@ -108,7 +108,7 @@
     protected List<Object> argumentValues;
 
     /** Needed to differentiate queries with the same name. */
-    protected List<Class> argumentTypes;
+    protected List<Class<?>> argumentTypes;
 
     /** Used to build a list of argumentTypes by name pre-initialization */
     protected List<String> argumentTypeNames;
@@ -707,7 +707,7 @@
                 if (cloneQuery.properties.isEmpty()) {
                     cloneQuery.properties = null;
                 } else {
-                    cloneQuery.properties = new HashMap(this.properties);
+                    cloneQuery.properties = new HashMap<>(this.properties);
                 }
             }
 
@@ -968,7 +968,7 @@
      * INTERNAL: Return the argumentTypes for use with the pre-defined query
      * option
      */
-    public List<Class> getArgumentTypes() {
+    public List<Class<?>> getArgumentTypes() {
         if ((this.argumentTypes == null) || (this.argumentTypes.isEmpty() && (this.argumentTypeNames != null) && !this.argumentTypeNames.isEmpty())) {
             this.argumentTypes = new ArrayList<>();
             // Bug 3256198 - lazily initialize the argument types from their
@@ -999,12 +999,12 @@
     /**
      * INTERNAL: Set the argumentTypes for use with the pre-defined query option
      */
-    public void setArgumentTypes(List<Class> argumentTypes) {
+    public void setArgumentTypes(List<Class<?>> argumentTypes) {
         this.argumentTypes = argumentTypes;
         // bug 3256198 - ensure the list of type names matches the argument
         // types.
         getArgumentTypeNames().clear();
-        for (Class type : argumentTypes) {
+        for (Class<?> type : argumentTypes) {
             this.argumentTypeNames.add(type.getName());
         }
     }
@@ -1021,7 +1021,7 @@
      * Maintain the argumentTypes as well.
      */
     public void setArguments(List<String> arguments) {
-        List<Class> types = new ArrayList<>(arguments.size());
+        List<Class<?>> types = new ArrayList<>(arguments.size());
         List<String> typeNames = new ArrayList<>(arguments.size());
         List<DatabaseField> typeFields = new ArrayList<>(arguments.size());
         int size = arguments.size();
@@ -1189,7 +1189,7 @@
     public Map<Object, Object> getProperties() {
         if (this.properties == null) {
             // Lazy initialize to conserve space and allocation time.
-            this.properties = new HashMap();
+            this.properties = new HashMap<>();
         }
         return this.properties;
     }
@@ -1341,13 +1341,13 @@
         if (operationName == null) {
             return getQueryNounName(sessionName);
         }
-
-        Hashtable sensorNames = (Hashtable)getProperty("DMSSensorNames");
+        @SuppressWarnings({"unchecked"})
+        Hashtable<String, String> sensorNames = (Hashtable<String, String>) getProperty("DMSSensorNames");
         if (sensorNames == null) {
-            sensorNames = new Hashtable();
+            sensorNames = new Hashtable<>();
             setProperty("DMSSensorNames", sensorNames);
         }
-        Object sensorName = sensorNames.get(operationName);
+        String sensorName = sensorNames.get(operationName);
         if (sensorName == null) {
             StringBuilder buffer = new StringBuilder(getQueryNounName(sessionName));
             buffer.append("_");
@@ -1355,7 +1355,7 @@
             sensorName = buffer.toString();
             sensorNames.put(operationName, sensorName);
         }
-        return (String)sensorName;
+        return sensorName;
     }
 
     /**
@@ -2018,8 +2018,8 @@
      */
     public List<DatabaseField> buildArgumentFields() {
         List<String> arguments = getArguments();
-        List<Class> argumentTypes = getArgumentTypes();
-        List argumentFields = new ArrayList(arguments.size());
+        List<Class<?>> argumentTypes = getArgumentTypes();
+        List<DatabaseField> argumentFields = new ArrayList<>(arguments.size());
         int size = arguments.size();
         for (int index = 0; index < size; index++) {
             DatabaseField argumentField = new DatabaseField(arguments.get(index));
@@ -2072,7 +2072,7 @@
             this.accessors = null;
             return;
         }
-        List<Accessor> accessors = new ArrayList(1);
+        List<Accessor> accessors = new ArrayList<>(1);
         accessors.add(accessor);
         this.accessors = accessors;
     }
@@ -2733,6 +2733,7 @@
      * INTERNAL:
      * Return temporary map of batched objects.
      */
+    @SuppressWarnings({"unchecked"})
     public Map<Object, Object> getBatchObjects() {
         return (Map<Object, Object>)getProperty(BATCH_FETCH_PROPERTY);
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DoesExistQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DoesExistQuery.java
index 036eab0..b6a6625 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DoesExistQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/DoesExistQuery.java
@@ -163,7 +163,7 @@
             }
 
             CacheKey cacheKey;
-            Class<? extends Object> objectClass = object.getClass();
+            Class<?> objectClass = object.getClass();
             AbstractSession tempSession = session;
             if (tempSession.isUnitOfWork()){
                 cacheKey = tempSession.getIdentityMapAccessorInstance().getCacheKeyForObjectForLock(primaryKey, objectClass, descriptor);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/FetchGroup.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/FetchGroup.java
index a734025..f2801c9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/FetchGroup.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/FetchGroup.java
@@ -293,7 +293,7 @@
      * LoadGroup created with all member groups with shouldLoad set to false dropped.
      */
     public LoadGroup toLoadGroupLoadOnly() {
-        return this.toLoadGroup(new HashMap<AttributeGroup, LoadGroup>(), true);
+        return this.toLoadGroup(new HashMap<>(), true);
     }
 
     @Override
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectLevelModifyQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectLevelModifyQuery.java
index 447e6c2..e513d53 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectLevelModifyQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ObjectLevelModifyQuery.java
@@ -17,9 +17,6 @@
 import org.eclipse.persistence.internal.helper.*;
 import org.eclipse.persistence.internal.sessions.*;
 import org.eclipse.persistence.exceptions.*;
-import org.eclipse.persistence.internal.sessions.AbstractRecord;
-import org.eclipse.persistence.internal.sessions.UnitOfWorkImpl;
-import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.descriptors.ClassDescriptor;
 
 /**
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 7e2033b..5508950 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
@@ -3488,7 +3488,7 @@
             if(this.descriptor != null && this.descriptor.hasFetchGroupManager()) {
                 FetchGroup defaultFetchGroup = descriptor.getFetchGroupManager().getDefaultFetchGroup();
                 if(defaultFetchGroup != null) {
-                    str += '\n' + "Default " + defaultFetchGroup.toString();
+                    str += '\n' + "Default " + defaultFetchGroup;
                 }
             }
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReadAllQuery.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReadAllQuery.java
index 169c655..874226c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReadAllQuery.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReadAllQuery.java
@@ -84,7 +84,7 @@
      * Specifies the direction in which the hierarchy is traversed in a
      * hierarchical query.
      */
-    public static enum Direction {
+    public enum Direction {
         /**
          * Hierarchy will be traversed from parent to child - PRIOR keyword is
          * generated on the left side of the equation
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQueryResult.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQueryResult.java
index 232a317..7c0f79a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQueryResult.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/ReportQueryResult.java
@@ -113,7 +113,7 @@
             // For bug 3115576 this is only used for EXISTS sub-selects so no result is needed.
         }
 
-        List<Object> results = new ArrayList<Object>();
+        List<Object> results = new ArrayList<>();
         for(ReportItem item: query.getItems()) {
             if (item.isConstructorItem()) {
                 Object result = processConstructorItem(query, row, toManyData, (ConstructorReportItem) item);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/SQLCall.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/SQLCall.java
index e649cb8..252fd6c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/SQLCall.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/queries/SQLCall.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
@@ -82,11 +82,6 @@
                     }
                     ((Object[])parameter)[1] = outField;
                 }
-            } else if ((parameterType == IN) && (parameter instanceof DatabaseField)){
-                DatabaseField field = afterTranslateCustomQueryUpdateParameter((DatabaseField)parameter, i, parameterType, updatedParameters, updatedParameterTypes);
-                if (field != null) {
-                    this.parameters.set(i, field);
-                }
             }
         }
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/DefaultSequence.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/DefaultSequence.java
index 7670679..34d4252 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/DefaultSequence.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/DefaultSequence.java
@@ -171,7 +171,6 @@
      * @param writeSession Session is a Session used for writing (either ClientSession or DatabaseSession);
      * @param seqName String is sequencing number field name
      * @param size int number of values to preallocate (output Vector size).
-     * @return
      */
     @Override
     public Vector<?> getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLProjectReader.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLProjectReader.java
index 319e434..3ee31a5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLProjectReader.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLProjectReader.java
@@ -26,6 +26,8 @@
 import java.io.StringWriter;
 import java.io.UnsupportedEncodingException;
 import java.net.URL;
+import java.nio.charset.StandardCharsets;
+
 import org.w3c.dom.Document;
 import org.xml.sax.EntityResolver;
 import org.xml.sax.InputSource;
@@ -234,12 +236,8 @@
 
         InputStreamReader reader = null;
         try {
-            try {
-                // Bug2631348  Only UTF-8 is supported
-                reader = new InputStreamReader(fileStream, "UTF-8");
-            } catch (UnsupportedEncodingException exception) {
-                throw ValidationException.fatalErrorOccurred(exception);
-            }
+            // Bug2631348  Only UTF-8 is supported
+            reader = new InputStreamReader(fileStream, StandardCharsets.UTF_8);
 
             Project project = read(reader, classLoader);
             return project;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLProjectWriter.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLProjectWriter.java
index 21d25a6..a9999e4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLProjectWriter.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLProjectWriter.java
@@ -15,6 +15,8 @@
 package org.eclipse.persistence.sessions.factories;
 
 import java.io.*;
+import java.nio.charset.StandardCharsets;
+
 import org.eclipse.persistence.exceptions.*;
 import org.eclipse.persistence.internal.sessions.factories.MissingDescriptorListener;
 import org.eclipse.persistence.internal.sessions.factories.ObjectPersistenceWorkbenchXMLProject;
@@ -49,7 +51,7 @@
         Writer writer;
         try {
             FileOutputStream stream = new FileOutputStream(fileName);
-            writer = new OutputStreamWriter(stream, "UTF-8");
+            writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8);
             write(project, writer);
             writer.close();
         } catch (IOException exception) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/interceptors/CacheInterceptor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/interceptors/CacheInterceptor.java
index efdcef5..82f35ce 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/interceptors/CacheInterceptor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/interceptors/CacheInterceptor.java
@@ -22,7 +22,6 @@
 import java.util.Map;
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.exceptions.QueryException;
 import org.eclipse.persistence.indirection.ValueHolderInterface;
 import org.eclipse.persistence.internal.helper.Helper;
 import org.eclipse.persistence.internal.identitymaps.CacheKey;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/rmi/RMIServerSessionManagerDispatcher.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/rmi/RMIServerSessionManagerDispatcher.java
index 6128fcf..7f2561a 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/rmi/RMIServerSessionManagerDispatcher.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/remote/rmi/RMIServerSessionManagerDispatcher.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,7 +39,7 @@
                 controller = new RMIRemoteSessionControllerDispatcher((getSession()));
             }
         } catch (RemoteException exception) {
-            System.out.println("Error in invocation " + exception.toString());
+            System.out.println("Error in invocation " + exception);
         }
 
         return controller;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ClientSession.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ClientSession.java
index f219798..b518278 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ClientSession.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/server/ClientSession.java
@@ -38,7 +38,6 @@
 import org.eclipse.persistence.internal.sessions.*;
 import org.eclipse.persistence.sessions.DatabaseLogin;
 import org.eclipse.persistence.sessions.SessionProfiler;
-import org.eclipse.persistence.internal.sessions.AbstractSession;
 
 /**
  * <b>Purpose</b>: Acts as a client to the server session.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/PackageRenamer.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/PackageRenamer.java
index 6f8b881..5ba09b8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/PackageRenamer.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/PackageRenamer.java
@@ -87,7 +87,7 @@
     static {
         // bug 2756643
         CR = PrivilegedAccessHelper.shouldUsePrivilegedAccess() ?
-                AccessController.doPrivileged(new PrivilegedAction<String>() {
+                AccessController.doPrivileged(new PrivilegedAction<>() {
                     @Override
                     public String run() {
                         return System.getProperty("line.separator");
@@ -262,10 +262,10 @@
     public void createDestinationDirectory(File aDirectory) {
         if (!aDirectory.exists()) {
             if (!aDirectory.mkdirs()) {
-                throw new PackageRenamerException("Error while creating directory:" + CR + "  '" + aDirectory.toString() + "'");
+                throw new PackageRenamerException("Error while creating directory:" + CR + "  '" + aDirectory + "'");
             }
         } else {
-            throw new PackageRenamerException("Error directory: '" + aDirectory.toString() + "' already exists but shouldn't.");
+            throw new PackageRenamerException("Error directory: '" + aDirectory + "' already exists but shouldn't.");
         }
     }
 
@@ -304,7 +304,7 @@
     public static String getDefaultPropertiesFileName() {
 
         String currentDirectory = PrivilegedAccessHelper.shouldUsePrivilegedAccess() ?
-                AccessController.doPrivileged(new PrivilegedAction<String>() {
+                AccessController.doPrivileged(new PrivilegedAction<>() {
                     @Override
                     public String run() {
                         return System.getProperty("user.dir");
@@ -537,7 +537,7 @@
         try {
             fis = new FileInputStream(new java.io.File(sourceFileName));
             byte[] buf = new byte[BUFSIZ];
-            StringBuffer strBuf = new StringBuffer((int)new java.io.File(sourceFileName).length());
+            StringBuilder strBuf = new StringBuilder((int)new java.io.File(sourceFileName).length());
             int i = 0;
             while ((i = fis.read(buf)) != -1) {
                 if (bufferContainsNullChar(buf, i)) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/FetchGroupMonitor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/FetchGroupMonitor.java
index ca1830e..2fd53fb 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/FetchGroupMonitor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/FetchGroupMonitor.java
@@ -33,7 +33,7 @@
  */
 public class FetchGroupMonitor {
 
-    public static Hashtable<Class<?>, Set<String>> fetchedAttributes = new Hashtable<Class<?>, Set<String>>();
+    public static Hashtable<Class<?>, Set<String>> fetchedAttributes = new Hashtable<>();
     public static Boolean shouldMonitor;
 
     public static boolean shouldMonitor() {
@@ -54,7 +54,7 @@
         synchronized (fetchedAttributes) {
             Set<String> classesFetchedAttributes = fetchedAttributes.get(domainClass);
             if (classesFetchedAttributes == null) {
-                classesFetchedAttributes = new HashSet<String>();
+                classesFetchedAttributes = new HashSet<>();
                 fetchedAttributes.put(domainClass, classesFetchedAttributes);
             }
             if (!classesFetchedAttributes.contains(attributeName)) {
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 a376bdf..79d131f 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
@@ -396,7 +396,7 @@
         try {
             if (shouldLogProfile()) {
                 writeNestingTabs(writer);
-                writer.write(ToStringLocalization.buildMessage("begin_profile_of", null) + "{" + query.toString() + Helper.cr());
+                writer.write(ToStringLocalization.buildMessage("begin_profile_of", null) + "{" + query + Helper.cr());
                 writer.flush();
             }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/QueryMonitor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/QueryMonitor.java
index f0736c5..67f4dfe 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/QueryMonitor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/tools/profiler/QueryMonitor.java
@@ -84,7 +84,7 @@
                 writer.write(misses.toString());
                 writer.write("\n");
             }
-            System.out.println(writer.toString());
+            System.out.println(writer);
         }
     }
 
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 95ce7f6..6f00c10 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
@@ -18,7 +18,6 @@
 
 import java.io.IOException;
 import java.io.Writer;
-import java.util.Enumeration;
 import java.util.List;
 import java.util.Vector;
 
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 fe13329..3c7e5b5 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,7 +32,6 @@
 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;
@@ -156,7 +155,7 @@
         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;
         List<StoredProcedureDefinition> storedProcedureVector;
-        Hashtable mappingHashtable;
+        Hashtable<String, Hashtable<String, StoredProcedureDefinition>> mappingHashtable;
         StoredProcedureDefinition definition;
         List<FieldDefinition> storedProcedureDefinitionArguments;
         Iterator<FieldDefinition> argumentEnum;
@@ -282,9 +281,9 @@
                     //read all
                     outputWriter.write("\tReadAllQuery mappingQuery; \n");
                     outputWriter.write("\tDeleteAllQuery deleteMappingQuery; \n");
-                    for (Enumeration e = mappingHashtable.keys(); e.hasMoreElements();) {
-                        String mappingName = (String)e.nextElement();
-                        definition = (StoredProcedureDefinition)((Hashtable)mappingHashtable.get(mappingName)).get("1MREAD");
+                    for (Enumeration<String> e = mappingHashtable.keys(); e.hasMoreElements();) {
+                        String mappingName = e.nextElement();
+                        definition = mappingHashtable.get(mappingName).get("1MREAD");
                         if (definition != null) {
                             outputWriter.write("\n\t//MAPPING READALL QUERY FOR " + mappingName + "\n");
                             outputWriter.write("\tmappingQuery= new ReadAllQuery();\n\tcall = new StoredProcedureCall();\n");
@@ -305,7 +304,7 @@
                         }
 
                         //DeleteAll Query
-                        definition = (StoredProcedureDefinition)((Hashtable)mappingHashtable.get(mappingName)).get("1MDALL");
+                        definition = mappingHashtable.get(mappingName).get("1MDALL");
                         if (definition != null) {
                             outputWriter.write("\n\t//MAPPING DELETEALL QUERY FOR " + mappingName + "\n");
                             outputWriter.write("\tdeleteMappingQuery= new DeleteAllQuery();\n\tcall = new StoredProcedureCall();\n");
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 1d28b27..a29aa03 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
@@ -24,7 +24,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.Vector;
 
 import org.eclipse.persistence.exceptions.DatabaseException;
 import org.eclipse.persistence.internal.helper.DatabaseField;
@@ -58,7 +57,7 @@
     protected boolean ignoreDatabaseException; //if true, DDL generation will continue even if exceptions occur
 
     public TableCreator() {
-        this(new ArrayList<TableDefinition>());
+        this(new ArrayList<>());
     }
 
     public TableCreator(List<TableDefinition> tableDefinitions) {
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 9252c49..b1c4cfa 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
@@ -791,7 +791,7 @@
     public Object clone() {
         TableDefinition clone = (TableDefinition)super.clone();
         if (fields != null) {
-            clone.setFields(new ArrayList<FieldDefinition>(fields.size()));
+            clone.setFields(new ArrayList<>(fields.size()));
             for (FieldDefinition fieldDef : getFields()) {
                 clone.addField((FieldDefinition)fieldDef.clone());
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/jotm/JotmTransactionController.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/jotm/JotmTransactionController.java
index 5d025d4..4474e68 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/jotm/JotmTransactionController.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/transaction/jotm/JotmTransactionController.java
@@ -57,7 +57,7 @@
                 Class<? extends TransactionManager> clazz = AccessController.doPrivileged(new PrivilegedClassForName<>(TX_CURRENT_FACTORY_CLASS));
                 Method method = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, TX_CURRENT_FACTORY_METHOD, null, false));
                 Method txMethod = AccessController.doPrivileged(new PrivilegedGetMethod(clazz, TX_MANAGER_FACTORY_METHOD, null, false));
-                TransactionManager current = AccessController.doPrivileged(new PrivilegedMethodInvoker<TransactionManager>(method, null, null));
+                TransactionManager current = AccessController.doPrivileged(new PrivilegedMethodInvoker<>(method, null, null));
                 return AccessController.doPrivileged(new PrivilegedMethodInvoker<>(txMethod, current, null));
             }catch (PrivilegedActionException ex){
                 if (ex.getCause() instanceof ClassNotFoundException){
diff --git a/foundation/org.eclipse.persistence.extension/src/main/java/org/eclipse/persistence/sessions/serializers/kryo/KryoSerializer.java b/foundation/org.eclipse.persistence.extension/src/main/java/org/eclipse/persistence/sessions/serializers/kryo/KryoSerializer.java
index 3fa7a67..2d9b306 100644
--- a/foundation/org.eclipse.persistence.extension/src/main/java/org/eclipse/persistence/sessions/serializers/kryo/KryoSerializer.java
+++ b/foundation/org.eclipse.persistence.extension/src/main/java/org/eclipse/persistence/sessions/serializers/kryo/KryoSerializer.java
@@ -30,6 +30,9 @@
  * @author James Sutherland
  */
 public class KryoSerializer extends AbstractSerializer {
+
+    private static final long serialVersionUID = 6538902324232789378L;
+
     /** Kryo is not thread safe, so need thread local. */
     transient ThreadLocal<Object> kryo;
     transient Constructor<?> kryoConstructor;
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/Oracle12Platform.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/Oracle12Platform.java
index 2c70171..df05a31 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/Oracle12Platform.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/Oracle12Platform.java
@@ -29,7 +29,6 @@
 import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.persistence.descriptors.ClassDescriptor;
-import org.eclipse.persistence.exceptions.ConversionException;
 import org.eclipse.persistence.exceptions.ValidationException;
 import org.eclipse.persistence.internal.helper.ClassConstants;
 import org.eclipse.persistence.internal.helper.DatabaseField;
@@ -167,9 +166,9 @@
      * @return Struct
      */
     @Override
-    public Struct createStruct(String structTypeName, Object[] attributes, AbstractRecord row, Vector orderedFields, AbstractSession session, Connection connection) throws SQLException {
+    public Struct createStruct(String structTypeName, Object[] attributes, AbstractRecord row, Vector<DatabaseField> orderedFields, AbstractSession session, Connection connection) throws SQLException {
         for (int index = 0; index < orderedFields.size(); index++) {
-            DatabaseField field = (DatabaseField)orderedFields.elementAt(index);
+            DatabaseField field = orderedFields.elementAt(index);
             if (row.getField(field) != null && row.getField(field).getTypeName() != null) {
                 if (ClassConstants.BLOB.getTypeName().equals(row.getField(field).getTypeName())) {
                     Blob blob = connection.createBlob();
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/converters/JGeometryConverter.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/converters/JGeometryConverter.java
index d90fa44..e127b11 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/converters/JGeometryConverter.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/converters/JGeometryConverter.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 @@
  */
 public class JGeometryConverter implements StructConverter {
     private final static String JGEOMETRY_DB_TYPE = "MDSYS.SDO_GEOMETRY";
-    private final Class JGEOMETRY_CLASS;
+    private final Class<?> JGEOMETRY_CLASS;
     private final MethodHandle loadJSMethod;
     private final MethodHandle storeJSMethod;
 
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/GridLinkDataPartitioningCallback.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/GridLinkDataPartitioningCallback.java
index b75999e..9db8be0 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/GridLinkDataPartitioningCallback.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/GridLinkDataPartitioningCallback.java
@@ -33,7 +33,7 @@
  */
 public class GridLinkDataPartitioningCallback extends UCPDataPartitioningCallback {
     /** The id is stored in a static thread local. */
-    protected static ThreadLocal partitionId = new ThreadLocal();
+    protected static ThreadLocal<Integer> partitionId = new ThreadLocal<>();
 
     public static boolean isRegistered = false;
 
@@ -68,7 +68,7 @@
             Object instance = PrivilegedAccessHelper.invokeMethod(getInstance, null, null);
             Method getDataSourceService = PrivilegedAccessHelper.getMethod(instance.getClass(), "getDataSourceService", null, false);
             Object service = PrivilegedAccessHelper.invokeMethod(getDataSourceService, instance, null);
-            Class[] argumentTypes = new Class[] {DataBasedConnectionAffinityCallback.class};
+            Class<?>[] argumentTypes = new Class<?>[] {DataBasedConnectionAffinityCallback.class};
             Method registerDataAffinityCallback = PrivilegedAccessHelper.getMethod(service.getClass(), "registerDataAffinityCallback", argumentTypes, false);
             Object[] arguments = new Object[] {new GridLinkDataPartitioningCallback()};
             PrivilegedAccessHelper.invokeMethod(registerDataAffinityCallback, service, arguments);
@@ -88,7 +88,7 @@
 
     @Override
     public int getPartitionId() {
-        Integer id = (Integer)partitionId.get();
+        Integer id = partitionId.get();
         if (id == null) {
             return 0;
         }
diff --git a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/UCPDataPartitioningCallback.java b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/UCPDataPartitioningCallback.java
index 4c55cdc..f73c60f 100644
--- a/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/UCPDataPartitioningCallback.java
+++ b/foundation/org.eclipse.persistence.oracle/src/main/java/org/eclipse/persistence/platform/database/oracle/ucp/UCPDataPartitioningCallback.java
@@ -36,7 +36,7 @@
  */
 public class UCPDataPartitioningCallback implements DataPartitioningCallback, DataBasedConnectionAffinityCallback {
     /** The id is stored in a thread local. */
-    protected ThreadLocal partitionId = new ThreadLocal();
+    protected ThreadLocal<Integer> partitionId = new ThreadLocal<>();
 
     /**
      * Default constructor.
@@ -63,7 +63,7 @@
 
     @Override
     public int getPartitionId() {
-        Integer id = (Integer)this.partitionId.get();
+        Integer id = this.partitionId.get();
         if (id == null) {
             return 0;
         }
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 cbad6f9..cd3cf41 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
@@ -84,7 +84,7 @@
     protected Map<String, Noun> normalWeightNouns;
     protected Map<String, Noun> heavyWeightNouns;
     protected Map<String, Noun> allWeightNouns;
-    protected ThreadLocal operationStartTokenThreadLocal;
+    protected ThreadLocal<Map<String, Long>> operationStartTokenThreadLocal;
     protected static boolean isDMSSpyInitialized;
     protected int weight;
 
@@ -104,15 +104,15 @@
      */
     public DMSPerformanceProfiler(Session session) {
         this.session = (AbstractSession)session;
-        this.normalWeightNouns = new Hashtable<String, Noun>(1);
-        this.heavyWeightNouns = new Hashtable<String, Noun>(5);
-        this.allWeightNouns = new Hashtable<String, Noun>(1);
-        this.normalWeightSensors = new Hashtable<String, Sensor>(4);
-        this.heavyWeightSensors = new Hashtable<String, Sensor>();
-        this.allWeightSensors = new Hashtable<String, Sensor>(22);
-        this.normalAndHeavyWeightSensors = new Hashtable<String, Sensor>();
-        this.normalHeavyAndAllWeightSensors = new Hashtable<String, Sensor>();
-        this.operationStartTokenThreadLocal = new ThreadLocal();
+        this.normalWeightNouns = new Hashtable<>(1);
+        this.heavyWeightNouns = new Hashtable<>(5);
+        this.allWeightNouns = new Hashtable<>(1);
+        this.normalWeightSensors = new Hashtable<>(4);
+        this.heavyWeightSensors = new Hashtable<>();
+        this.allWeightSensors = new Hashtable<>(22);
+        this.normalAndHeavyWeightSensors = new Hashtable<>();
+        this.normalHeavyAndAllWeightSensors = new Hashtable<>();
+        this.operationStartTokenThreadLocal = new ThreadLocal<>();
         this.weight = DMSConsole.getSensorWeight();
         if (!isDMSSpyInitialized) {
             isDMSSpyInitialized = true;
@@ -269,7 +269,7 @@
         }
         Sensor phaseEvent = getSensorByName(operationName);
         if (phaseEvent != null) {
-            Long startTime = (Long)getPhaseEventStartToken().get(operationName);
+            Long startTime = getPhaseEventStartToken().get(operationName);
             ((PhaseEvent)phaseEvent).stop(startTime);
         }
     }
@@ -293,9 +293,9 @@
         if (phaseEvent != null) {
             Long startTime;
             if (query != null) {
-                startTime = (Long)getPhaseEventStartToken().get(query.getSensorName(operationName, getSessionName()));
+                startTime = getPhaseEventStartToken().get(query.getSensorName(operationName, getSessionName()));
             } else {
-                startTime = (Long)getPhaseEventStartToken().get(operationName);
+                startTime = getPhaseEventStartToken().get(operationName);
             }
             ((PhaseEvent)phaseEvent).stop(startTime);
         }
@@ -390,7 +390,7 @@
             return null;
         }
         Noun noun = null;
-        Map map = null;
+        Map<String, Noun> map = null;
         if (weight == DMSConsole.NORMAL) {
             map = getNormalWeightNouns();
         } else if (weight == DMSConsole.HEAVY) {
@@ -399,7 +399,7 @@
             map = getAllWeightNouns();
         }
         if (map != null) {
-            noun = (Noun)map.get(type);
+            noun = map.get(type);
             if (noun == null) {
                 if (parentNoun != null) {
                     noun = Noun.create(parentNoun, type, type);
@@ -644,7 +644,7 @@
      * Destroy sensors based on dms weight when user changes the weight at runtime.
      */
     protected void destroySensorsByWeight(int weight) {
-        Iterator iterator = null;
+        Iterator<Sensor> iterator = null;
         if (weight == DMSConsole.HEAVY) {
             iterator = getHeavyWeightSensors().values().iterator();
         } else if (weight == DMSConsole.ALL) {
@@ -652,7 +652,7 @@
         }
         if (iterator != null) {
             while (iterator.hasNext()) {
-                ((Sensor)iterator.next()).destroy();
+                iterator.next().destroy();
             }
         }
     }
@@ -692,11 +692,11 @@
         }
     }
 
-    protected HashMap getPhaseEventStartToken() {
+    protected Map<String, Long> getPhaseEventStartToken() {
         if (getOperationStartTokenThreadLocal().get() == null) {
-            getOperationStartTokenThreadLocal().set(new HashMap());
+            getOperationStartTokenThreadLocal().set(new HashMap<>());
         }
-        return (HashMap)getOperationStartTokenThreadLocal().get();
+        return getOperationStartTokenThreadLocal().get();
     }
 
     protected Map<String, Sensor> getNormalWeightSensors() {
@@ -731,7 +731,7 @@
         return allWeightNouns;
     }
 
-    protected ThreadLocal getOperationStartTokenThreadLocal() {
+    protected ThreadLocal<Map<String, Long>> getOperationStartTokenThreadLocal() {
         return operationStartTokenThreadLocal;
     }
 
diff --git a/jpa/eclipselink.jpa.nosql.test/pom.xml b/jpa/eclipselink.jpa.nosql.test/pom.xml
index 2bdb10a..2b5a6be 100644
--- a/jpa/eclipselink.jpa.nosql.test/pom.xml
+++ b/jpa/eclipselink.jpa.nosql.test/pom.xml
@@ -31,6 +31,10 @@
     </parent>
 
     <properties>
+        <comp.xlint>-Xlint:all</comp.xlint>
+        <comp.xdoclint>-Xdoclint:all,-missing</comp.xdoclint>
+        <comp.test.xlint>-Xlint:all</comp.test.xlint>
+
         <!--Properties used for test resources filtering/replacement-->
         <!--DB connection properties-->
         <dbPlatform>${db.platform}</dbPlatform>
@@ -188,6 +192,16 @@
         </testResources>
 
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <arg>-Werror</arg>
+                    </compilerArgs>
+                    <proc>none</proc>
+                </configuration>
+            </plugin>
             <!--Required for EL Weaving (-javaagent:${org.eclipse.persistence:org.eclipse.persistence.jpa:jar})-->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
diff --git a/jpa/eclipselink.jpa.nosql.test/src/it/java-templates/org/eclipse/persistence/testing/framework/server/TestRunnerBean.java b/jpa/eclipselink.jpa.nosql.test/src/it/java-templates/org/eclipse/persistence/testing/framework/server/TestRunnerBean.java
index cf5589b..14305e5 100644
--- a/jpa/eclipselink.jpa.nosql.test/src/it/java-templates/org/eclipse/persistence/testing/framework/server/TestRunnerBean.java
+++ b/jpa/eclipselink.jpa.nosql.test/src/it/java-templates/org/eclipse/persistence/testing/framework/server/TestRunnerBean.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
@@ -12,7 +12,7 @@
 
 // Contributors:
 //     Oracle - initial API and implementation from Oracle TopLink
- package org.eclipse.persistence.testing.framework.server;
+package org.eclipse.persistence.testing.framework.server;
 
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
@@ -58,9 +58,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(String.class);
+            testInstance = c.newInstance(test);
         } catch (ClassNotFoundException e) {
             throw new EJBException(e);
         } catch (NoSuchMethodException e) {
diff --git a/jpa/eclipselink.jpa.nosql.test/src/it/java-templates/org/eclipse/persistence/testing/framework/server/TestRunnerBean.java_nonjtaDS b/jpa/eclipselink.jpa.nosql.test/src/it/java-templates/org/eclipse/persistence/testing/framework/server/TestRunnerBean.java_nonjtaDS
index 22c4d05..fff6625 100644
--- a/jpa/eclipselink.jpa.nosql.test/src/it/java-templates/org/eclipse/persistence/testing/framework/server/TestRunnerBean.java_nonjtaDS
+++ b/jpa/eclipselink.jpa.nosql.test/src/it/java-templates/org/eclipse/persistence/testing/framework/server/TestRunnerBean.java_nonjtaDS
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -58,9 +58,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(String.class);
+            testInstance = c.newInstance(test);
         } catch (ClassNotFoundException e) {
             throw new EJBException(e);
         } catch (NoSuchMethodException e) {
diff --git a/jpa/eclipselink.jpa.spring.test/pom.xml b/jpa/eclipselink.jpa.spring.test/pom.xml
index 4cf6f9b..fe6ded1 100644
--- a/jpa/eclipselink.jpa.spring.test/pom.xml
+++ b/jpa/eclipselink.jpa.spring.test/pom.xml
@@ -31,6 +31,10 @@
     </parent>
 
     <properties>
+        <comp.xlint>-Xlint:all</comp.xlint>
+        <comp.xdoclint>-Xdoclint:all,-missing</comp.xdoclint>
+        <comp.test.xlint>-Xlint:all</comp.test.xlint>
+
         <!--Properties used for test resources filtering/replacement-->
         <!--DB connection properties-->
         <dbPlatform>${db.platform}</dbPlatform>
@@ -142,6 +146,15 @@
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <arg>-Werror</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
                     <skip>true</skip>
diff --git a/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/EntityManagerWrapper.java b/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/EntityManagerWrapper.java
index f32995e..887e9b3 100644
--- a/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/EntityManagerWrapper.java
+++ b/jpa/eclipselink.jpa.spring.test/src/it/java/org/eclipse/persistence/testing/tests/jpa/spring/EntityManagerWrapper.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
@@ -96,7 +96,7 @@
         return em.createNativeQuery(string).executeUpdate();
     }
 
-    public Query createNativeQuery(String string, Class clazz) {
+    public Query createNativeQuery(String string, Class<?> clazz) {
         return em.createNativeQuery(string, clazz);
     }
 
diff --git a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/inherited/Consumable.java b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/inherited/Consumable.java
index 0b51b18..11ca06c 100644
--- a/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/inherited/Consumable.java
+++ b/jpa/eclipselink.jpa.test/src/it/java/org/eclipse/persistence/testing/models/jpa/inherited/Consumable.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
@@ -22,7 +22,6 @@
  * This class was added as a test for bug 411560
  * @author tware
  *
- * @param <PK>
  */
 
 @MappedSuperclass
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 bb3feb6..b00b5e1 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
@@ -88,9 +88,6 @@
     /**
      * INTERNAL:
      * Add the read only mappings for the given field to the allMappings list.
-     * @param aDescriptor
-     * @param field
-     * @param allMappings
      */
     protected void addWritableMapping(ClassDescriptor aDescriptor, DatabaseField field, List allMappings) {
         DatabaseMapping writableMapping = aDescriptor.getObjectBuilder().getMappingForField(field);
@@ -106,9 +103,6 @@
     /**
      * INTERNAL:
      * Add the writable mapping for the given field to the allMappings list.
-     * @param aDescriptor
-     * @param field
-     * @param allMappings
      */
     protected void addReadOnlyMappings(ClassDescriptor aDescriptor, DatabaseField field, List allMappings) {
         List<DatabaseMapping> readOnlyMappings = aDescriptor.getObjectBuilder().getReadOnlyMappingsForField(field);
@@ -135,7 +129,6 @@
      * Convert all the class-name-based settings in this object to actual class-based
      * settings. This method is used when converting a project that has been built
      * with class names to a project with classes.
-     * @param classLoader
      */
     @Override
     public void convertClassNamesToClasses(ClassLoader classLoader){
@@ -279,10 +272,7 @@
 
     /**
      * INTERNAL:
-     * @param cls
-     * @param fieldName
      * @return the field from the class with name equal to fieldName.
-     * @throws NoSuchFieldException
      */
     protected Field getField(Class cls, String fieldName) throws NoSuchFieldException {
         Field keyField = null;
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/CacheImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/CacheImpl.java
index 2c02cc2..cfe96d7 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/CacheImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/CacheImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2008, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2008, 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,7 +46,6 @@
     private EntityManagerFactoryDelegate emf;
 
     /**
-     * @param emf
      */
     public CacheImpl(EntityManagerFactoryDelegate emf) {
         this.emf = emf;
@@ -87,8 +86,6 @@
      * passed in class parameter and invalidates only entities found in the cache.
      * If the class is not an Entity or MappedSuperclass (such as an Embeddable or plain java class)
      *  - nothing will be evicted
-     * @param possibleSuperclass
-     * @param id
      */
     private void evictAssignableEntitySuperclass(Class possibleSuperclass, Object id) {
         // just remove the parent entity
@@ -444,7 +441,6 @@
     /**
      * INTERNAL:
      * Return the EntityManagerFactory associated with this CacheImpl.
-     * @return
      */
     protected EntityManagerFactoryDelegate getEntityManagerFactory() {
         return this.emf;
@@ -453,7 +449,6 @@
     /**
      * INTERNAL:
      * Return the Session associated with the EntityManagerFactory.
-     * @return
      */
     protected Session getSession() {
         return getEntityManagerFactory().getDatabaseSession();
@@ -462,7 +457,6 @@
     /**
      * INTERNAL:
      * Return the IdentityMapAccessor associated with the session on the EntityManagerFactory on this CacheImpl.
-     * @return
      */
     protected IdentityMapAccessor getAccessor() {
         return getSession().getIdentityMapAccessor();
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 9da5cb9..51bf293 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
@@ -109,7 +109,6 @@
     /**
      * Build a DatabaseQuery from an jpql string.
      *
-     * @param jpql
      * @param session
      *            the session to get the descriptors for this query for.
      * @return a DatabaseQuery representing the given jpql.
@@ -270,8 +269,6 @@
      * Set an implementation-specific hint. If the hint name is not recognized,
      * it is silently ignored.
      *
-     * @param hintName
-     * @param value
      * @return the same query instance
      * @throws IllegalArgumentException
      *             if the second argument is not valid for the implementation
@@ -291,7 +288,6 @@
     /**
      * Set the lock mode type to be used for the query execution.
      *
-     * @param lockMode
      * @throws IllegalStateException
      *             if not a Java Persistence query language SELECT query
      */
@@ -419,7 +415,6 @@
     /**
      * Set the flush mode type to be used for the query execution.
      *
-     * @param flushMode
      */
     @Override
     public EJBQueryImpl setFlushMode(FlushModeType flushMode) {
@@ -429,7 +424,6 @@
     /**
      * Set the maximum number of results to retrieve.
      *
-     * @param maxResult
      * @return the same query instance
      */
     @Override
@@ -440,9 +434,6 @@
     /**
      * Bind an instance of java.util.Calendar to a positional parameter.
      *
-     * @param position
-     * @param value
-     * @param temporalType
      * @return the same query instance
      */
     @Override
@@ -454,9 +445,6 @@
     /**
      * Bind an instance of java.util.Date to a positional parameter.
      *
-     * @param position
-     * @param value
-     * @param temporalType
      * @return the same query instance
      */
     @Override
@@ -468,8 +456,6 @@
     /**
      * Bind an argument to a positional parameter.
      *
-     * @param position
-     * @param value
      * @return the same query instance
      */
     @Override
@@ -487,9 +473,6 @@
     /**
      * Bind an instance of java.util.Calendar to a Parameter object.
      *
-     * @param param
-     * @param value
-     * @param temporalType
      * @return the same query instance
      * @throws IllegalArgumentException
      *             if position does not correspond to a parameter of the query
@@ -516,8 +499,6 @@
      *
      * @param param
      *            object
-     * @param value
-     * @param temporalType
      * @return the same query instance
      * @throws IllegalArgumentException
      *             if position does not correspond to a parameter of the query
@@ -569,9 +550,6 @@
     /**
      * Bind an instance of java.util.Calendar to a named parameter.
      *
-     * @param name
-     * @param value
-     * @param temporalType
      * @return the same query instance
      */
     @Override
@@ -583,9 +561,6 @@
     /**
      * Bind an instance of java.util.Date to a named parameter.
      *
-     * @param name
-     * @param value
-     * @param temporalType
      * @return the same query instance
      */
     @Override
@@ -599,7 +574,6 @@
      *
      * @param name
      *            the parameter name
-     * @param value
      * @return the same query instance
      */
     @Override
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 36aa485..c6b70b5 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,6 +1,6 @@
 /*
  * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
- * Copyright (c) 1998, 2019 IBM Corporation. All rights reserved.
+ * Copyright (c) 1998, 2021 IBM Corporation. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -156,7 +156,6 @@
      * Will return an instance of the Factory. Should only be called by
      * EclipseLink.
      *
-     * @param databaseSession
      */
     public EntityManagerFactoryDelegate(AbstractSession databaseSession, JpaEntityManagerFactory owner) {
         this.session = databaseSession;
@@ -239,7 +238,6 @@
     /**
      * INTERNAL:
      * Return the EntityManagerSetupImpl associated with this factory
-     * @return
      */
     public EntityManagerSetupImpl getSetupImpl(){
         return setupImpl;
@@ -353,7 +351,6 @@
      * This method will return a version of EntityManagerFactory that is
      * based on the available metadata at the time it is called.  Future calls
      * to refresh will not affect that metadata on this EntityManagerFactory.
-     * @return
      */
     @Override
     public EntityManagerFactoryDelegate unwrap(){
@@ -459,7 +456,6 @@
      * EntityMangers will continue to function with the old metadata, but new factories will use the new metadata.
      *
      * This call will throw an exception when called on EntityManagerFactoryImplDelegate
-     * @param properties
      */
     @Override
     public void refreshMetadata(Map properties){
@@ -683,7 +679,6 @@
     /**
      * INTERNAL:
      * Get the EntityManagerFactoryImpl that created this
-     * @return
      */
     public JpaEntityManagerFactory getOwner() {
         return owner;
@@ -694,7 +689,6 @@
      * possible case that we want to regenerate it. This function is outside of
      * the JPA 2.0 specification.
      *
-     * @param aMetamodel
      * @since Java Persistence 2.0
      */
     public void setMetamodel(Metamodel aMetamodel) {
@@ -749,7 +743,6 @@
      * available until after the database insert has occurred. Returns null if
      * the entity does not yet have an id
      *
-     * @param entity
      * @return id of the entity
      * @throws IllegalArgumentException
      *             if the entity is found not to be an entity.
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryImpl.java
index 65b39c2..1ba99bf 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/EntityManagerFactoryImpl.java
@@ -81,7 +81,6 @@
      * available until after the database insert has occurred. Returns null if
      * the entity does not yet have an id
      *
-     * @param entity
      * @return id of the entity
      * @throws IllegalArgumentException
      *             if the entity is found not to be an entity.
@@ -166,10 +165,6 @@
      * ForeignReferenceMappings to see if has been instantiated and otherwise
      * check the fetch group.
      *
-     * @param entity
-     * @param attributeName
-     * @param mapping
-     * @return
      */
     public static boolean isLoaded(Object entity, String attributeName, DatabaseMapping mapping) {
         if (mapping.isForeignReferenceMapping()) {
@@ -191,7 +186,6 @@
      * Will return an instance of the Factory. Should only be called by
      * EclipseLink.
      *
-     * @param serverSession
      */
     public EntityManagerFactoryImpl(AbstractSession serverSession) {
         delegate = new EntityManagerFactoryDelegate(serverSession, this);
@@ -215,7 +209,6 @@
      * Re-bootstrap this factory.  This method will rebuild the EntityManagerFactory.  It should be used
      * in conjunction with a MetadataSource to allow mappings to be changed in a running system.  All existing
      * EntityMangers will continue to function with the old metadata, but new factories will use the new metadata.
-     * @param properties
      */
     @Override
     public void refreshMetadata(Map<String, Object> properties){
@@ -355,7 +348,6 @@
      * This method will return a version of EntityManagerFactory that is
      * based on the available metadata at the time it is called.  Future calls
      * to refresh will not affect that metadata on this EntityManagerFactory.
-     * @return
      */
     @Override
     public EntityManagerFactoryDelegate unwrap(){
@@ -570,7 +562,6 @@
      * possible case that we want to regenerate it. This function is outside of
      * the JPA 2.0 specification.
      *
-     * @param aMetamodel
      * @since Java Persistence 2.0
      */
     public void setMetamodel(Metamodel aMetamodel) {
@@ -616,7 +607,6 @@
      * available until after the database insert has occurred. Returns null if
      * the entity does not yet have an id
      *
-     * @param entity
      * @return id of the entity
      * @throws IllegalStateException
      *             if the entity is found not to be an entity.
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 21a9f30..517c6e2 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
@@ -97,8 +97,6 @@
     /**
      * Add an EntityManagerSetupImpl to the cached list
      * These are used to ensure all persistence units that are the same get the same underlying session
-     * @param name
-     * @param setup
      */
     public static void addEntityManagerSetupImpl(String name, EntityManagerSetupImpl setup){
         synchronized (EntityManagerFactoryProvider.emSetupImpls) {
@@ -111,7 +109,6 @@
 
     /**
      * Calls the appropriate create,replace or alter SchemaManager api.
-     * @param mgr
      * @param ddlType - ddl operation to be performed
      */
     protected static void generateDefaultTables(SchemaManager mgr, TableCreationType ddlType) {
@@ -142,10 +139,6 @@
     /**
      * Check the provided map for an object with the given key.  If that object is not available, check the
      * System properties.  If it is not available from either location, return the default value.
-     * @param propertyKey
-     * @param overrides
-     * @param defaultValue
-     * @return
      */
     public static String getConfigPropertyAsString(String propertyKey, Map overrides, String defaultValue){
         String value = getConfigPropertyAsString(propertyKey, overrides);
@@ -230,7 +223,6 @@
 
     /**
      * Return the setup class for a given entity manager name
-     * @param emName
      */
     public static EntityManagerSetupImpl getEntityManagerSetupImpl(String emName) {
         synchronized (EntityManagerFactoryProvider.emSetupImpls){
@@ -274,8 +266,6 @@
     /**
      * Merge the properties from the source object into the target object.  If the property
      * exists in both objects, use the one from the target
-     * @param target
-     * @param source
      * @return the target object
      */
     public static <K, V> Map<K, V> mergeMaps(Map<K, V> target, Map<K, V> source){
@@ -292,8 +282,6 @@
 
     /**
      * Copies source into target, removes from target all keysToBeRemoved.
-     * @param source
-     * @param keysToBeRemoved
      * @return the target object
      */
     public static <K, V> Map<K, V> removeSpecifiedProperties(Map<K, V> source, Collection<K> keysToBeRemoved){
@@ -310,8 +298,6 @@
 
     /**
      * target contains the entries from source with keysToBeKept.
-     * @param source
-     * @param keysToBeKept
      * @return the target object
      */
     public static <K, V> Map<K, V> keepSpecifiedProperties(Map<K, V> source, Collection<K> keysToBeKept){
@@ -333,8 +319,6 @@
      * target is a array of two Maps
      * the first one contains specified properties;
      * the second all the rest.
-     * @param source
-     * @param keysToBeKept
      * @return the target object
      */
     public static <K, V> Map<K, V>[] splitSpecifiedProperties(Map<K, V> source, Collection<K> keysToBeKept){
@@ -362,7 +346,6 @@
      * Target's size equals keys' size + 1:
      * all the source's Map.Entries not found in any of keys Collections
      * go into the last target's map.
-     * @param source
      * @param keys is array of Maps of size n
      * @return the target object is array of Maps of size n+1
      */
@@ -394,8 +377,6 @@
     /**
      * This is a TEMPORARY method that will be removed.
      * DON'T USE THIS METHOD - for internal use only.
-     * @param m
-     * @param session
      */
     protected static void translateOldProperties(Map m, AbstractSession session) {
         for(int i=0; i < oldPropertyNames.length; i++) {
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 48acbca..8e4347a 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
@@ -431,7 +431,6 @@
      * manager will be added here. On rollback or commit any left over open
      * queries should be closed.
      *
-     * @param query
      */
     public void addOpenQuery(QueryImpl query) {
         getOpenQueriesMap().put(query, query);
@@ -586,7 +585,6 @@
      * object if it is new. The instance of the entity provided will become
      * managed.
      *
-     * @param entity
      * @throws IllegalArgumentException
      *             if the given Object is not an entity.
      */
@@ -615,7 +613,6 @@
      * Merge the state of the given entity into the current persistence context,
      * using the unqualified class name as the entity name.
      *
-     * @param entity
      * @return the instance that the state was merged to
      */
     @Override
@@ -633,7 +630,6 @@
      * Merge the state of the given entity into the current persistence context,
      * using the unqualified class name as the entity name.
      *
-     * @param entity
      * @return the instance that the state was merged to
      * @throws IllegalArgumentException
      *             if given Object is not an entity or is a removed entity
@@ -655,7 +651,6 @@
     /**
      * Remove the instance.
      *
-     * @param entity
      * @throws IllegalArgumentException
      *             if Object passed in is not an entity
      */
@@ -703,8 +698,6 @@
      * vendor-specific property or hint is not recognized, it is silently
      * ignored.
      *
-     * @param entityClass
-     * @param primaryKey
      * @param properties
      *            standard and vendor-specific properties
      * @return the found entity instance or null if the entity does not exist
@@ -735,9 +728,6 @@
      * thrown if the database locking failure causes only statement-level
      * rollback
      *
-     * @param entityClass
-     * @param primaryKey
-     * @param lockMode
      * @return the found entity instance or null if the entity does not exist
      * @throws IllegalArgumentException
      *             if the first argument does not denote an entity type or the
@@ -780,9 +770,6 @@
      * timeout hint. Depending on the database in use and the locking mechanisms
      * used by the provider, the hint may or may not be observed.
      *
-     * @param entityClass
-     * @param primaryKey
-     * @param lockMode
      * @param properties
      *            standard and vendor-specific properties and hints
      * @return the found entity instance or null if the entity does not exist
@@ -1048,7 +1035,6 @@
      * vendor-specific property or hint is not recognized, it is silently
      * ignored.
      *
-     * @param entity
      * @param properties
      *            standard and vendor-specific properties
      * @throws IllegalArgumentException
@@ -1076,8 +1062,6 @@
      * LockTimeoutException will be thrown if the database locking failure
      * causes only statement-level rollback.
      *
-     * @param entity
-     * @param lockMode
      * @throws IllegalArgumentException
      *             if the instance is not an entity or the entity is not managed
      * @throws TransactionRequiredException
@@ -1111,8 +1095,6 @@
      * in use and the locking mechanisms used by the provider, the hint may or
      * may not be observed.
      *
-     * @param entity
-     * @param lockMode
      * @param properties
      *            standard and vendor-specific properties and hints
      * @throws IllegalArgumentException
@@ -1170,8 +1152,6 @@
     /**
      * Check if the instance belongs to the current persistence context.
      *
-     * @param entity
-     * @return
      * @throws IllegalArgumentException
      *             if given Object is not an entity
      */
@@ -1451,8 +1431,6 @@
      * if it is not found then search for it from EntityManagerFactory
      * properties.
      *
-     * @param name
-     * @return
      */
     public Object getProperty(String name) {
         Object propertyValue = null;
@@ -1508,8 +1486,6 @@
      * unless it was accessed by the application while the entity manager was
      * open.
      *
-     * @param entityClass
-     * @param primaryKey
      * @return the found entity instance.
      * @throws IllegalArgumentException
      *             if the first argument does not denote an entity type or the
@@ -1974,8 +1950,6 @@
      * Set the lock mode for an entity object contained in the persistence
      * context.
      *
-     * @param entity
-     * @param lockMode
      * @throws PersistenceException
      *             if an unsupported lock call is made
      * @throws IllegalArgumentException
@@ -1992,8 +1966,6 @@
      * Set the lock mode for an entity object contained in the persistence
      * context.
      *
-     * @param entity
-     * @param lockMode
      * @throws PersistenceException
      *             if an unsupported lock call is made
      * @throws IllegalArgumentException
@@ -2287,7 +2259,6 @@
      * Set the flush mode that applies to all objects contained in the
      * persistence context.
      *
-     * @param flushMode
      */
     @Override
     public void setFlushMode(FlushModeType flushMode) {
@@ -2679,7 +2650,6 @@
      * database. Entities which previously referenced the detached entity will
      * continue to reference it.
      *
-     * @param entity
      * @throws IllegalArgumentException
      *             if the instance is not an entity
      *
@@ -2992,7 +2962,6 @@
      * or have a common inheritance hierarchy mapped root class.
      * The AttributeGroup should correspond to the entity type.
      *
-     * @param entityOrEntities
      */
     @Override
     public void load(Object entityOrEntities, AttributeGroup group) {
@@ -3006,7 +2975,6 @@
      * or have a common inheritance hierarchy mapped root class.
      * The AttributeGroup should correspond to the entity type.
      *
-     * @param entityOrEntities
      */
     @Override
     public Object copy(Object entityOrEntities, AttributeGroup group) {
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 619fced..d7390fd 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
@@ -875,11 +875,6 @@
      * This method is used to resolve Descriptor Customizers that might have been stored in the project
      * for JPA project caching.
      *
-     * @param realClassLoader
-     * @throws ClassNotFoundException
-     * @throws PrivilegedActionException
-     * @throws IllegalAccessException
-     * @throws InstantiationException
      */
     private void processDescriptorsFromCachedProject(ClassLoader realClassLoader) throws ClassNotFoundException, PrivilegedActionException, IllegalAccessException, InstantiationException {
         for (ClassDescriptor descriptor: session.getProject().getDescriptors().values()) {
@@ -1404,8 +1399,6 @@
      * Internal:
      * Returns a list of StructConverter instances from a list of StructConverter names stored within the project.
      *
-     * @param realClassLoader
-     * @return
      */
     protected List<StructConverter> getStructConverters(ClassLoader realClassLoader) {
         List<StructConverter> structConverters = new ArrayList<StructConverter>();
@@ -4120,7 +4113,6 @@
      * Convenience function to allow us to reset the Metamodel
      * in the possible case that we want to regenerate it.
      * This function is outside of the JPA 2.0 specification.
-     * @param aMetamodel
      * @since Java Persistence 2.0
      */
     public void setMetamodel(Metamodel aMetamodel) {
@@ -4261,7 +4253,6 @@
      * for a canonical metamodel class and initialize each attribute in it with a proxy that can cause the
      * rest of the metamodel population.  Attributes are found reflectively rather than through the metamodel
      * to avoid having to further initialize the metamodel.
-     * @param factory
      */
     public void preInitializeCanonicalMetamodel(EntityManagerFactoryImpl factory){
         // 338837: verify that the collection is not empty - this would mean entities did not make it into the search path
@@ -4471,8 +4462,6 @@
      *
      * This call will mean any users of this EntityManagerSetupImpl will get the new version the next time
      * they look it up (for instance and EntityManager creation time)
-     * @param properties
-     * @return
      */
     public EntityManagerSetupImpl refreshMetadata(Map properties){
         String sessionName = getSessionName();
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/JPAQuery.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/JPAQuery.java
index e9765aa..d813ccd 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/JPAQuery.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/JPAQuery.java
@@ -64,10 +64,6 @@
 
     /**
      * JPQL
-     * @param name
-     * @param jpqlString
-     * @param lockMode
-     * @param hints
      */
     public JPAQuery(String name, String jpqlString, String lockMode, Map<String, Object> hints) {
         this.name = name;
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryImpl.java
index 5f98650..49cfb4a 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/QueryImpl.java
@@ -635,7 +635,6 @@
     /**
      * Set the flush mode type to be used for the query execution.
      *
-     * @param flushMode
      */
     public QueryImpl setFlushMode(FlushModeType flushMode) {
         try {
@@ -720,8 +719,6 @@
 
     /**
      * Return the identifier of this parameter.  This will be the name if it is set, else it will be the position
-     * @param param
-     * @return
      */
     public static String getParameterId(Parameter param){
         Integer id= param.getPosition();
@@ -782,7 +779,6 @@
     /**
      * Set the lock mode type to be used for the query execution.
      *
-     * @param lockMode
      * @throws IllegalStateException
      *             if not a Java Persistence query language SELECT query
      */
@@ -838,7 +834,6 @@
     /**
      * Set the maximum number of results to retrieve.
      *
-     * @param maxResult
      * @return the same query instance
      */
     public QueryImpl setMaxResults(int maxResult) {
@@ -875,7 +870,6 @@
     /**
      * Set the maximum number of results to retrieve.
      *
-     * @param maxResult
      */
     public void setMaxResultsInternal(int maxResult) {
         if (maxResult < 0) {
@@ -913,8 +907,6 @@
     /**
      * Bind an argument to a positional parameter.
      *
-     * @param position
-     * @param value
      */
     protected void setParameterInternal(int position, Object value) {
         setParameterInternal(String.valueOf(position), value, true);
@@ -1094,7 +1086,6 @@
     /**
      * Return the value bound to the named parameter.
      *
-     * @param name
      * @return parameter value
      * @throws IllegalStateException
      *             if the parameter has not been been bound
@@ -1116,7 +1107,6 @@
     /**
      * Return the value bound to the positional parameter.
      *
-     * @param position
      * @return parameter value
      * @throws IllegalStateException
      *             if the parameter has not been been bound
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/StoredProcedureQueryImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/StoredProcedureQueryImpl.java
index 2a28966..f238213 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/StoredProcedureQueryImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/StoredProcedureQueryImpl.java
@@ -896,7 +896,6 @@
     /**
      * Set the lock mode type to be used for the query execution.
      *
-     * @param lockMode
      * @throws IllegalStateException
      *             if not a Java Persistence query language SELECT query
      */
@@ -908,7 +907,6 @@
     /**
      * Set the maximum number of results to retrieve.
      *
-     * @param maxResult
      * @return the same query instance
      */
     @Override
@@ -919,9 +917,6 @@
     /**
      * Bind an instance of java.util.Calendar to a positional parameter.
      *
-     * @param position
-     * @param value
-     * @param temporalType
      * @return the same query instance
      * @throws IllegalArgumentException if position does not correspond to a
      * positional parameter of the query or if the value argument is of
@@ -936,9 +931,6 @@
     /**
      * Bind an instance of java.util.Date to a positional parameter.
      *
-     * @param position
-     * @param value
-     * @param temporalType
      * @return the same query instance
      * @throws IllegalArgumentException if position does not correspond to a
      * positional parameter of the query or if the value argument is of
@@ -953,8 +945,6 @@
     /**
      * Bind an argument to a positional parameter.
      *
-     * @param position
-     * @param value
      * @return the same query instance
      * @throws IllegalArgumentException if position does not correspond to a
      * positional parameter of the query or if the argument is of incorrect type
@@ -974,9 +964,6 @@
     /**
      * Bind an instance of java.util.Calendar to a Parameter object.
      *
-     * @param param
-     * @param value
-     * @param temporalType
      * @return the same query instance
      * @throws IllegalArgumentException if the parameter does not correspond to
      * a parameter of the query
@@ -1001,9 +988,6 @@
     /**
      * Bind an instance of java.util.Date to a Parameter object.
      *
-     * @param param
-     * @param value
-     * @param temporalType
      * @return the same query instance
      * @throws IllegalArgumentException if the parameter does not correspond to
      * a parameter of the query
@@ -1028,8 +1012,6 @@
     /**
      * Bind the value of a Parameter object.
      *
-     * @param param
-     * @param value
      * @return the same query instance
      * @throws IllegalArgumentException if the parameter does not correspond to
      * a parameter of the query
@@ -1054,9 +1036,6 @@
     /**
      * Bind an instance of java.util.Calendar to a named parameter.
      *
-     * @param name
-     * @param value
-     * @param temporalType
      * @return the same query instance
      * @throws IllegalArgumentException if the parameter name does not
      * correspond to a parameter of the query or if the value argument is of
@@ -1071,9 +1050,6 @@
     /**
      * Bind an instance of java.util.Date to a named parameter.
      *
-     * @param name
-     * @param value
-     * @param temporalType
      * @return the same query instance
      * @throws IllegalArgumentException if the parameter name does not
      * correspond to a parameter of the query or if the value argument is of
@@ -1088,8 +1064,6 @@
     /**
      * Bind an argument to a named parameter.
      *
-     * @param name
-     * @param value
      * @return the same query instance
      * @throws IllegalArgumentException if the parameter name does not
      * correspond to a parameter of the query or if the argument is of incorrect
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 31071f5..c9db329 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
@@ -132,7 +132,6 @@
      * This method is called for a URL which has neither jar nor file protocol.
      * This attempts to find out if we can treat it as a URL from which a JAR
      * format InputStream can be obtained.
-     * @param url
      */
     protected boolean isJarInputStream(URL url) throws IOException {
         InputStream in = null;
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/BeanValidationInitializationHelper.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/BeanValidationInitializationHelper.java
index 58c3705..64643ec 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/BeanValidationInitializationHelper.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/BeanValidationInitializationHelper.java
@@ -120,8 +120,6 @@
          * @param className Fully qualified class name
          * @param classLoader ClassLoader to be used for loading the class
          * @return Loaded Class
-         * @throws java.security.PrivilegedActionException
-         * @throws ClassNotFoundException
          */
         private Class loadClass(String className, ClassLoader classLoader) throws PrivilegedActionException, ClassNotFoundException {
             Class loadedClass = null;
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 1729c24..e5671e6 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
@@ -194,8 +194,6 @@
 
     /**
      * Returns whether the given persistence provider class is supported by this implementation
-     * @param providerClassName
-     * @return
      */
     public boolean isPersistenceProviderSupported(String providerClassName){
         return (providerClassName == null) || providerClassName.equals("") || providerClassName.equals(EntityManagerFactoryProvider.class.getName()) || providerClassName.equals(PersistenceProvider.class.getName());
@@ -224,8 +222,6 @@
     /**
      * Register a transformer.  This method should be overridden to provide the appropriate transformer
      * registration for the environment
-     * @param transformer
-     * @param persistenceUnitInfo
      */
     public abstract void registerTransformer(final ClassTransformer transformer, PersistenceUnitInfo persistenceUnitInfo, Map properties);
 
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 2b0407b..51696f5 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
@@ -242,8 +242,6 @@
     /**
      * Register a transformer.  In this case, we use the instrumentation to add a transformer for the
      * JavaSE environment
-     * @param transformer
-     * @param persistenceUnitInfo
      */
     @Override
     public void registerTransformer(final ClassTransformer transformer, PersistenceUnitInfo persistenceUnitInfo, Map properties){
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
index dc6b7b5..ae8cdf8 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/PersistenceUnitProcessor.java
@@ -171,7 +171,6 @@
      * {@code descriptorLocation} via {@code Classloader.getResource(String)}).
      * @param descriptorLocation - the name of the resource.
      * @return The URL of the PU root containing the resource.
-     * @throws IOException
      * @throws ValidationException if the resolved root doesn't conform to the
      * JPA specification (8.2)
      */
@@ -720,8 +719,6 @@
     /**
      * Build the unique persistence name by concatenating the decoded URL with the persistence unit name.
      * A decoded URL is required while persisting on a multi-bytes OS.
-     * @param url
-     * @param puName
      * @return String
      */
    public static String buildPersistenceUnitName(URL url, String puName){
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XPathEngine.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XPathEngine.java
index 135cd70..2e8c189 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XPathEngine.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/deployment/xml/parser/XPathEngine.java
@@ -51,7 +51,6 @@
      *
      * @param contextNode the node relative to which the XPath statement will be executed
      * @return the first node located matching the XPath statement
-     * @throws XMLPlatformException
      */
     public Node selectSingleNode(Node contextNode, String[] xPathFragments) {
         if (contextNode == null) {
@@ -75,7 +74,6 @@
      *
      * @param contextNode the node relative to which the XPath statement will be executed
      * @return a list of nodes matching the XPath statement
-     * @throws XMLPlatformException
      */
     public NodeList selectNodes(Node contextNode, String[] xPathFragments) {
         if (contextNode == null) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java
index 5a69cef..60c6700 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/MetadataProject.java
@@ -1283,7 +1283,6 @@
     /**
      * INTERNAL:
      * Return the core API Project associated with this MetadataProject.
-     * @return
      * @since EclipseLink 1.2 for the JPA 2.0 Reference Implementation
      */
     public Project getProject() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/MetadataAccessor.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/MetadataAccessor.java
index 82d292c..f30dd21 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/MetadataAccessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/MetadataAccessor.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
@@ -707,7 +707,6 @@
 
     /**
      * Subclasses must handle this flag.
-     * @return
      */
     public abstract boolean isProcessed();
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/mappings/ElementCollectionAccessor.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/mappings/ElementCollectionAccessor.java
index 3a5c703..62e862e 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/mappings/ElementCollectionAccessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/mappings/ElementCollectionAccessor.java
@@ -497,7 +497,6 @@
      * INTERNAL:
      * Return the default table to hold the foreign key of a MapKey when
      * and Entity is used as the MapKey
-     * @return
      */
     @Override
     protected DatabaseTable getDefaultTableForEntityMapKey(){
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/mappings/ManyToManyAccessor.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/mappings/ManyToManyAccessor.java
index ed97c0d..311298f 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/mappings/ManyToManyAccessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/accessors/mappings/ManyToManyAccessor.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
@@ -98,7 +98,6 @@
      * INTERNAL:
      * Return the default table to hold the foreign key of a MapKey when
      * and Entity is used as the MapKey
-     * @return
      */
     @Override
     protected DatabaseTable getDefaultTableForEntityMapKey(){
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java
index 9f4c307..d9dd77d 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/listeners/JPAEntityListenerHolder.java
@@ -175,8 +175,6 @@
      * INTERNAL:
      * This returns a hashtable of methods which are used in a JPA EntityListener instance, built from
      * the MethodSerialImpl representation since Methods are not serializable
-     * @param loader
-     * @return
      */
     public Map<String,java.util.List<Method>> convertToMethods(ClassLoader loader) {
         Map<String,java.util.List<Method>> table = new ConcurrentHashMap<>();
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleArrayTypeMetadata.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleArrayTypeMetadata.java
index f9e7884..edb53d4 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleArrayTypeMetadata.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleArrayTypeMetadata.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
@@ -102,7 +102,6 @@
 
     /**
      * Indicates an instance of OracleArrayTypeMetadata.
-     * @return
      */
     @Override
     public boolean isOracleArrayTypeMetadata() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleComplexTypeMetadata.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleComplexTypeMetadata.java
index 5ca85f0..ff32d1b 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleComplexTypeMetadata.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleComplexTypeMetadata.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
@@ -110,7 +110,6 @@
 
     /**
      * Indicates an instance of OracleArrayTypeMetadata.
-     * @return
      */
     public boolean isOracleArrayTypeMetadata() {
         return false;
@@ -118,7 +117,6 @@
 
     /**
      * Indicates an instance of OracleObjectTypeMetadata.
-     * @return
      */
     public boolean isOracleObjectTypeMetadata() {
         return false;
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleObjectTypeMetadata.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleObjectTypeMetadata.java
index cb5fef9..8acf21a 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleObjectTypeMetadata.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/queries/OracleObjectTypeMetadata.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
@@ -130,7 +130,6 @@
 
     /**
      * Indicates an instance of OracleObjectTypeMetadata.
-     * @return
      */
     @Override
     public boolean isOracleObjectTypeMetadata() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/xml/XMLEntityMappingsReader.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/xml/XMLEntityMappingsReader.java
index 5c51c95..d235ecb 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/xml/XMLEntityMappingsReader.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metadata/xml/XMLEntityMappingsReader.java
@@ -325,7 +325,6 @@
      * eclipselink.orm.validate.schema is set to true or false.<br>
      * The default value is false.
      * @param properties - PersistenceUnitInfo properties on the project
-     * @return
      */
     private static boolean isORMSchemaValidationPerformed(Map properties) {
         // Get property from persistence.xml (we are not yet parsing sessions.xml)
@@ -391,11 +390,7 @@
 
     /**
      * INTERNAL:
-     * @param url
-     * @param classLoader
      * @param properties - PersistenceUnitInfo properties on the project
-     * @return
-     * @throws IOException
      */
     public static XMLEntityMappings read(URL url, ClassLoader classLoader, Properties properties) throws IOException {
         InputStreamReader reader1 = null;
@@ -430,8 +425,6 @@
      * will get the schema from the same classloader that loaded this class and
      * hence works for the case where the schema is shipped as part of EclipseLink
      *
-     * @param unmarshaller
-     * @param schema
      */
     private static void useLocalSchemaForUnmarshaller(XMLUnmarshaller unmarshaller, Schema schema) {
         try {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/AttributeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/AttributeImpl.java
index e0bf03a..a5f0b41 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/AttributeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/AttributeImpl.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
@@ -77,8 +77,6 @@
     /**
      * INTERNAL:
      *
-     * @param managedType
-     * @param mapping
      */
     protected AttributeImpl(ManagedTypeImpl<X> managedType, DatabaseMapping mapping) {
         this.mapping = mapping;
@@ -100,7 +98,6 @@
     /**
      * INTERNAL:
      * Return the Descriptor associated with this attribute
-     * @return
      */
     protected ClassDescriptor getDescriptor() {
         return getManagedTypeImpl().getDescriptor();
@@ -200,7 +197,6 @@
      * INTERNAL:
      * Return the managed type representing the type in which the member was
      * declared.
-     * @return
      */
     public ManagedTypeImpl<X> getManagedTypeImpl() {
         return this.managedType;
@@ -209,7 +205,6 @@
     /**
      * INTERNAL:
      * Return the databaseMapping that represents the type
-     * @return
      */
     public DatabaseMapping getMapping() {
         return this.mapping;
@@ -311,7 +306,6 @@
     /**
      * INTERNAL:
      * Return whether the attribute is plural or singular
-     * @return
      */
     public abstract boolean isPlural();
 }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/BasicTypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/BasicTypeImpl.java
index 1c51162..a634fcb 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/BasicTypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/BasicTypeImpl.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
@@ -56,7 +56,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an Entity (true) or MappedSuperclass (false) or Embeddable (false)
-     * @return
      */
     @Override
     public boolean isEntity() {
@@ -67,7 +66,6 @@
      * INTERNAL:
      * Return whether this type is identifiable.
      * This would be EntityType and MappedSuperclassType
-     * @return
      */
     @Override
     protected boolean isIdentifiableType() {
@@ -78,7 +76,6 @@
      * INTERNAL:
      * Return whether this type is identifiable.
      * This would be EmbeddableType as well as EntityType and MappedSuperclassType
-     * @return
      */
     @Override
     protected boolean isManagedType() {
@@ -88,7 +85,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an MappedSuperclass (true) or Entity (false) or Embeddable (false)
-     * @return
      */
     @Override
     public boolean isMappedSuperclass() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/CollectionAttributeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/CollectionAttributeImpl.java
index 588f1d9..b6b7db6 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/CollectionAttributeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/CollectionAttributeImpl.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
@@ -50,8 +50,6 @@
     /**
      * INTERNAL:
      * Construct an instance of Collection for the managed type managedType
-     * @param managedType
-     * @param mapping
      */
     protected CollectionAttributeImpl(ManagedTypeImpl<X> managedType, CollectionMapping mapping) {
         this(managedType, mapping, false);
@@ -60,9 +58,6 @@
     /**
      * INTERNAL:
      * Construct an instance of Collection for the managed type managedType
-     * @param managedType
-     * @param mapping
-     * @param validationEnabled
      */
     protected CollectionAttributeImpl(ManagedTypeImpl<X> managedType, CollectionMapping mapping, boolean validationEnabled) {
         super(managedType, mapping, validationEnabled);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/EmbeddableTypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/EmbeddableTypeImpl.java
index d9f72a6..bbc436e 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/EmbeddableTypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/EmbeddableTypeImpl.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
@@ -57,7 +57,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an Entity (true) or MappedSuperclass (false) or Embeddable (false)
-     * @return
      */
     @Override
     public boolean isEntity() {
@@ -67,7 +66,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an MappedSuperclass (true) or Entity (false) or Embeddable (false)
-     * @return
      */
     @Override
     public boolean isMappedSuperclass() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/EntityTypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/EntityTypeImpl.java
index 6d4bb51..5b1339b 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/EntityTypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/EntityTypeImpl.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
@@ -99,7 +99,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an Entity (true) or MappedSuperclass (false) or Embeddable (false)
-     * @return
      */
     @Override
     public boolean isEntity() {
@@ -109,7 +108,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an MappedSuperclass (true) or Entity (false) or Embeddable (false)
-     * @return
      */
     @Override
     public boolean isMappedSuperclass() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/IdentifiableTypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/IdentifiableTypeImpl.java
index 29a95be..0e779ca 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/IdentifiableTypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/IdentifiableTypeImpl.java
@@ -300,8 +300,6 @@
      * INTERNAL:
      * Return the version attribute on this type.
      * If no version attribute exists - return null.
-     * @param <Y>
-     * @return
      */
     private <Y> SingularAttribute<? super X, ?> getVersion() {
         if(hasVersionAttribute()) {
@@ -387,7 +385,6 @@
      * INTERNAL:
      * Return whether this type is identifiable.
      * This would be EntityType and MappedSuperclassType
-     * @return
      */
     @Override
     protected boolean isIdentifiableType() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ListAttributeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ListAttributeImpl.java
index 2190e6c..686d353 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ListAttributeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ListAttributeImpl.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
@@ -49,8 +49,6 @@
 
     /**
      * INTERNAL:
-     * @param managedType
-     * @param mapping
      */
     protected ListAttributeImpl(ManagedTypeImpl<X> managedType, CollectionMapping mapping) {
         super(managedType, mapping, false);
@@ -58,9 +56,6 @@
 
     /**
      *
-     * @param managedType
-     * @param mapping
-     * @param validationEnabled
      */
     protected ListAttributeImpl(ManagedTypeImpl<X> managedType, CollectionMapping mapping, boolean validationEnabled) {
         super(managedType, mapping, validationEnabled);
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ManagedTypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ManagedTypeImpl.java
index 9414514..2453cfe 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ManagedTypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/ManagedTypeImpl.java
@@ -416,9 +416,6 @@
     /**
      * INTERNAL:
      * Return an instance of a ManagedType based on the RelationalDescriptor parameter
-     * @param metamodel
-     * @param descriptor
-     * @return
      */
     protected static ManagedTypeImpl<?> create(MetamodelImpl metamodel, ClassDescriptor descriptor) {
         // Get the ManagedType property on the descriptor if it exists
@@ -659,7 +656,6 @@
     /**
      * INTERNAL:
      * Return the RelationalDescriptor associated with this ManagedType
-     * @return
      */
     public ClassDescriptor getDescriptor() {
         return this.descriptor;
@@ -833,7 +829,6 @@
     /**
      * INTERNAL:
      * Return the Map of AttributeImpl members keyed by String.
-     * @return
      */
     protected java.util.Map<String, Attribute<X, ?>> getMembers() {
         return this.members;
@@ -842,7 +837,6 @@
     /**
      * INTERNAL:
      * Return the Metamodel that this ManagedType is associated with.
-     * @return
      */
     protected MetamodelImpl getMetamodel() {
         return this.metamodel;
@@ -924,7 +918,6 @@
      *
      * @param targetPrimitiveOrWrapperClass (the type we are verifying against)
      * @param actualPrimitiveOrWrapperClass (the type that may be the autoboxed or primitive equal
-     * @return
      */
     private boolean isAutoboxedType(Class targetPrimitiveOrWrapperClass, Class actualPrimitiveOrWrapperClass) {
         BasicTypeHelperImpl typeHelper = BasicTypeHelperImpl.getInstance();
@@ -1112,9 +1105,6 @@
      * INTERNAL:
      * Handle the case where we were unable to determine the element type of the plural attribute.
      * Normally this function is never required and should have a code coverage of 0%.
-     * @param managedType
-     * @param collectionMapping
-     * @param validation
      */
     private AttributeImpl initializePluralAttributeTypeNotFound(ManagedTypeImpl managedType, CollectionMapping collectionMapping, boolean validation) {
         // default to List
@@ -1344,8 +1334,6 @@
      * INTERNAL:
      * Get the elementType directly from the class using a reflective method call
      * directly on the containing java class associated with this managedType.
-     * @param mapping
-     * @return
      */
     protected Class getTypeClassFromAttributeOrMethodLevelAccessor(DatabaseMapping mapping) {
         /**
@@ -1453,7 +1441,6 @@
      * INTERNAL:
      * Return whether this type is identifiable.
      * This would be EntityType and MappedSuperclassType
-     * @return
      */
     @Override
     protected boolean isIdentifiableType() {
@@ -1464,7 +1451,6 @@
      * INTERNAL:
      * Return whether this type is identifiable.
      * This would be EmbeddableType as well as EntityType and MappedSuperclassType
-     * @return
      */
     @Override
     protected boolean isManagedType() {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MapAttributeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MapAttributeImpl.java
index c123211..3f0af23 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MapAttributeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MapAttributeImpl.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
@@ -69,8 +69,6 @@
 
     /**
      * INTERNAL:
-     * @param managedType
-     * @param mapping
      */
     protected MapAttributeImpl(ManagedTypeImpl<X> managedType, CollectionMapping mapping) {
         this(managedType, mapping, false);
@@ -208,7 +206,6 @@
      * INTERNAL:
      * Default to the PK of the owning descriptor when no MapKey or MapKey:name attribute is specified.
      * Prerequisites: policy on the mapping is of type MappedKeyMapPolicy
-     * @return
      */
     private Class getOwningPKTypeWhenMapKeyAnnotationMissingOrDefaulted(MappedKeyMapContainerPolicy policy) {
         Class<?> javaClass = null;;
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MappedSuperclassTypeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MappedSuperclassTypeImpl.java
index 0e86b69..85be821 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MappedSuperclassTypeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/MappedSuperclassTypeImpl.java
@@ -68,7 +68,6 @@
     /**
      * INTERNAL:
      * Add an inheriting subclass to the map of Identifiable types that inherit from this mappedSuperclass.
-     * @param identifiableType
      */
     protected void addInheritingType(IdentifiableTypeImpl identifiableType) {
         // The Map will always be instantiated in the constructor
@@ -78,9 +77,6 @@
     /**
      * INTERNAL:
      * Return an instance of a MappedSuperclassType based on the RelationalDescriptor.
-     * @param metamodel
-     * @param relationalDescriptor
-     * @return
      */
     protected static MappedSuperclassTypeImpl<?> create(MetamodelImpl metamodel, ClassDescriptor relationalDescriptor) {
         MappedSuperclassTypeImpl<?> mappedSuperclassTypeImpl = new MappedSuperclassTypeImpl(metamodel, relationalDescriptor);
@@ -91,8 +87,6 @@
      * INTERNAL:
      *    MappedSuperclasses need special handling to get their type from an inheriting subclass.
      *    This function determines the type for an attribute by returning the same inherited attribute from a subclass
-     * @param name
-     * @return
      */
     public AttributeImpl getMemberFromInheritingType(String name) {
         AttributeImpl inheritedAttribute = null;
@@ -139,7 +133,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an Entity (true) or MappedSuperclass (false) or Embeddable (false)
-     * @return
      */
     @Override
     public boolean isEntity() {
@@ -149,7 +142,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an MappedSuperclass (true) or Entity (false) or Embeddable (false)
-     * @return
      */
     @Override
     public boolean isMappedSuperclass() {
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 f5f8713..a19199c 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
@@ -127,7 +127,6 @@
 
     /**
      * INTERNAL:
-     * @param emSetupImpl
      */
     public MetamodelImpl(EntityManagerSetupImpl emSetupImpl) {
         // Create a new Metamodel using the EclipseLink session on the EM
@@ -160,10 +159,6 @@
      * This may occur on certain configurations of Spring or on Java EE 6 Web Profile implementations that are not in compliance
      * with the specification.
      * See http://bugs.eclipse.org/338837
-     * @param aType
-     * @param clazz
-     * @param metamodelType
-     * @param metamodelTypeName
      */
     private void entityEmbeddableManagedTypeNotFound(Map typeMap, Object aType, Class clazz, String metamodelType, String metamodelTypeName) {
         // 338837: verify that the collection is not empty - this would mean entities did not make it into the search path
@@ -207,7 +202,6 @@
     /**
      * INTERNAL:
      * Return a List of all attributes for all ManagedTypes.
-     * @return
      */
     public List<Attribute> getAllManagedTypeAttributes() {
         List<Attribute> attributeList = new ArrayList<Attribute>();
@@ -254,7 +248,6 @@
     /**
      * INTERNAL:
      * Return the Set of MappedSuperclassType objects
-     * @return
      */
     public Set<MappedSuperclassTypeImpl<?>> getMappedSuperclasses() {
         return new LinkedHashSet<MappedSuperclassTypeImpl<?>>(this.mappedSuperclasses);
@@ -264,7 +257,6 @@
      * INTERNAL:
      * Return the core API Project associated with the DatabaseSession
      * that is associated with this Metamodel
-     * @return
      */
     public Project getProject() {
         return this.getSession().getProject();
@@ -272,7 +264,6 @@
     /**
      * INTERNAL:
      * Return the DatabaseSession associated with this Metamodel
-     * @return
      */
     protected AbstractSession getSession() {
         return this.session;
@@ -283,9 +274,6 @@
      * This function is a wrapper around a Map.put(K,V)<br>
      * We return a boolean that is unused but provides a way to add a
      * breakpoint for the false condition.
-     * @param javaClassKey
-     * @param typeValue
-     * @return
      */
     private boolean putType(String javaClassKey, TypeImpl typeValue) {
         boolean isValid = true;
@@ -304,8 +292,6 @@
      * If a type does not yet exist - one will be created and added to the Metamodel - this usually only for Basic types.<p>
      * This function will handle all Metamodel defined and core java classes.
      *
-     * @param javaClass
-     * @return
      */
     public <X> TypeImpl<X> getType(Class<X> javaClass) {
         // Return an existing matching type on the metamodel keyed on class name
@@ -332,7 +318,6 @@
      * INTERNAL:
      * Return the Map of types on this metamodel.
      * This includes all Entity, MappedSuperclass, Embeddable and Basic types
-     * @return
      */
     public Map<String, TypeImpl<?>> getTypes() {
         return types;
@@ -342,8 +327,6 @@
      * INTERNAL:
      * Return whether there is a descriptor that is keyed by the supplied class name.<p>
      * Referenced by ManagedTypeImpl.create()
-     * @param qualifiedClassNameKeyString
-     * @return
      */
     protected boolean hasMappedSuperclass(String qualifiedClassNameKeyString) {
         /**
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/PluralAttributeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/PluralAttributeImpl.java
index 9db85dc..7e3248b 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/PluralAttributeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/PluralAttributeImpl.java
@@ -61,9 +61,6 @@
     /**
      * INTERNAL:
      * Create an Attribute instance with a passed in validation flag (usually set to true only during Metamodel initialization)
-     * @param managedType
-     * @param mapping
-     * @param validationEnabled
      */
     protected PluralAttributeImpl(ManagedTypeImpl<X> managedType, CollectionMapping mapping, boolean validationEnabled) {
         super(managedType, mapping);
@@ -157,7 +154,6 @@
     /**
      * INTERNAL:
      * Return the mapping associated with this PluralAttribute.
-     * @return
      */
     public CollectionMapping getCollectionMapping() {
         return (CollectionMapping) getMapping();
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/SetAttributeImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/SetAttributeImpl.java
index 15c7365..7120f0d 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/SetAttributeImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/metamodel/SetAttributeImpl.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
@@ -49,8 +49,6 @@
 
     /**
      * INTERNAL:
-     * @param managedType
-     * @param mapping
      */
     protected SetAttributeImpl(ManagedTypeImpl<X> managedType, CollectionMapping mapping) {
         super(managedType, mapping, false);
@@ -58,9 +56,6 @@
 
     /**
      * INTERNAL:
-     * @param managedType
-     * @param mapping
-     * @param validationEnabled
      */
     protected SetAttributeImpl(ManagedTypeImpl<X> managedType, CollectionMapping mapping, boolean validationEnabled) {
         super(managedType, mapping, validationEnabled);
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 fb69f05..be6e9a7 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
@@ -63,8 +63,6 @@
 
     /**
      * Create an instance of the Attribute
-     * @param managedType
-     * @param mapping
      */
     protected SingularAttributeImpl(ManagedTypeImpl<X> managedType, DatabaseMapping mapping) {
         this(managedType, mapping, false);
@@ -72,9 +70,6 @@
     /**
      * INTERNAL:
      * Create an Attribute instance with a passed in validation flag (usually set to true only during Metamodel initialization)
-     * @param managedType
-     * @param mapping
-     * @param validationEnabled
      */
     protected SingularAttributeImpl(ManagedTypeImpl<X> managedType, DatabaseMapping mapping, boolean validationEnabled) {
         super(managedType, mapping);
@@ -175,7 +170,6 @@
     /**
      * INTERNAL:
      * Return whether the attribute is plural or singular
-     * @return
      */
     @Override
     public boolean isPlural() {
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 add57cb..518268f 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
@@ -115,7 +115,6 @@
     /**
      * INTERNAL:
      * Return whether this type is an Entity (true) or MappedSuperclass (false) or Embeddable (false)
-     * @return
      */
     public abstract boolean isEntity();
 
@@ -123,7 +122,6 @@
      * INTERNAL:
      * Return whether this type is identifiable.
      * This would be EntityType and MappedSuperclassType
-     * @return
      */
     protected abstract boolean isIdentifiableType();
 
@@ -131,14 +129,12 @@
      * INTERNAL:
      * Return whether this type is identifiable.
      * This would be EmbeddableType as well as EntityType and MappedSuperclassType
-     * @return
      */
     protected abstract boolean isManagedType();
 
     /**
      * INTERNAL:
      * Return whether this type is an MappedSuperclass (true) or Entity (false) or Embeddable (false)
-     * @return
      */
     public abstract boolean isMappedSuperclass();
 
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 79f59b4..7a1decb 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
@@ -321,7 +321,6 @@
      * Create a predicate corresponding to an all expression over the subquery
      * results.
      *
-     * @param subquery
      * @return all expression
      */
     @Override
@@ -333,7 +332,6 @@
      * Create a predicate corresponding to a some expression over the subquery
      * results. This is equivalent to an any expression.
      *
-     * @param subquery
      * @return all expression
      */
     @Override
@@ -345,7 +343,6 @@
      * Create a predicate corresponding to an any expression over the subquery
      * results. This is equivalent to a some expression.
      *
-     * @param subquery
      * @return any expression
      */
     @Override
@@ -1414,7 +1411,6 @@
     /**
      * Create an expression literal.
      *
-     * @param value
      * @return expression literal
      */
     @Override
@@ -1439,7 +1435,6 @@
     /**
      * Create an expression literal but without null validation.
      *
-     * @param value
      * @return expression literal
      */
     protected <T> Expression<T> internalLiteral(T value){
@@ -1464,7 +1459,6 @@
      *
      * @param paramClass
      *            parameter class
-     * @param name
      * @return parameter
      */
     @Override
@@ -1507,7 +1501,6 @@
     /**
      * Create an expression that tests the size of a collection.
      *
-     * @param collection
      * @return size expression
      */
     @Override
@@ -1604,7 +1597,6 @@
     /**
      * Create an expression that returns the values of a map.
      *
-     * @param map
      * @return collection expression
      */
     @Override
@@ -1615,7 +1607,6 @@
     /**
      * Create an expression that returns the keys of a map.
      *
-     * @param map
      * @return set expression
      */
     @Override
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 df2fa38..36ee56f 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
@@ -394,9 +394,6 @@
      *
      * Also sets the query result to ResultType.CONSTRUCTOR
      *
-     * @param class1
-     * @param selections
-     * @throws IllegalArgumentException
      */
     public void populateAndSetConstructorSelection(ConstructorSelectionImpl constructorSelection, Class<?> class1, Selection<?>... selections) throws IllegalArgumentException{
         Class[] constructorArgs = new Class[selections.length];
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 a0fbb47..a75a6a0 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
@@ -86,7 +86,6 @@
     /**
      * Apply a predicate to test whether the expression is a member
      * of the argument list.
-     * @param values
      * @return predicate testing for membership
      */
     @Override
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/ParameterExpressionImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/ParameterExpressionImpl.java
index ed61904..aadb30c 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/ParameterExpressionImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/querydef/ParameterExpressionImpl.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
@@ -62,7 +62,6 @@
 
     /**
      * Returns the name used by EclipseLink when a name has not been assigned by the user.
-     * @return
      */
     public String getInternalName(){
         return this.internalName;
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 bd8c8f1..2a5a08f 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
@@ -484,7 +484,6 @@
     /**
      * Apply a predicate to test whether the expression is a member
      * of the argument list.
-     * @param values
      * @return predicate testing for membership
      */
     @Override
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/transaction/EntityTransactionImpl.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/transaction/EntityTransactionImpl.java
index bdf10af..a7d8468 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/transaction/EntityTransactionImpl.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/transaction/EntityTransactionImpl.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
@@ -69,7 +69,6 @@
      * manager will be added here. On rollback or commit any left over open
      * queries should be closed.
      *
-     * @param query
      */
     public void addOpenQuery(QueryImpl query) {
         if (openQueriesMap == null) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/AbstractStaticWeaveOutputHandler.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/AbstractStaticWeaveOutputHandler.java
index f7a9c70..83451d1 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/AbstractStaticWeaveOutputHandler.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/AbstractStaticWeaveOutputHandler.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,31 +29,22 @@
 
     /**
      * create directory into target directory, or insert directory entry into outputstream.
-     * @param dirPath
-     * @throws IOException
      */
     abstract public void addDirEntry(String dirPath)throws IOException;
 
     /**
      * Write entry bytes into target, this is usually called if class has been tranformed
-     * @param targetEntry
-     * @param entryBytes
-     * @throws IOException
      */
     abstract public void addEntry(JarEntry targetEntry,byte[] entryBytes)throws IOException;
 
     /**
      * Write entry into target, this method usually copy original class into target.
-     * @param jis
-     * @param entry
-     * @throws IOException
      */
     abstract public void addEntry(InputStream jis,JarEntry entry) throws IOException,URISyntaxException;
 
 
     /**
      * Close the output stream.
-     * @throws IOException
      */
     public void closeOutputStream() throws IOException {
         if(outputStreamHolder!=null){
@@ -63,7 +54,6 @@
 
     /**
      * Get the ouput stream instance.
-     * @return
      */
     public JarOutputStream getOutputStream(){
         return this.outputStreamHolder;
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/ClassDetails.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/ClassDetails.java
index cb3d270..568db7e 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/ClassDetails.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/ClassDetails.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,8 +178,6 @@
      * INTERNAL:
      * Search the list of virtualAccessMethods for a VirtualAttributeMethodInfo with the given
      * getMethodName.  Return the VirtualAttributeMethodInfo if there is one, else return null
-     * @param getMethodName
-     * @return
      */
     public VirtualAttributeMethodInfo getInfoForVirtualGetMethod(String getMethodName){
         Iterator<VirtualAttributeMethodInfo> i = virtualAccessMethods.iterator();
@@ -196,8 +194,6 @@
      * INTERNAL:
      * Search the list of virtualAccessMethods for a VirtualAttributeMethodInfo with the given
      * setMethodName.  Return the VirtualAttributeMethodInfo if there is one, else return null
-     * @param setMethodName
-     * @return
      */
     public VirtualAttributeMethodInfo getInfoForVirtualSetMethod(String setMethodName){
         Iterator<VirtualAttributeMethodInfo> i = virtualAccessMethods.iterator();
@@ -218,7 +214,6 @@
      * Return the name of the most direct superclass that has a direct implementation of
      * a clone method.
      * If there is not one, return null
-     * @return
      */
     public String getNameOfSuperclassImplementingCloneMethod(){
         if (superClassDetails == null){
@@ -317,8 +312,6 @@
      *
      * Assume java.lang.Object is in the hierarchy
      *
-     * @param className
-     * @return
      */
     public boolean isInMetadataHierarchy(String className){
         if (className.equals(Object.class.getName().replace('.', '/'))){
@@ -340,8 +333,6 @@
      *
      * Assume java.lang.Object is in the hierarchy
      *
-     * @param className
-     * @return
      */
     public boolean isInSuperclassHierarchy(String className){
         if (className.equals(Object.class.getName().replace('.', '/'))){
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/StaticWeaveDirectoryOutputHandler.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/StaticWeaveDirectoryOutputHandler.java
index 4f57f21..1dc64bd 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/StaticWeaveDirectoryOutputHandler.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/StaticWeaveDirectoryOutputHandler.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,8 +38,6 @@
 
     /**
      * Construct an instance of StaticWeaveDirectoryOutputHandler.
-     * @param source
-     * @param target
      */
     public StaticWeaveDirectoryOutputHandler(URL source,URL target){
         this.source=source;
@@ -47,8 +45,6 @@
     }
     /**
      * create directory into target directory.
-     * @param dirPath
-     * @throws IOException
      */
     @Override
     public void addDirEntry(String dirPath)throws IOException {
@@ -63,9 +59,6 @@
 
     /**
      * Write entry bytes into target, this method is usually invoked  if class has been tranformed
-     * @param targetEntry
-     * @param entryBytes
-     * @throws IOException
      */
     @Override
     public void addEntry(JarEntry targetEntry,byte[] entryBytes)throws IOException{
@@ -87,9 +80,6 @@
 
     /**
      * Write entry into target, this method usually copy original class into target.
-     * @param jis
-     * @param entry
-     * @throws IOException
      */
     @Override
     public void addEntry(InputStream jis,JarEntry entry) throws IOException,URISyntaxException {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/StaticWeaveJAROutputHandler.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/StaticWeaveJAROutputHandler.java
index ae993e3..a675c5d 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/StaticWeaveJAROutputHandler.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/internal/jpa/weaving/StaticWeaveJAROutputHandler.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,6 @@
 
     /**
      * Construct an instance of StaticWeaveJAROutputHandler
-     * @param outputStreamHolder
      */
     public StaticWeaveJAROutputHandler(JarOutputStream outputStreamHolder){
         super.outputStreamHolder=outputStreamHolder;
@@ -36,8 +35,6 @@
 
     /**
      * Add directory entry into outputstream.
-     * @param dirPath
-     * @throws IOException
      */
     @Override
     public void addDirEntry(String dirPath)throws IOException {
@@ -47,9 +44,6 @@
 
     /**
      * Write entry bytes into target, this method is usually called if class has been tranformed
-     * @param targetEntry
-     * @param entryBytes
-     * @throws IOException
      */
     @Override
     public void addEntry(JarEntry targetEntry,byte[] entryBytes)throws IOException{
@@ -62,9 +56,6 @@
 
     /**
      * Write entry into target, this method usually copy original class into target.
-     * @param jis
-     * @param entry
-     * @throws IOException
      */
     @Override
     public void addEntry(InputStream jis,JarEntry entry) throws IOException,URISyntaxException {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/ArchiveFactory.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/ArchiveFactory.java
index d44b2ef..26f9fa8 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/ArchiveFactory.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/ArchiveFactory.java
@@ -33,8 +33,6 @@
     /**
      * Return an instance of an implementer of Archive that can process the URL provided
      *
-     * @throws URISyntaxException
-     * @throws IOException
      */
     Archive createArchive(URL rootUrl, Map properties) throws URISyntaxException, IOException;
 
@@ -43,8 +41,6 @@
      * This instance will allow access to the persistence descriptor associated with
      * this archive through the getDescriptorStream() method
      *
-     * @throws URISyntaxException
-     * @throws IOException
      */
     Archive createArchive(URL rootUrl, String descriptorLocation, Map properties) throws URISyntaxException, IOException;
 }
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
index a70e567..4969912 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/JpaEntityManagerFactory.java
@@ -58,7 +58,6 @@
      * This method will return a version of EntityManagerFactory that is
      * based on the available metadata at the time it is called.  Future calls
      * to refresh will not affect that metadata on this EntityManagerFactory.
-     * @return
      */
     EntityManagerFactoryDelegate unwrap();
 
@@ -66,7 +65,6 @@
      * As this EntityManagerFactory to refresh itself.  This will cause the
      * underlying EntityManagerFactory implementation to be dropped and a new one
      * to be bootstrapped.  Existing EntityManagers will continue to use the old implementation
-     * @param properties
      */
     void refreshMetadata(Map<String, Object> properties);
 
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/PersistenceProvider.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/PersistenceProvider.java
index 0e0d4e2..2b9ea20 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/PersistenceProvider.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/PersistenceProvider.java
@@ -268,9 +268,6 @@
      * Return JPAInitializer corresponding to the passed classLoader.
      * Note: This is written as an instance method rather than a static to allow
      * it to be overridden
-     * @param emName
-     * @param m
-     * @return
      */
     public JPAInitializer getInitializer(String emName, Map m){
         ClassLoader classLoader = getClassLoader(emName, m);
@@ -425,7 +422,6 @@
      * a reference to an attribute value, as this could trigger the
      * loading of entity state if the entity has been provided by a
      * different provider.
-     * @param entity
      * @param attributeName  name of attribute whose load status is
      *        to be determined
      * @return load status of the attribute
@@ -455,7 +451,6 @@
      * attribute state will have already been determined by
      * <code>isLoadedWithoutReference</code>. )
      *
-     * @param entity
      * @param attributeName  name of attribute whose load status is
      *        to be determined
      * @return load status of the attribute
@@ -512,7 +507,6 @@
      * If a classloader is not found in the properties map then
      * use the current thread classloader.
      *
-     * @param properties
      * @return ClassLoader
      */
     public ClassLoader getClassLoader(String emName, Map properties) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/metadata/XMLMetadataSource.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/metadata/XMLMetadataSource.java
index 571ebf2..b6b9493 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/metadata/XMLMetadataSource.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/jpa/metadata/XMLMetadataSource.java
@@ -55,8 +55,6 @@
      * resource from the classloader.
      * It will throw a ValidationException if no reader can be returned.
      *
-     * @param properties
-     * @param classLoader
      * @param log - SessionLog used for status messages.
      * @return Reader - a InputStreamReader with data in the form of an EclipseLink-orm.xml
      *
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveAntTask.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveAntTask.java
index 877ab0a..cc33c0d 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveAntTask.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveAntTask.java
@@ -185,7 +185,6 @@
 
     /**
      * Verify the value of attributes.
-     * @throws BuildException
      */
     private void verifyOptions() throws BuildException {
        if (source==null) {
diff --git a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveProcessor.java b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveProcessor.java
index 168a263..55861e1 100644
--- a/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveProcessor.java
+++ b/jpa/org.eclipse.persistence.jpa/src/main/java/org/eclipse/persistence/tools/weaving/jpa/StaticWeaveProcessor.java
@@ -65,7 +65,6 @@
      * Constructs an instance of StaticWeaveProcessor
      * @param source the name of the location to be weaved
      * @param target the name of the location to be weaved to
-     * @throws MalformedURLException
      */
     public StaticWeaveProcessor(String source, String target)throws MalformedURLException{
         if (source != null) {
@@ -80,7 +79,6 @@
      * Constructs an instance of StaticWeaveProcessor
      * @param source the File object of the source to be weaved
      * @param target the File object of the target to be weaved to
-     * @throws MalformedURLException
      */
     public StaticWeaveProcessor(File source, File target)throws MalformedURLException {
         this.source=source.toURL();
@@ -147,7 +145,6 @@
     /**
      * Set a specific location to look for persistence.xml
      * by default we will look in META-INF/persistence.xml
-     * @param persistenceXMLLocation
      */
     public void setPersistenceXMLLocation(String persistenceXMLLocation) {
         this.persistenceXMLLocation = persistenceXMLLocation;
diff --git a/jpa/org.eclipse.persistence.jpars/pom.xml b/jpa/org.eclipse.persistence.jpars/pom.xml
index 6ec0e5d..9f55305 100644
--- a/jpa/org.eclipse.persistence.jpars/pom.xml
+++ b/jpa/org.eclipse.persistence.jpars/pom.xml
@@ -30,6 +30,10 @@
     </parent>
 
     <properties>
+        <comp.xlint>-Xlint:all</comp.xlint>
+        <comp.xdoclint>-Xdoclint:all,-missing</comp.xdoclint>
+        <comp.test.xlint>-Xlint:all</comp.test.xlint>
+
         <!--Properties used for test resources filtering/replacement-->
         <!--DB connection properties-->
         <db_user>${db.user}</db_user>
@@ -122,6 +126,15 @@
             </plugin>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <arg>-Werror</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
                     <skip>true</skip>
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JAXBSchemaOutputResolver.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JAXBSchemaOutputResolver.java
index 8214293..955637d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JAXBSchemaOutputResolver.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/JAXBSchemaOutputResolver.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,6 @@
      * This constructor sets the underlying SchemaOutputResolver to be used
      * during createOutput operation.
      *
-     * @param outputResolver
      */
     public JAXBSchemaOutputResolver(SchemaOutputResolver outputResolver) {
         this.outputResolver = outputResolver;
@@ -43,10 +42,7 @@
      * Determines the location where a given schema file (of the given namespace URI)
      * will be generated, and return it as a Result object.
      *
-     * @param namespaceURI
-     * @param suggestedFileName
      * @return schema file as a Result object
-     * @throws java.io.IOException
      */
     @Override
     public Result createOutput(String namespaceURI, String suggestedFileName) throws IOException {
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 8647016..05ead14 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
@@ -45,8 +45,6 @@
      * well as the classloader that will be used to load the associated class
      * during initialization.
      *
-     * @param parameterTypeAsString
-     * @param loader
      */
     public JAXBSetMethodAttributeAccessor(String parameterTypeAsString, ClassLoader loader) {
         this.parameterTypeAsString = parameterTypeAsString;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/SessionEventListener.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/SessionEventListener.java
index 880eead..dd29e1e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/SessionEventListener.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/internal/jaxb/SessionEventListener.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -49,7 +49,6 @@
      * Indicates if each descriptor's instantiation policy should be validated
      * during initialization.
      *
-     * @param value
      * @see InstantiationPolicy
      * @see org.eclipse.persistence.oxm.XMLDescriptor
      */
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 2eb1aa2..b02d422 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
@@ -70,7 +70,6 @@
      * This constructor takes the XmlAdapter class to be used with this
      * converter.
      *
-     * @param xmlAdapterClass
      */
     public XMLJavaTypeConverter(Class xmlAdapterClass) {
         setXmlAdapterClass(xmlAdapterClass);
@@ -80,7 +79,6 @@
      * This constructor takes an adapter class name.  The adapter
      * class will be loaded during initialization.
      *
-     * @param xmlAdapterClassName
      */
     public XMLJavaTypeConverter(String xmlAdapterClassName) {
         this.xmlAdapterClassName = xmlAdapterClassName;
@@ -93,8 +91,6 @@
      * the schema type, then from that type to the bound type.  The opposite
      * will occur during marshal.
      *
-     * @param xmlAdapterClass
-     * @param schemaType
      */
     public XMLJavaTypeConverter(Class xmlAdapterClass, QName schemaType) {
         setSchemaType(schemaType);
@@ -108,8 +104,6 @@
      * type will be converted to the schema type, then from that type to the
      * bound type.  The opposite will occur during marshal.
      *
-     * @param xmlAdapterClassName
-     * @param schemaType
      */
     public XMLJavaTypeConverter(String xmlAdapterClassName, QName schemaType) {
         setSchemaType(schemaType);
@@ -231,8 +225,6 @@
      * either create an instance of the XmlAdapter, or if an instance is set
      * on the marshaller, use it.
      *
-     * @param mapping
-     * @param session
      */
     @Override
     public void initialize(DatabaseMapping mapping, Session session) {
@@ -322,7 +314,6 @@
     /**
      * Set the XmlAdapter class to be used with this converter.
      *
-     * @param xmlAdapterClass
      */
     public void setXmlAdapterClass(Class xmlAdapterClass) {
         this.xmlAdapterClass = xmlAdapterClass;
@@ -331,7 +322,6 @@
     /**
      * Set the XmlAdapter class to be used with this converter.
      *
-     * @param xmlAdapterClassName
      */
     public void setXmlAdapterClassName(String xmlAdapterClassName) {
         this.xmlAdapterClassName = xmlAdapterClassName;
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 dca1c3f..8b8e83b 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
@@ -307,8 +307,6 @@
      * simple type (a single direct mapping with xpath of text) then the name of the simple type is returned.
      * Otherwise null is returned.
      *
-     * @param properties
-     * @param descriptor
      * @return null for a complex type, the simple type name for a simple type.
      */
     private JsonType populateProperties(Map<String, Property> properties, XMLDescriptor descriptor) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/IDResolver.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/IDResolver.java
index 38da35b..2bda33f 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/IDResolver.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/IDResolver.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,7 +44,6 @@
      *
      * @param eventHandler Any errors encountered during the unmarshal process should be reported to this handler.
      *
-     * @throws SAXException
      */
     public void startDocument(ValidationEventHandler eventHandler) throws SAXException {}
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBBeanValidator.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBBeanValidator.java
index b918eb4..10d633b 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBBeanValidator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBBeanValidator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2015, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2015, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -265,7 +265,6 @@
      *
      * @param value Object to be validated.
      * @param groups Target groups as per BV spec. If null {@link #DEFAULT_GROUP_ARRAY} is used.
-     * @throws BeanValidationException {@link BeanValidationException#constraintViolation}
      */
     void validate(Object value, Class<?>... groups) throws BeanValidationException {
         Class<?>[] grp = groups;
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 a965cb4..89eaca7 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
@@ -301,7 +301,6 @@
      * not affect instances of Binder.  To get the new metadata you must create
      * a new instance of Binder after the refresh metadata call has been made.</li>
      * </ul>
-     * @throws jakarta.xml.bind.JAXBException
      */
     public void refreshMetadata() throws jakarta.xml.bind.JAXBException {
         JAXBContextState newState = newContextState();
@@ -784,7 +783,6 @@
     /**
      * Returns true if any Object in this context contains a property annotated with an XmlAttachmentRef
      * annotation.
-     * @return
      */
     public boolean hasSwaRef() {
         return contextState.getGenerator().getAnnotationsProcessor().hasSwaRef();
@@ -1606,7 +1604,7 @@
                 // initialize each callback in the map
                 ClassLoader classLoader = getXMLContext().getSession(0).getDatasourcePlatform().getConversionManager().getLoader();
                 for (Object o : generator.getMarshalCallbacks().keySet()) {
-                    MarshalCallback cb = (MarshalCallback) generator.getMarshalCallbacks().get(o);
+                    MarshalCallback cb = generator.getMarshalCallbacks().get(o);
                     cb.initialize(classLoader);
                 }
                 marshaller.setMarshalCallbacks(generator.getMarshalCallbacks());
@@ -1641,7 +1639,7 @@
                 // initialize each callback in the map
                 ClassLoader classLoader = getXMLContext().getSession(0).getDatasourcePlatform().getConversionManager().getLoader();
                 for (Object o : generator.getUnmarshalCallbacks().keySet()) {
-                    UnmarshalCallback cb = (UnmarshalCallback) generator.getUnmarshalCallbacks().get(o);
+                    UnmarshalCallback cb = generator.getUnmarshalCallbacks().get(o);
                     cb.initialize(classLoader);
                 }
                 unmarshaller.setUnmarshalCallbacks(generator.getUnmarshalCallbacks());
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContextFactory.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContextFactory.java
index a03771b..ccfcbcf 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContextFactory.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBContextFactory.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
@@ -277,8 +277,6 @@
      *
      * @param originalBindings Map of bindings to be updated
      * @param bindingHandle handle to bindings file
-     * @param classLoader
-     * @return
      */
     private static Map<String, List<XmlBindings>> processBindingFile(Map<String, List<XmlBindings>> originalBindings, Object bindingHandle, ClassLoader classLoader, Map<String, Object> properties) {
         XmlBindings binding = getXmlBindings(bindingHandle, classLoader, properties);
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBErrorHandler.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBErrorHandler.java
index d7e52c9..65d4541 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBErrorHandler.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBErrorHandler.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
@@ -37,7 +37,6 @@
 
     /**
      * Create a new JAXBErrorHandler with the specified ValidationEventHandler
-     * @param validationEventHandler
      */
     public JAXBErrorHandler(ValidationEventHandler validationEventHandler) {
         super();
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBHelper.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBHelper.java
index 292ee9a..7690cdd 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBHelper.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBHelper.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,9 +38,6 @@
      * an instance of {@link org.eclipse.persistence.jaxb.JAXBContext}. If not, an exception will be
      * thrown.
      *
-     * @param jaxbContext
-     * @return
-     * @throws IllegalArgumentException
      */
     public static JAXBContext getJAXBContext(jakarta.xml.bind.JAXBContext jaxbContext) throws IllegalArgumentException {
         try {
@@ -56,9 +53,6 @@
      * be an instance of {@link org.eclipse.persistence.jaxb.JAXBUnmarshaller}. If not, an exception
      * will be thrown.
      *
-     * @param jaxbUnmarshaller
-     * @return
-     * @throws IllegalArgumentException
      */
     public static JAXBUnmarshaller getUnmarshaller(jakarta.xml.bind.Unmarshaller jaxbUnmarshaller) throws IllegalArgumentException {
         try {
@@ -74,9 +68,6 @@
      * instance of {@link org.eclipse.persistence.jaxb.JAXBMarshaller}. If not, an exception will be
      * thrown.
      *
-     * @param jaxbMarshaller
-     * @return
-     * @throws IllegalArgumentException
      */
     public static JAXBMarshaller getMarshaller(jakarta.xml.bind.Marshaller jaxbMarshaller) throws IllegalArgumentException {
         try {
@@ -92,9 +83,6 @@
      * instance of {@link org.eclipse.persistence.jaxb.JAXBBinder}. If not, an exception will be
      * thrown.
      *
-     * @param jaxbBinder
-     * @return
-     * @throws IllegalArgumentException
      */
     public static JAXBBinder getBinder(jakarta.xml.bind.Binder jaxbBinder) throws IllegalArgumentException {
         try {
@@ -111,13 +99,8 @@
      * EclipseLink JAXBContext, and clazz is one of org.eclipse.persistence.jaxb.JAXBContext or
      * org.eclipse.persistence.oxm.XMLContext.
      *
-     * @param <T>
-     * @param jaxbContext
-     * @param clazz
-     * @return
      * @see org.eclipse.persistence.jaxb.JAXBContext
      * @see org.eclipse.persistence.oxm.XMLContext
-     * @throws IllegalArgumentException
      */
     public static <T> T unwrap(jakarta.xml.bind.JAXBContext jaxbContext, Class<T> clazz) throws IllegalArgumentException {
         try {
@@ -142,13 +125,8 @@
      * instance of EclipseLink JAXBUnmarshaller, and clazz is one of
      * org.eclipse.persistence.jaxb.JAXBUnmarshaller or org.eclipse.persistence.oxm.XMLUnmarshaller.
      *
-     * @param <T>
-     * @param jaxbUnmarshaller
-     * @param clazz
-     * @return
      * @see org.eclipse.persistence.jaxb.JAXBUnmarshaller
      * @see org.eclipse.persistence.oxm.XMLUnmarshaller
-     * @throws IllegalArgumentException
      */
     public static <T> T unwrap(jakarta.xml.bind.Unmarshaller jaxbUnmarshaller, Class<T> clazz) throws IllegalArgumentException {
         try {
@@ -173,13 +151,8 @@
      * of EclipseLink JAXBMarshaller, and clazz is one of
      * org.eclipse.persistence.jaxb.JAXBMarshaller or org.eclipse.persistence.oxm.XMLMarshaller.
      *
-     * @param <T>
-     * @param jaxbMarshaller
-     * @param clazz
-     * @return
      * @see org.eclipse.persistence.jaxb.JAXBMarshaller
      * @see org.eclipse.persistence.oxm.XMLMarshaller
-     * @throws IllegalArgumentException
      */
     public static <T> T unwrap(jakarta.xml.bind.Marshaller jaxbMarshaller, Class<T> clazz) throws IllegalArgumentException {
         try {
@@ -204,13 +177,8 @@
      * EclipseLink JAXBBinderr, and clazz is one of org.eclipse.persistence.jaxb.JAXBinder or
      * org.eclipse.persistence.oxm.XMLBinder.
      *
-     * @param <T>
-     * @param jaxbBinder
-     * @param clazz
-     * @return
      * @see org.eclipse.persistence.jaxb.JAXBBinder
      * @see org.eclipse.persistence.oxm.XMLBinder
-     * @throws IllegalArgumentException
      */
     public static <T> T unwrap(jakarta.xml.bind.Binder jaxbBinder, Class<T> clazz) throws IllegalArgumentException {
         try {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshaller.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshaller.java
index 1a8faf9..8e81fbb 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshaller.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBMarshaller.java
@@ -159,8 +159,6 @@
      * while the marshal operation is performed by TopLink OXM. This will avoid
      * adding any runtime dependencies to TopLink.
      *
-     * @param elt
-     * @return
      */
     private Root createXMLRootFromJAXBElement(JAXBElement elt) {
         // create an XMLRoot to hand into the marshaller
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshaller.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshaller.java
index c590cee..8351fe1 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshaller.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBUnmarshaller.java
@@ -258,8 +258,6 @@
      * using the object's descriptor default root element - any
      * prefix will be resolved, and a QName created.
      *
-     * @param obj
-     * @return
      */
     private JAXBElement buildJAXBElementFromObject(Object obj, Class declaredClass) {
         // if an XMLRoot was returned, the root element != the default root
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBValidator.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBValidator.java
index b0b2aa4..a3bee28 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBValidator.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/JAXBValidator.java
@@ -33,7 +33,6 @@
      * DefaultValidationEventHandlervalidation instance, and sets the
      * XMLMarshaller instance to the one provided.
      *
-     * @param newValidator
      */
     public JAXBValidator(XMLValidator newValidator) {
         super();
@@ -46,7 +45,6 @@
      *
      * @param rootObject - the root object to be validated
      * @return true if a valid root object, false otherwise
-     * @throws JAXBException
      */
     public boolean validateRoot(Object rootObject) throws JAXBException {
         if (rootObject == null) {
@@ -65,7 +63,6 @@
      *
      * @param object - the object to be validated
      * @return true if a valid object, false otherwise
-     * @throws JAXBException
      */
     public boolean validate(Object object) throws JAXBException {
         if (object == null) {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/TypeMappingInfo.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/TypeMappingInfo.java
index 5c158fb..bd90fa2 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/TypeMappingInfo.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/TypeMappingInfo.java
@@ -63,7 +63,6 @@
 
     /**
      * Return if the global element will be marked as nillable
-     * @return
      */
     public boolean isNillable() {
         return nillable;
@@ -71,7 +70,6 @@
 
     /**
      * Set if the global element should be marked as nillable
-     * @param nillable
      */
     public void setNillable(boolean nillable) {
         this.nillable = nillable;
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 484f163..6fd7c97 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
@@ -1674,7 +1674,7 @@
                     JavaClass newType =helper.getJavaClass(element.type());
                     if(!originalType.getName().equals(newType.getName())){
                         property.setTyped(true);
-                        property.setSchemaType((QName) helper.getXMLToJavaTypeMap().get(newType.getName()));
+                        property.setSchemaType(helper.getXMLToJavaTypeMap().get(newType.getName()));
                     }
                     property.setType(newType);
                 }
@@ -1930,7 +1930,7 @@
             return properties;
         }
 
-        for (JavaField javaField : (Iterable<JavaField>) cls.getDeclaredFields()) {
+        for (JavaField javaField : cls.getDeclaredFields()) {
             Property property = null;
             int modifiers = javaField.getModifiers();
 
@@ -3331,7 +3331,7 @@
         }
         info.setRestrictionBase(restrictionBase);
 
-        for (JavaField field : (Iterable<JavaField>) javaClass.getDeclaredFields()) {
+        for (JavaField field : javaClass.getDeclaredFields()) {
             if (field.isEnumConstant()) {
                 Object enumValue = field.getName();
                 if (helper.isAnnotationPresent(field, XmlEnumValue.class)) {
@@ -3365,7 +3365,7 @@
         // check user defined types first
         QName schemaType = userDefinedSchemaTypes.get(javaClass.getQualifiedName());
         if (schemaType == null) {
-            schemaType = (QName) helper.getXMLToJavaTypeMap().get(javaClass.getRawName());
+            schemaType = helper.getXMLToJavaTypeMap().get(javaClass.getRawName());
         }
         return schemaType;
     }
@@ -4358,7 +4358,7 @@
             }
 
             if (componentClass.isPrimitive() || helper.isBuiltInJavaType(componentClass)) {
-                qName = (QName) helper.getXMLToJavaTypeMap().get(componentClass.getQualifiedName());
+                qName = helper.getXMLToJavaTypeMap().get(componentClass.getQualifiedName());
                 if(null != qName) {
                     packageName = ARRAY_PACKAGE_NAME;
                     qualifiedClassName = ARRAY_PACKAGE_NAME + DOT_CHR + qName.getLocalPart() + ARRAY_CLASS_NAME_SUFFIX;
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 e7fcb90..350f270 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
@@ -314,9 +314,6 @@
      * unmarshal the Element. This assumes that the Element represents an
      * xml-element to be unmarshalled.
      *
-     * @param xmlElementNode
-     * @param classLoader
-     * @return
      */
     static org.eclipse.persistence.jaxb.xmlmodel.XmlElement getXmlElement(org.w3c.dom.Element xmlElementNode, ClassLoader classLoader) {
         try {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/ElementDeclaration.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/ElementDeclaration.java
index 72ee9d9..7436c29 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/ElementDeclaration.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/ElementDeclaration.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
@@ -151,7 +151,6 @@
     }
     /**
      * Return if the global element will be marked as nillable
-     * @return
      */
     public boolean isNillable() {
         return nillable;
@@ -159,7 +158,6 @@
 
     /**
      * Set if the global element should be marked as nillable
-     * @param nillable
      */
     public void setNillable(boolean nillable) {
         this.nillable = nillable;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/EnumTypeInfo.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/EnumTypeInfo.java
index b671469..5a8dc18 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/EnumTypeInfo.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/EnumTypeInfo.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
@@ -43,8 +43,8 @@
 
     public EnumTypeInfo(Helper helper, JavaClass javaClass) {
         super(helper, javaClass);
-        m_fieldNames = new ArrayList<String>();
-        m_xmlEnumValues = new ArrayList<Object>();
+        m_fieldNames = new ArrayList<>();
+        m_xmlEnumValues = new ArrayList<>();
     }
 
     @Override
@@ -71,8 +71,6 @@
     /**
      * Add a Java field name to XmlEnumValue pair.
      *
-     * @param fieldName
-     * @param xmlEnumValue
      */
     public void addJavaFieldToXmlEnumValuePair(String fieldName, Object xmlEnumValue) {
         m_fieldNames.add(fieldName);
@@ -85,9 +83,6 @@
      * 'override' will typically be used when performing overrides via XML metadata
      * in XmlProcessor.
      *
-     * @param override
-     * @param fieldName
-     * @param xmlEnumValue
      */
     public void addJavaFieldToXmlEnumValuePair(boolean override, String fieldName, Object xmlEnumValue) {
         if (!override) {
@@ -117,8 +112,6 @@
      * Return the index in the fieldNames List for a given Java field
      * name, or -1 if it doesn't exist.
      *
-     * @param fieldName
-     * @return
      */
     private int getIndexForJavaField(String fieldName) {
         for (int i=0; i<m_fieldNames.size(); i++) {
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 1ecdd16..5f7ec6c 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
@@ -28,7 +28,6 @@
 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;
@@ -45,8 +44,6 @@
 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;
 
 /**
@@ -82,7 +79,6 @@
      * This constructor creates a Helper using the JavaModelInput
      * instance's JavaModel. Annotations are processed here as well.
      *
-     * @param jModelInput
      */
     public Generator(JavaModelInput jModelInput) {
         helper = new Helper(jModelInput.getJavaModel());
@@ -100,9 +96,7 @@
      * If xmlBindings is null or empty, AnnotationsProcessor will be used to process
      * annotations as per usual.
      *
-     * @param jModelInput
      * @param xmlBindings map of XmlBindings keyed on package name
-     * @param cLoader
      */
     public Generator(JavaModelInput jModelInput, Map<String, XmlBindings> xmlBindings, ClassLoader cLoader, String defaultTargetNamespace, boolean enableXmlAccessorFactory) {
         helper = new Helper(jModelInput.getJavaModel());
@@ -124,7 +118,6 @@
      * instance's JavaModel and a map of javaclasses that were generated from Type objects.
      * Annotations are processed here as well.
      *
-     * @param jModelInput
      */
     public Generator(JavaModelInput jModelInput, TypeMappingInfo[] typeMappingInfos, JavaClass[] javaClasses, Map<Type, TypeMappingInfo> typeToTypeMappingInfo, String defaultTargetNamespace) {
         helper = new Helper(jModelInput.getJavaModel());
@@ -144,14 +137,7 @@
      * If xmlBindings is null or empty, AnnotationsProcessor will be used to process
      * annotations as per usual.
      *
-     * @param jModelInput
-     * @param defaultTargetNamespace
-     * @param enableXmlAccessorFactory
-     * @param javaClasses
-     * @param typeMappingInfos
-     * @param typeToTypeMappingInfo
      * @param xmlBindings map of XmlBindings keyed on package name
-     * @param cLoader
      */
     public Generator(JavaModelInput jModelInput, TypeMappingInfo[] typeMappingInfos, JavaClass[] javaClasses, Map<Type, TypeMappingInfo> typeToTypeMappingInfo, Map<String, XmlBindings> xmlBindings, ClassLoader cLoader, String defaultTargetNamespace, boolean enableXmlAccessorFactory) {
         helper = new Helper(jModelInput.getJavaModel());
@@ -238,7 +224,7 @@
         java.util.Collection<Schema> schemas = schemaGenerator.getAllSchemas();
         // make sure that schemas will be passed to the output in specified order
         if (schemas instanceof List) {
-            ((List)schemas).sort(new SchemaCompareByNamespace());
+            ((List<Schema>)schemas).sort(new SchemaCompareByNamespace());
         }
         for(Schema schema : schemas) {
             try {
@@ -267,8 +253,6 @@
      * It is assumed that the map of QName-Type entries contains Type instances that are either a Class or
      * a ParameterizedType.
      *
-     * @param additionalGlobalElements
-     * @param annotationsProcessor
      */
     private void processAdditionalElements(Map<QName, Type> additionalGlobalElements, AnnotationsProcessor annotationsProcessor) {
         if (additionalGlobalElements != null) {
@@ -288,7 +272,7 @@
                 }
                 JavaClass jClass = null;
                 if (type instanceof Class) {
-                    Class tClass = (Class) type;
+                    Class<?> tClass = (Class<?>) type;
                     jClass = helper.getJavaClass(tClass);
                 }
                 // if no type is available don't do anything
@@ -300,11 +284,11 @@
         }
     }
 
-    public Map getUnmarshalCallbacks() {
+    public Map<String, UnmarshalCallback> getUnmarshalCallbacks() {
         return annotationsProcessor.getUnmarshalCallbacks();
     }
 
-    public Map getMarshalCallbacks() {
+    public Map<String, MarshalCallback> getMarshalCallbacks() {
         return annotationsProcessor.getMarshalCallbacks();
     }
 
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/JAXBMetadataLogger.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/JAXBMetadataLogger.java
index f2cdf1e..53c0176 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/JAXBMetadataLogger.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/JAXBMetadataLogger.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,6 @@
     /**
      * Create a new JAXBMetadataLogger and set the logLevel.
      *
-     * @param logLevel
      * @see SessionLog
      */
     public JAXBMetadataLogger(int logLevel) {
@@ -71,7 +70,6 @@
      * Logs a Severe message to the SessionLog. Typically called when EclipseLink is not in a state
      * to continue
      *
-     * @param throwable
      * @see SessionLog
      */
     public void logException(Throwable throwable) {
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 7b32eb8..3d96104 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
@@ -52,7 +52,6 @@
 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;
@@ -60,10 +59,8 @@
 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;
@@ -280,17 +277,13 @@
             if (tInfo.getXmlCustomizer() != null) {
                 String customizerClassName = tInfo.getXmlCustomizer();
                 try {
-                    Class<Object> customizerClass = PrivilegedAccessHelper.getClassForName(customizerClassName, true, helper.getClassLoader());
-                    DescriptorCustomizer descriptorCustomizer = (DescriptorCustomizer) PrivilegedAccessHelper.newInstanceFromClass(customizerClass);
+                    Class<? extends DescriptorCustomizer> customizerClass = PrivilegedAccessHelper.getClassForName(customizerClassName, true, helper.getClassLoader());
+                    DescriptorCustomizer descriptorCustomizer = PrivilegedAccessHelper.newInstanceFromClass(customizerClass);
                     descriptorCustomizer.customize((XMLDescriptor)tInfo.getDescriptor());
-                } catch (IllegalAccessException iae) {
-                    throw JAXBException.couldNotCreateCustomizerInstance(iae, customizerClassName);
-                } catch (InstantiationException ie) {
-                    throw JAXBException.couldNotCreateCustomizerInstance(ie, customizerClassName);
                 } catch (ClassCastException cce) {
                     throw JAXBException.invalidCustomizerClass(cce, customizerClassName);
-                } catch (ClassNotFoundException cnfe) {
-                    throw JAXBException.couldNotCreateCustomizerInstance(cnfe, customizerClassName);
+                } catch (ReflectiveOperationException roe) {
+                    throw JAXBException.couldNotCreateCustomizerInstance(roe, customizerClassName);
                 }
             }
         }
@@ -660,9 +653,6 @@
     /**
      * Generate a mapping for a given Property.
      *
-     * @param property
-     * @param descriptor
-     * @param namespaceInfo
      * @return newly created mapping
      */
     public Mapping generateMapping(Property property, Descriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {
@@ -1072,10 +1062,6 @@
     /**
      * Generate an XMLTransformationMapping based on a given Property.
      *
-     * @param property
-     * @param descriptor
-     * @param namespace
-     * @return
      */
     public TransformationMapping generateTransformationMapping(Property property, Descriptor descriptor, NamespaceInfo namespace) {
         TransformationMapping<AbstractSession, AttributeAccessor, ContainerPolicy, ClassDescriptor, DatabaseField, XMLTransformationRecord, XMLRecord> mapping = new XMLTransformationMapping();
@@ -1177,9 +1163,7 @@
                 }
                 mapping.addChoiceElement(xpath, type.getQualifiedName());
                 if(!originalType.getQualifiedName().equals(type.getQualifiedName())) {
-                    if(mapping.getClassNameToFieldMappings().get(originalType.getQualifiedName()) == null) {
-                        mapping.getClassNameToFieldMappings().put(originalType.getQualifiedName(), xpath);
-                    }
+                    mapping.getClassNameToFieldMappings().putIfAbsent(originalType.getQualifiedName(), xpath);
                     mapping.addConverter(xpath, converter);
                 }
                 XMLMapping nestedMapping = mapping.getChoiceElementMappings().get(xpath);
@@ -1283,9 +1267,7 @@
                 xmlField = xpath;
                 mapping.addChoiceElement(xpath.getName(), type.getQualifiedName());
                 if(!originalType.getQualifiedName().equals(type.getQualifiedName())) {
-                    if(mapping.getClassNameToFieldMappings().get(originalType.getQualifiedName()) == null) {
-                        mapping.getClassNameToFieldMappings().put(originalType.getQualifiedName(), xpath);
-                    }
+                    mapping.getClassNameToFieldMappings().putIfAbsent(originalType.getQualifiedName(), xpath);
                     mapping.addConverter(xpath, converter);
                 }
 
@@ -1948,9 +1930,6 @@
      * the raw name of the JavaClass compared to the canonical
      * name of the Class.
      *
-     * @param src
-     * @param tgtCanonicalName
-     * @return
      */
     protected boolean areEquals(JavaClass src, String tgtCanonicalName) {
         if (src == null || tgtCanonicalName == null) {
@@ -2181,7 +2160,7 @@
             QName schemaType = userDefinedSchemaTypes.get(theType.getQualifiedName());
 
             if (schemaType == null) {
-                schemaType = (QName) helper.getXMLToJavaTypeMap().get(theType);
+                schemaType = helper.getXMLToJavaTypeMap().get(theType.getName());
             }
             ((Field) mapping.getField()).setSchemaType(schemaType);
             if(info != null && info.isEnumerationType()) {
@@ -2379,7 +2358,7 @@
 
     public String getPrefixForNamespace(String URI, NamespaceResolver namespaceResolver, boolean addPrefixToNR) {
         String defaultNS = namespaceResolver.getDefaultNamespaceURI();
-        if(defaultNS != null && URI.equals(defaultNS)){
+        if(URI.equals(defaultNS)){
             return null;
         }
         String prefix = namespaceResolver.resolveNamespaceURI(URI);
@@ -2426,7 +2405,6 @@
      * generateMappings() that determines when to copy down inherited
      * methods from the parent class will need to be changed as well.
      *
-     * @param jClass
      */
     private void setupInheritance(JavaClass jClass) {
         TypeInfo tInfo = typeInfo.get(jClass.getName());
@@ -2566,9 +2544,6 @@
     /**
      * Generate mappings for a given TypeInfo.
      *
-     * @param info
-     * @param descriptor
-     * @param namespaceInfo
      */
     public void generateMappings(TypeInfo info, Descriptor descriptor, JavaClass descriptorJavaClass, NamespaceInfo namespaceInfo) {
         if(info.isAnonymousComplexType()) {
@@ -2659,10 +2634,6 @@
     /**
      * Create an XMLCollectionReferenceMapping and add it to the descriptor.
      *
-     * @param property
-     * @param descriptor
-     * @param namespaceInfo
-     * @param referenceClass
      */
     public CollectionReferenceMapping generateXMLCollectionReferenceMapping(Property property, Descriptor descriptor, NamespaceInfo namespaceInfo, JavaClass referenceClass) {
         CollectionReferenceMapping<AbstractSession, AttributeAccessor, ContainerPolicy, ClassDescriptor, DatabaseField, UnmarshalRecord, XMLField, XMLRecord> mapping = new XMLCollectionReferenceMapping();
@@ -2745,10 +2716,6 @@
     /**
      * Create an XMLObjectReferenceMapping and add it to the descriptor.
      *
-     * @param property
-     * @param descriptor
-     * @param namespaceInfo
-     * @param referenceClass
      */
     public ObjectReferenceMapping generateXMLObjectReferenceMapping(Property property, Descriptor descriptor, NamespaceInfo namespaceInfo, JavaClass referenceClass) {
         ObjectReferenceMapping<AbstractSession, AttributeAccessor, ContainerPolicy, ClassDescriptor, DatabaseField, UnmarshalRecord, XMLField, XMLRecord> mapping = new XMLObjectReferenceMapping();
@@ -2932,7 +2899,7 @@
         if (schemaType == null) {
             String propertyActualTypeRawName = property.getActualType().getRawName();
             if(QName.class.getCanonicalName().equals(propertyActualTypeRawName)) {
-                 schemaType = (QName) helper.getXMLToJavaTypeMap().get(propertyActualTypeRawName);
+                 schemaType = helper.getXMLToJavaTypeMap().get(propertyActualTypeRawName);
             }
         }
         if(schemaType !=null && !schemaType.equals (Constants.NORMALIZEDSTRING_QNAME)){
@@ -3404,10 +3371,8 @@
     /**
      * Convenience method which returns an AbstractNullPolicy built from an XmlAbstractNullPolicy.
      *
-     * @param property
      * @param nsr if 'NullRepresentedByXsiNil' is true, this is the resolver
      *            that we will add the schema instance prefix/uri pair to
-     * @return
      * @see org.eclipse.persistence.oxm.mappings.nullpolicy.AbstractNullPolicy
      * @see org.eclipse.persistence.jaxb.xmlmodel.XmlAbstractNullPolicy
      */
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java
index 308f510..3e5da2e 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/MarshalCallback.java
@@ -62,7 +62,6 @@
     }
 
     /**
-     * @param loader
      */
     public void initialize(ClassLoader loader) {
         try {
@@ -148,7 +147,6 @@
      * Should use setDomainClassName - the init method will overwrite
      * the set value with Class.forName(domainClassName).
      *
-     * @param clazz
      */
     public void setDomainClass(Class clazz) {
         domainClass = clazz;
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 7ca65dc..8f5c098 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
@@ -206,7 +206,7 @@
         ArrayList<JavaMethod> marshalMethods = new ArrayList<JavaMethod>();
 
         // Look for marshal method
-        for (JavaMethod method : (Collection<JavaMethod>) adapterCls.getMethods()) {
+        for (JavaMethod method : adapterCls.getMethods()) {
             if (!method.isBridge() && method.getName().equals(MARSHAL_METHOD_NAME)) {
                 final JavaClass[] parameterTypes = method.getParameterTypes();
                 if (parameterTypes.length != 1)
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 d9128c5..78164fe 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
@@ -151,7 +151,7 @@
         this.userDefinedSchemaTypes = userDefinedSchemaTypes;
         this.packageToPackageInfoMappings = packageToPackageInfoMappings;
         this.schemaCount = 1;
-        this.schemaTypeInfo = new HashMap<String, SchemaTypeInfo>(typeInfo.size());
+        this.schemaTypeInfo = new HashMap<>(typeInfo.size());
         this.arrayClassesToGeneratedClasses = arrayClassesToGeneratedClasses;
 
         //sort input classes before schema name (like schema1.xsd, schema2.xsd....) is generated and assigned
@@ -548,8 +548,6 @@
     /**
      * Return the schema type (as QName) based on a given JavaClass.
      *
-     * @param javaClass
-     * @return
      */
     public QName getSchemaTypeFor(JavaClass javaClass) {
         String className;
@@ -566,7 +564,7 @@
         // check user defined types first
         QName schemaType = userDefinedSchemaTypes.get(className);
         if (schemaType == null) {
-            schemaType = (QName) helper.getXMLToJavaTypeMap().get(javaClass.getRawName());
+            schemaType = helper.getXMLToJavaTypeMap().get(javaClass.getRawName());
         }
         if (schemaType == null) {
             TypeInfo targetInfo = this.typeInfo.get(className);
@@ -644,8 +642,6 @@
     /**
      * Indicates if a given Property is a collection type.
      *
-     * @param field
-     * @return
      */
     public boolean isCollectionType(Property field) {
         JavaClass type = field.getType();
@@ -662,13 +658,11 @@
      * Return the Schema for a given namespace.  If no schema exists for the
      * given namespace, one will be created.
      *
-     * @param namespace
-     * @return
      */
     private Schema getSchemaForNamespace(String namespace, String packageName) {
         if (schemaForNamespace == null) {
-            schemaForNamespace = new HashMap<String, Schema>();
-            allSchemas = new ArrayList<Schema>();
+            schemaForNamespace = new HashMap<>();
+            allSchemas = new ArrayList<>();
         }
         Schema schema = schemaForNamespace.get(namespace);
         if (schema == null && !javax.xml.XMLConstants.XML_NS_URI.equals(namespace)) {
@@ -680,9 +674,9 @@
                 if (namespaceInfo.getLocation() != null && !namespaceInfo.getLocation().equals(GENERATE)) {
                     return null;
                 }
-                java.util.Vector namespaces = namespaceInfo.getNamespaceResolver().getNamespaces();
+                java.util.Vector<Namespace> namespaces = namespaceInfo.getNamespaceResolver().getNamespaces();
                 for (int i = 0; i < namespaces.size(); i++) {
-                    Namespace nextNamespace = (Namespace) namespaces.get(i);
+                    Namespace nextNamespace = namespaces.get(i);
                     schema.getNamespaceResolver().put(nextNamespace.getPrefix(), nextNamespace.getNamespaceURI());
                 }
             }
@@ -731,7 +725,7 @@
 
     public Collection<Schema> getAllSchemas() {
         if (allSchemas == null) {
-            allSchemas = new ArrayList<Schema>();
+            allSchemas = new ArrayList<>();
         }
         return allSchemas;
     }
@@ -767,9 +761,9 @@
         addImportIfRequired(schema, referencedSchema, URI);
 
         NamespaceResolver namespaceResolver = schema.getNamespaceResolver();
-        Enumeration keys = namespaceResolver.getPrefixes();
+        Enumeration<String> keys = namespaceResolver.getPrefixes();
         while (keys.hasMoreElements()) {
-            String next = (String) keys.nextElement();
+            String next = keys.nextElement();
             String nextUri = namespaceResolver.resolveNamespacePrefix(next);
             if (nextUri.equals(URI)) {
                 return next;
@@ -782,9 +776,6 @@
      * Attempt to resolve the given URI to a prefix.  If this is unsuccessful, one
      * will be generated and added to the resolver.
      *
-     * @param URI
-     * @param schema
-     * @return
      */
     public String getOrGeneratePrefixForNamespace(String URI, Schema schema) {
         String prefix = schema.getNamespaceResolver().resolveNamespaceURI(URI);
@@ -828,7 +819,7 @@
                         JavaClass javaClass = nextElement.getJavaType();
 
                         //First check for built in type
-                        QName schemaType = (QName) helper.getXMLToJavaTypeMap().get(javaClass.getRawName());
+                        QName schemaType = helper.getXMLToJavaTypeMap().get(javaClass.getRawName());
                         if (schemaType != null) {
                             element.setType(Constants.SCHEMA_PREFIX + COLON + schemaType.getLocalPart());
                         } else if (areEquals(javaClass, JAVAX_ACTIVATION_DATAHANDLER) || areEquals(javaClass, byte[].class) || areEquals(javaClass, Byte[].class) || areEquals(javaClass, Image.class) || areEquals(javaClass, Source.class) || areEquals(javaClass, JAVAX_MAIL_INTERNET_MIMEMULTIPART)) {
@@ -926,16 +917,15 @@
      * Return the Map of SchemaTypeInfo instances.  The Map is keyed on JavaClass
      * qualified name.
      *
-     * @return
      */
     public Map<String, SchemaTypeInfo> getSchemaTypeInfo() {
         return this.schemaTypeInfo;
     }
 
     private boolean importExists(Schema schema, String importNsURI, String schemaLocation) {
-        java.util.List imports = schema.getImports();
+        java.util.List<Import> imports = schema.getImports();
         for (int i = 0; i < imports.size(); i++) {
-            Import nextImport = (Import) imports.get(i);
+            Import nextImport = imports.get(i);
             if (nextImport.getSchemaLocation() != null && nextImport.getSchemaLocation().equals(schemaLocation)) {
                 if ("".equals(importNsURI)) {
                     if (nextImport.getNamespace() == null) {
@@ -1015,9 +1005,6 @@
      * the raw name of the JavaClass compared to the canonical
      * name of the Class.
      *
-     * @param src
-     * @param tgtCanonicalName
-     * @return
      */
     protected boolean areEquals(JavaClass src, String tgtCanonicalName) {
         if (src == null || tgtCanonicalName == null) {
@@ -1031,9 +1018,6 @@
      * the raw name of the JavaClass compared to the canonical
      * name of the Class.
      *
-     * @param src
-     * @param tgt
-     * @return
      */
     protected boolean areEquals(JavaClass src, Class tgt) {
         if (src == null || tgt == null) {
@@ -1045,10 +1029,6 @@
     /**
      * Return the type name for a given Property.
      *
-     * @param next
-     * @param javaType
-     * @param theSchema
-     * @return
      */
     private String getTypeName(Property next, JavaClass javaType, Schema theSchema){
         QName schemaType = next.getSchemaType();
@@ -1067,9 +1047,6 @@
     /**
      * Return the qualified (if necessary) type name for a given Property.
      *
-     * @param prop
-     * @param schema
-     * @return
      */
     private String getQualifiedTypeName(Property prop, Schema schema) {
         JavaClass javaType = prop.getActualType();
@@ -1097,11 +1074,6 @@
      * returning - this is necessary due to the fact that an Any will be added to the sequence
      * in place of the last path element by the calling method.
      *
-     * @param frag
-     * @param xpr
-     * @param isChoice
-     * @param next
-     * @return
      */
     private AddToSchemaResult buildSchemaComponentsForXPath(XPathFragment frag, AddToSchemaResult xpr, boolean isChoice, Property next) {
         boolean isAny = next.isAny() || next.isAnyAttribute();
@@ -1195,7 +1167,7 @@
                     // if fragSchema is null, just generate the ref
                     if(fragSchema != null) {
                         Attribute globalAttribute = null;
-                        globalAttribute = (Attribute) fragSchema.getTopLevelAttributes().get(frag.getLocalName());
+                        globalAttribute = fragSchema.getTopLevelAttributes().get(frag.getLocalName());
                         if (globalAttribute == null) {
                             globalAttribute = createGlobalAttribute(frag, workingSchema, fragSchema, next);
                         }
@@ -1233,7 +1205,7 @@
             if ((fragSchema.isElementFormDefault() && !fragUri.equals(targetNS)) || (!fragSchema.isElementFormDefault() && fragUri.length() > 0)) {
                 // must generate a global element and create a reference to it
                 // if the global element exists, use it; otherwise create a new one
-                globalElement = (Element) fragSchema.getTopLevelElements().get(frag.getLocalName());
+                globalElement = fragSchema.getTopLevelElements().get(frag.getLocalName());
                 if (globalElement == null) {
                     globalElement = createGlobalElement(frag, workingSchema, fragSchema, isChoice, isUnbounded, next, (lastFrag && !isAny));
                 }
@@ -1337,20 +1309,19 @@
      * @param elementName the non-null element name to look for
      * @param refString if the element is a ref, this will be the prefix qualified element name
      * @param particle the sequence/choice/all to search for an existing element
-     * @return
      */
     protected Element elementExistsInParticle(String elementName, String refString, TypeDefParticle particle) {
         if (particle == null || particle.getElements() == null || particle.getElements().size() == 0) {
             return null;
         }
-        java.util.List existingElements = particle.getElements();
+        java.util.List<Element> existingElements = particle.getElements();
         if (existingElements != null) {
-            Iterator elementIt = existingElements.iterator();
+            Iterator<Element> elementIt = existingElements.iterator();
             while (elementIt.hasNext()) {
                 Element element;
                 // could be other components in the list, like Any, but we only care about Element
                 try {
-                    element = (Element) elementIt.next();
+                    element = elementIt.next();
                 } catch (ClassCastException cce) {
                     continue;
                 }
@@ -1383,11 +1354,6 @@
      * will typically be called when processing an XPath and a prefixed path
      * element is encountered tha requires an attribute ref.
      *
-     * @param frag
-     * @param workingSchema
-     * @param fragSchema
-     * @param prop
-     * @return
      */
     public Attribute createGlobalAttribute(XPathFragment frag, Schema workingSchema, Schema fragSchema, Property prop) {
         Attribute gAttribute = new Attribute();
@@ -1410,7 +1376,6 @@
      * @param isUnbounded maxOccurs setting for choice
      * @param prop property which owns the xml-path
      * @param shouldSetType if this is the last fragment in the xml-path and not an 'any', we should set the type
-     * @return
      */
     public Element createGlobalElement(XPathFragment frag, Schema workingSchema, Schema fragSchema, boolean isChoice, boolean isUnbounded, Property prop, boolean shouldSetType) {
         Element gElement = new Element();
@@ -1441,9 +1406,6 @@
      * method will typically be called when processing an XPath and a
      * prefixed path element is encountered that requires an element ref.
      *
-     * @param elementRefName
-     * @param particle
-     * @return
      */
     public Element createRefElement(String elementRefName, TypeDefParticle particle) {
         Element refElement = new Element();
@@ -1462,9 +1424,6 @@
      * and a prefixed path element is encountered that requires an
      * attribute ref.
      *
-     * @param attributeRefName
-     * @param owningComplexType
-     * @return
      */
     public Attribute createRefAttribute(String attributeRefName, ComplexType owningComplexType) {
         Attribute refAttribute = new Attribute();
@@ -1631,7 +1590,6 @@
      *
      * @param attributeName name of the Attribute
      * @param typeName type of the Attribute
-     * @return
      */
     private Attribute buildAttribute(QName attributeName, String typeName) {
         Attribute attribute = new Attribute();
@@ -1645,7 +1603,6 @@
      *
      * @param property the Property used to build the Attribute
      * @param schema the schema currently being generated
-     * @return
      */
     private Attribute buildAttribute(Property property, Schema schema) {
         Attribute attribute = new Attribute();
@@ -2083,7 +2040,6 @@
      * @param elementName name of the Element
      * @param elementType type of the Element
      * @param isAll indicates if the Element will be added to an All structure
-     * @return
      */
     private Element buildElement(String elementName, String elementType, boolean isAll) {
         Element element = new Element();
@@ -2103,7 +2059,6 @@
      * @param isAll true if the Element will be added to an All structure
      * @param schema the schema currently being built
      * @param typeInfo the TypeInfo that owns the given Property
-     * @return
      */
     private Element buildElement(Property property, boolean isAll, Schema schema, TypeInfo typeInfo) {
         Element element = new Element();
@@ -2206,18 +2161,18 @@
      * @author Marcel Valovy
      */
     private static final class FacetVisitorHolder {
-        private static final FacetVisitor<Void, Restriction> VISITOR = new FacetVisitor<Void, Restriction>() {
+        private static final FacetVisitor<Void, Restriction> VISITOR = new FacetVisitor<>() {
             @Override
             public Void visit(DecimalMinFacet t, Restriction restriction) {
-                if (t.isInclusive())    restriction.setMinInclusive(t.getValue());
-                else                    restriction.setMinExclusive(t.getValue());
+                if (t.isInclusive()) restriction.setMinInclusive(t.getValue());
+                else restriction.setMinExclusive(t.getValue());
                 return null;
             }
 
             @Override
             public Void visit(DecimalMaxFacet t, Restriction restriction) {
-                if (t.isInclusive())    restriction.setMaxInclusive(t.getValue());
-                else                    restriction.setMaxExclusive(t.getValue());
+                if (t.isInclusive()) restriction.setMaxInclusive(t.getValue());
+                else restriction.setMaxExclusive(t.getValue());
                 return null;
             }
 
@@ -2484,29 +2439,29 @@
      * @see <a href="http://www.regular-expressions.info/shorthand.html#xml">Special shorthands in XML Schema.</a>
      */
     private static final class RegexMutator {
-        private static final Map<Pattern, String> shorthandReplacements = new LinkedHashMap<Pattern, String>(32) {{
-            put(Pattern.compile("[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]" , Pattern.LITERAL),"\\\\i");
-            put(Pattern.compile("[^:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]" , Pattern.LITERAL),"\\\\I");
-            put(Pattern.compile("[-.0-9:A-Z_a-z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]" , Pattern.LITERAL),"\\\\c");
-            put(Pattern.compile("[^-.0-9:A-Z_a-z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]" , Pattern.LITERAL),"\\\\C");
-            put(Pattern.compile("[\\u0009-\\u000D\\u0020\\u0085\\u00A0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]" , Pattern.LITERAL),"\\\\s");
-            put(Pattern.compile("[^\\u0009-\\u000D\\u0020\\u0085\\u00A0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]" , Pattern.LITERAL),"\\\\S");
-            put(Pattern.compile("[\\u000A-\\u000D\\u0085\\u2028\\u2029]" , Pattern.LITERAL),"\\\\v");
-            put(Pattern.compile("[^\\u000A-\\u000D\\u0085\\u2028\\u2029]" , Pattern.LITERAL),"\\\\V");
-            put(Pattern.compile("[\\u0009\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]" , Pattern.LITERAL),"\\\\h");
-            put(Pattern.compile("[^\\u0009\\u0020\\u00A0\\u1680\\u180E\\u2000\\u2001-\\u200A\\u202F\\u205F\\u3000]" , Pattern.LITERAL),"\\\\H");
-            put(Pattern.compile("[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]" , Pattern.LITERAL),"\\\\w");
-            put(Pattern.compile("[^\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]" , Pattern.LITERAL),"\\\\W");
-            put(Pattern.compile("(?:(?<=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])(?![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])|(?<![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])(?=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]))", Pattern.LITERAL),"\\\\b");
-            put(Pattern.compile("(?:(?<=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])(?=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])|(?<![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])(?![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]))", Pattern.LITERAL),"\\\\B");
-            put(Pattern.compile("\\p{Nd}" , Pattern.LITERAL),"\\\\d");
-            put(Pattern.compile("\\P{Nd}" , Pattern.LITERAL),"\\\\D");
-            put(Pattern.compile("(?:(?>\\u000D\\u000A)|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])" , Pattern.LITERAL),"\\\\R");
-            put(Pattern.compile("(?:(?:\\u000D\\u000A)|(?:[\\u0E40\\u0E41\\u0E42\\u0E43\\u0E44\\u0EC0\\u0EC1\\u0EC2\\u0EC3\\u0EC4\\uAAB5\\uAAB6\\uAAB9\\uAABB\\uAABC]*(?:[\\u1100-\\u115F\\uA960-\\uA97C]+|([\\u1100-\\u115F\\uA960-\\uA97C]*((?:[[\\u1160-\\u11A2\\uD7B0-\\uD7C6][\\uAC00\\uAC1C\\uAC38]][\\u1160-\\u11A2\\uD7B0-\\uD7C6]*|[\\uAC01\\uAC02\\uAC03\\uAC04])[\\u11A8-\\u11F9\\uD7CB-\\uD7FB]*))|[\\u11A8-\\u11F9\\uD7CB-\\uD7FB]+|[^[\\p{Zl}\\p{Zp}\\p{Cc}\\p{Cf}&&[^\\u000D\\u000A\\u200C\\u200D]]\\u000D\\u000A])[[\\p{Mn}\\p{Me}\\u200C\\u200D\\u0488\\u0489\\u20DD\\u20DE\\u20DF\\u20E0\\u20E2\\u20E3\\u20E4\\uA670\\uA671\\uA672\\uFF9E\\uFF9F][\\p{Mc}\\u0E30\\u0E32\\u0E33\\u0E45\\u0EB0\\u0EB2\\u0EB3]]*)|(?s:.))" , Pattern.LITERAL),"\\\\X");
-            put(Pattern.compile("[_:A-Za-z]" , Pattern.LITERAL),"\\\\i"); // ascii only
-            put(Pattern.compile("[^:A-Z_a-z]" , Pattern.LITERAL),"\\\\I"); // ascii only
-            put(Pattern.compile("[-.0-9:A-Z_a-z]" , Pattern.LITERAL),"\\\\c"); // ascii only
-            put(Pattern.compile("[^-.0-9:A-Z_a-z]" , Pattern.LITERAL),"\\\\C"); // ascii only
+        private static final Map<Pattern, String> shorthandReplacements = new LinkedHashMap<>(32) {{
+            put(Pattern.compile("[:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]", Pattern.LITERAL), "\\\\i");
+            put(Pattern.compile("[^:A-Z_a-z\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u02FF\\u0370-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]", Pattern.LITERAL), "\\\\I");
+            put(Pattern.compile("[-.0-9:A-Z_a-z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]", Pattern.LITERAL), "\\\\c");
+            put(Pattern.compile("[^-.0-9:A-Z_a-z\\u00B7\\u00C0-\\u00D6\\u00D8-\\u00F6\\u00F8-\\u037D\\u037F-\\u1FFF\\u200C-\\u200D\\u203F\\u2040\\u2070-\\u218F\\u2C00-\\u2FEF\\u3001-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFFD]", Pattern.LITERAL), "\\\\C");
+            put(Pattern.compile("[\\u0009-\\u000D\\u0020\\u0085\\u00A0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]", Pattern.LITERAL), "\\\\s");
+            put(Pattern.compile("[^\\u0009-\\u000D\\u0020\\u0085\\u00A0\\u1680\\u180E\\u2000-\\u200A\\u2028\\u2029\\u202F\\u205F\\u3000]", Pattern.LITERAL), "\\\\S");
+            put(Pattern.compile("[\\u000A-\\u000D\\u0085\\u2028\\u2029]", Pattern.LITERAL), "\\\\v");
+            put(Pattern.compile("[^\\u000A-\\u000D\\u0085\\u2028\\u2029]", Pattern.LITERAL), "\\\\V");
+            put(Pattern.compile("[\\u0009\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u200A\\u202F\\u205F\\u3000]", Pattern.LITERAL), "\\\\h");
+            put(Pattern.compile("[^\\u0009\\u0020\\u00A0\\u1680\\u180E\\u2000\\u2001-\\u200A\\u202F\\u205F\\u3000]", Pattern.LITERAL), "\\\\H");
+            put(Pattern.compile("[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]", Pattern.LITERAL), "\\\\w");
+            put(Pattern.compile("[^\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]", Pattern.LITERAL), "\\\\W");
+            put(Pattern.compile("(?:(?<=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])(?![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])|(?<![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])(?=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]))", Pattern.LITERAL), "\\\\b");
+            put(Pattern.compile("(?:(?<=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])(?=[\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])|(?<![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]])(?![\\pL\\pM\\p{Nd}\\p{Nl}\\p{Pc}[\\p{InEnclosedAlphanumerics}&&\\p{So}]]))", Pattern.LITERAL), "\\\\B");
+            put(Pattern.compile("\\p{Nd}", Pattern.LITERAL), "\\\\d");
+            put(Pattern.compile("\\P{Nd}", Pattern.LITERAL), "\\\\D");
+            put(Pattern.compile("(?:(?>\\u000D\\u000A)|[\\u000A\\u000B\\u000C\\u000D\\u0085\\u2028\\u2029])", Pattern.LITERAL), "\\\\R");
+            put(Pattern.compile("(?:(?:\\u000D\\u000A)|(?:[\\u0E40\\u0E41\\u0E42\\u0E43\\u0E44\\u0EC0\\u0EC1\\u0EC2\\u0EC3\\u0EC4\\uAAB5\\uAAB6\\uAAB9\\uAABB\\uAABC]*(?:[\\u1100-\\u115F\\uA960-\\uA97C]+|([\\u1100-\\u115F\\uA960-\\uA97C]*((?:[[\\u1160-\\u11A2\\uD7B0-\\uD7C6][\\uAC00\\uAC1C\\uAC38]][\\u1160-\\u11A2\\uD7B0-\\uD7C6]*|[\\uAC01\\uAC02\\uAC03\\uAC04])[\\u11A8-\\u11F9\\uD7CB-\\uD7FB]*))|[\\u11A8-\\u11F9\\uD7CB-\\uD7FB]+|[^[\\p{Zl}\\p{Zp}\\p{Cc}\\p{Cf}&&[^\\u000D\\u000A\\u200C\\u200D]]\\u000D\\u000A])[[\\p{Mn}\\p{Me}\\u200C\\u200D\\u0488\\u0489\\u20DD\\u20DE\\u20DF\\u20E0\\u20E2\\u20E3\\u20E4\\uA670\\uA671\\uA672\\uFF9E\\uFF9F][\\p{Mc}\\u0E30\\u0E32\\u0E33\\u0E45\\u0EB0\\u0EB2\\u0EB3]]*)|(?s:.))", Pattern.LITERAL), "\\\\X");
+            put(Pattern.compile("[_:A-Za-z]", Pattern.LITERAL), "\\\\i"); // ascii only
+            put(Pattern.compile("[^:A-Z_a-z]", Pattern.LITERAL), "\\\\I"); // ascii only
+            put(Pattern.compile("[-.0-9:A-Z_a-z]", Pattern.LITERAL), "\\\\c"); // ascii only
+            put(Pattern.compile("[^-.0-9:A-Z_a-z]", Pattern.LITERAL), "\\\\C"); // ascii only
         }};
 
         private RegexMutator() {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/TypeInfo.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/TypeInfo.java
index b2d11a3..3a36a90 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/TypeInfo.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/TypeInfo.java
@@ -137,7 +137,6 @@
      * This constructor sets the Helper to be used throughout XML and Annotations
      * processing.  Other fields are initialized here as well.
      *
-     * @param helper
      */
     public TypeInfo(Helper helper, JavaClass javaClass) {
         propertyNames = new ArrayList<String>();
@@ -164,7 +163,6 @@
     /**
      * Set the XmlDescriptor on this TypeInfo.
      *
-     * @param desc
      */
     public void setDescriptor(Descriptor desc) {
         descriptor = desc;
@@ -257,7 +255,6 @@
      * Return the TypeProperty 'idProperty'. This method will typically be used in conjunction with
      * isIDSet method to determine if an @XmlID exists, and hence 'idProperty' is non-null.
      *
-     * @return
      */
     public Property getIDProperty() {
         return idProperty;
@@ -266,7 +263,6 @@
     /**
      * Return the Map of Properties for this TypeInfo.
      *
-     * @return
      */
     public HashMap<String, Property> getProperties() {
         return properties;
@@ -333,7 +329,6 @@
     /**
      * Set the Map of Properties for this TypeInfo.
      *
-     * @param properties
      */
     public void setProperties(ArrayList<Property> properties) {
         if (properties != null) {
@@ -373,7 +368,6 @@
      * Indicates if an @XmlID is set on a field/property. If so, the TypeProperty 'idProperty' will
      * be non-null.
      *
-     * @return
      */
     public boolean isIDSet() {
         return idProperty != null;
@@ -402,8 +396,6 @@
     /**
      * Return the xmladapter class for a given bound type class.
      *
-     * @param boundType
-     * @return
      */
     public JavaClass getPackageLevelAdapterClass(JavaClass boundType) {
         if(hasPackageLevelAdaptersByClass()) {
@@ -419,8 +411,6 @@
     /**
      * Return the xmladapter class for a given bound type class name.
      *
-     * @param boundTypeName
-     * @return
      */
     public JavaClass getPackageLevelAdapterClass(String boundTypeName) {
         if(hasPackageLevelAdaptersByClass()) {
@@ -432,7 +422,6 @@
     /**
      * Return the Map of XmlAdapters for this TypeInfo.
      *
-     * @return
      */
     public HashMap<String, JavaClass> getPackageLevelAdaptersByClass() {
         if(!hasPackageLevelAdaptersByClass()) {
@@ -448,8 +437,6 @@
     /**
      * Put a bound type class to adapter class entry in the Map.
      *
-     * @param adapterClass
-     * @param boundType
      */
     public void addPackageLevelAdapterClass(JavaClass adapterClass, JavaClass boundType) {
         getPackageLevelAdaptersByClass().put(boundType.getQualifiedName(), adapterClass);
@@ -462,7 +449,6 @@
     /**
      * Indicates if this TypeInfo contains an XmlElementRefs property.
      *
-     * @return
      */
     public boolean hasElementRefs() {
         return elementRefsPropertyName != null;
@@ -471,7 +457,6 @@
     /**
      * Return the XmlElementRefs property name, if one has been set.
      *
-     * @return
      */
     public String getElementRefsPropName() {
         return elementRefsPropertyName;
@@ -512,7 +497,6 @@
      * Indicates if an xmlValueProperty is set on this TypeInfo, i.e.
      * is non-null.
      *
-     * @return
      */
     public boolean isSetXmlValueProperty() {
         return xmlValueProperty != null;
@@ -529,7 +513,6 @@
     /**
      * Indicates if the class represented by this TypeInfo is marked XmlTransient.
      *
-     * @return
      */
     public boolean isTransient() {
         return isTransient;
@@ -546,7 +529,6 @@
     /**
      * Return all non-transient properties that exist in the propOrder array.
      *
-     * @return
      */
     public List<Property> getNonTransientPropertiesInPropOrder() {
         List<Property> propertiesInOrder = new ArrayList<Property>();
@@ -603,7 +585,6 @@
     /**
      * Indicates if XmlTransient is set.
      *
-     * @return
      */
     public boolean isSetXmlTransient() {
         return isSetXmlTransient;
@@ -612,7 +593,6 @@
     /**
      * Set the XmlTransient for this TypeInfo.
      *
-     * @param isTransient
      */
     public void setXmlTransient(boolean isTransient) {
         isSetXmlTransient = true;
@@ -622,7 +602,6 @@
     /**
      * Indicates if XmlElementNillable is set.
      *
-     * @return
      */
     public boolean isXmlElementNillable() {
         return isXmlElementNillable;
@@ -631,7 +610,6 @@
     /**
      * Set the XmlElementNillable for this TypeInfo.
      *
-     * @param isXmlElementNillable
      */
     public void setXmlElementNillable(boolean isXmlElementNillable) {
         this.isXmlElementNillable = isXmlElementNillable;
@@ -649,7 +627,6 @@
     /**
      * Set the XmlNullPolicy for this TypeInfo.
      *
-     * @param xmlNullPolicy
      */
     public void setXmlNullPolicy(XmlNullPolicy xmlNullPolicy) {
         this.xmlNullPolicy = xmlNullPolicy;
@@ -667,7 +644,6 @@
     /**
      * Return the List of XmlSeeAlso class names for this TypeInfo.
      *
-     * @return
      */
     public List<String> getXmlSeeAlso() {
         return xmlSeeAlso;
@@ -676,7 +652,6 @@
     /**
      * Set the List of XmlSeeAlso class names for this TypeInfo.
      *
-     * @param xmlSeeAlso
      */
     public void setXmlSeeAlso(List<String> xmlSeeAlso) {
         this.xmlSeeAlso = xmlSeeAlso;
@@ -694,7 +669,6 @@
     /**
      * Return the xmlRootElement set on this TypeInfo.
      *
-     * @return
      */
     public XmlRootElement getXmlRootElement() {
         return xmlRootElement;
@@ -703,7 +677,6 @@
     /**
      * Set the xmlRootElement for this TypeInfo.
      *
-     * @param xmlRootElement
      */
     public void setXmlRootElement(XmlRootElement xmlRootElement) {
         this.xmlRootElement = xmlRootElement;
@@ -721,7 +694,6 @@
     /**
      * Return the xmlType set on this TypeInfo.
      *
-     * @return
      */
     public XmlType getXmlType() {
         return xmlType;
@@ -730,7 +702,6 @@
     /**
      * Set the xmlType for this TypeInfo.
      *
-     * @param xmlType
      */
     public void setXmlType(XmlType xmlType) {
         this.xmlType = xmlType;
@@ -748,7 +719,6 @@
     /**
      * Return the xmlAccessType for this TypeInfo.
      *
-     * @return
      */
     public XmlAccessType getXmlAccessType() {
         return xmlAccessType;
@@ -757,7 +727,6 @@
     /**
      * Set the xmlAccessType for this TypeInfo.
      *
-     * @param xmlAccessType
      */
     public void setXmlAccessType(XmlAccessType xmlAccessType) {
         this.xmlAccessType = xmlAccessType;
@@ -775,7 +744,6 @@
     /**
      * Return the xmlAccessOrder for this TypeInfo.
      *
-     * @return
      */
     public XmlAccessOrder getXmlAccessOrder() {
         return xmlAccessOrder;
@@ -784,7 +752,6 @@
     /**
      * Set the xmlAccessOrder for this TypeInfo.
      *
-     * @param xmlAccessOrder
      */
     public void setXmlAccessOrder(XmlAccessOrder xmlAccessOrder) {
         this.xmlAccessOrder = xmlAccessOrder;
@@ -854,7 +821,6 @@
     /**
      * Set an XmlJavaTypeAdapter on this Type.
      *
-     * @param xmlJavaTypeAdapter
      * @see XmlJavaTypeAdapter
      */
     public void setXmlJavaTypeAdapter(XmlJavaTypeAdapter xmlJavaTypeAdapter) {
@@ -875,7 +841,6 @@
     /**
      * Sets the XmlCustomizer class name on this TypeInfo.
      *
-     * @param xmlCustomizerClassName
      * @see DescriptorCustomizer
      */
     public void setXmlCustomizer(String xmlCustomizerClassName) {
@@ -885,7 +850,6 @@
     /**
      * Indicates if the name of the XmlAnyElement property has been set.
      *
-     * @return
      */
     public boolean isSetAnyElementPropertyName() {
         return getAnyElementPropertyName() != null;
@@ -894,7 +858,6 @@
     /**
      * Return the name of the XmlAnyElement property, if one is set.
      *
-     * @return
      */
     public String getAnyElementPropertyName() {
         return anyElementPropertyName;
@@ -903,7 +866,6 @@
     /**
      * Set the name of the XmlAnyElement property
      *
-     * @param anyElementPropertyName
      */
     public void setAnyElementPropertyName(String anyElementPropertyName) {
         this.anyElementPropertyName = anyElementPropertyName;
@@ -912,7 +874,6 @@
     /**
      * Indicates if the name of the XmlAnyAttribute property has been set.
      *
-     * @return
      */
     public boolean isSetAnyAttributePropertyName() {
         return getAnyAttributePropertyName() != null;
@@ -921,7 +882,6 @@
     /**
      * Return the name of the XmlAnyAttribute property, if one is set.
      *
-     * @return
      */
     public String getAnyAttributePropertyName() {
         return anyAttributePropertyName;
@@ -930,7 +890,6 @@
     /**
      * Set the name of the XmlAnyAttribute property
      *
-     * @param anyAttributePropertyName
      */
     public void setAnyAttributePropertyName(String anyAttributePropertyName) {
         this.anyAttributePropertyName = anyAttributePropertyName;
@@ -939,7 +898,6 @@
     /**
      * Indicates if all binary data types are to be inlined for this class.
      *
-     * @return
      */
     public boolean isBinaryDataToBeInlined() {
         return isBinaryDataInlined;
@@ -949,7 +907,6 @@
      * Sets the flag that indicates if all binary data types are to
      * be inlined for this class.
      *
-     * @param isBinaryDataInlined
      */
     public void setInlineBinaryData(boolean isBinaryDataInlined) {
         this.isBinaryDataInlined = isBinaryDataInlined;
@@ -977,7 +934,6 @@
     /**
      * Set the ClassExtractor class name.
      *
-     * @param classExtractorName
      */
     public void setClassExtractorName(String classExtractorName) {
         this.classExtractorName = classExtractorName;
@@ -986,7 +942,6 @@
     /**
      * Return the Map of user-defined properties.
      *
-     * @return
      */
     public Map<Object, Object> getUserProperties() {
         return userProperties;
@@ -995,7 +950,6 @@
     /**
      * Set the Map of user-defined properties.
      *
-     * @param userProperties
      */
     public void setUserProperties(Map<Object, Object> userProperties) {
         this.userProperties = userProperties;
@@ -1004,7 +958,6 @@
     /**
      * Return the JavaClass name for this typeinfo.
      *
-     * @return
      */
     public String getJavaClassName() {
         return javaClassName;
@@ -1013,7 +966,6 @@
     /**
      * Set the JavaClass name for this typeinfo.
      *
-     * @param javaClassName
      */
     public void setJavaClassName(String javaClassName) {
         this.javaClassName = javaClassName;
@@ -1022,7 +974,6 @@
     /**
      * Return the class indicator field name for this type info.
      *
-     * @return
      */
     public String getXmlDiscriminatorNode() {
         return xmlDiscriminatorNode;
@@ -1031,7 +982,6 @@
     /**
      * Sets the class indicator field name (for use with inheritance).
      *
-     * @param xmlDiscriminatorNode
      */
     public void setXmlDiscriminatorNode(String xmlDiscriminatorNode) {
         this.xmlDiscriminatorNode = xmlDiscriminatorNode;
@@ -1050,7 +1000,6 @@
      * Return the value of the class indicator field for the java-type
      * associated with this type info.
      *
-     * @return
      */
     public String getXmlDiscriminatorValue() {
         return xmlDiscriminatorValue;
@@ -1060,7 +1009,6 @@
      * Set the value of the class indicator field for the java-type
      * associated with this type info.
      *
-     * @param xmlDiscriminatorValue
      */
     public void setXmlDiscriminatorValue(String xmlDiscriminatorValue) {
         this.xmlDiscriminatorValue = xmlDiscriminatorValue;
@@ -1080,7 +1028,6 @@
      * Add an XmlKey property to the list.  Each entry will be
      * set as a primary key on the owning descriptor.
      *
-     * @param xmlKeyProp
      */
     public void addXmlKeyProperty(Property xmlKeyProp) {
         if (xmlKeyProperties == null) {
@@ -1093,7 +1040,6 @@
      * Return the list of XmlKey property entries.  Each entry
      * will be set as a primary key on the owning descriptor.
      *
-     * @return
      */
     public List<Property> getXmlKeyProperties() {
         return xmlKeyProperties;
@@ -1103,7 +1049,6 @@
      * Indicates if the list of XmlKey property entries has
      * been set, i.e. is non-null.
      *
-     * @return
      */
     public boolean hasXmlKeyProperties() {
         return xmlKeyProperties != null;
@@ -1131,7 +1076,6 @@
      * properties were created during annotations processing, and have
      * not been modified since.
      *
-     * @return
      */
     public HashMap<String, Property> getOriginalProperties() {
         return originalProperties;
@@ -1148,7 +1092,6 @@
 
     /**
      * Return the XMLNameTransformer used when converting Java names to XML names
-     * @return
      */
     public XMLNameTransformer getXmlNameTransformer() {
         return xmlNameTransformer;
@@ -1156,7 +1099,6 @@
 
     /**
      * Set the XMLNameTransformer used when converting Java names to XML names
-     * @param xmlNameTransformer
      */
     public void setXmlNameTransformer(XMLNameTransformer xmlNameTransformer) {
         this.xmlNameTransformer = xmlNameTransformer;
@@ -1166,7 +1108,6 @@
     /**
      * INTERNAL:
      * Return the list of predicate properties. Lazy initializes the list.
-     * @return
      */
     public List<Property> getPredicateProperties() {
         if(predicateProperties == null) {
@@ -1193,7 +1134,6 @@
     /**
      * INTERNAL:
      * Return true if the list of predicate properties hasn't been initialized.
-     * @return
      */
     public boolean hasPredicateProperties() {
         return this.predicateProperties != null && this.predicateProperties.size() > 0;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java
index 89ee438..ab5f573 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/compiler/UnmarshalCallback.java
@@ -62,7 +62,6 @@
     }
 
     /**
-     * @param loader
      */
     public void initialize(ClassLoader loader) {
         try {
@@ -148,7 +147,6 @@
      * Should use setDomainClassName - the init method will overwrite
      * the set value with Class.forName(domainClassName)
      *
-     * @param clazz
      */
     public void setDomainClass(Class clazz) {
         domainClass = clazz;
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 55ddd68..cb52583 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
@@ -115,7 +115,6 @@
     /**
      * This is the preferred constructor.
      *
-     * @param bindings
      */
     public XMLProcessor(Map<String, XmlBindings> bindings) {
         this.xmlBindingMap = bindings;
@@ -125,7 +124,6 @@
      * Process XmlBindings on a per package basis for a given
      * AnnotationsProcessor instance.
      *
-     * @param annotationsProcessor
      */
     public void processXML(AnnotationsProcessor annotationsProcessor, JavaModelInput jModelInput, TypeMappingInfo[] typeMappingInfos, JavaClass[] originalJavaClasses) {
         this.jModelInput = jModelInput;
@@ -495,9 +493,6 @@
     /**
      * Process a given JavaType's attributes.
      *
-     * @param javaType
-     * @param typeInfo
-     * @param nsInfo
      */
     private void processJavaType(JavaType javaType, TypeInfo typeInfo, NamespaceInfo nsInfo) {
         // process field/property overrides
@@ -675,10 +670,6 @@
     /**
      * Process a given JavaAtribute.
      *
-     * @param javaAttribute
-     * @param oldProperty
-     * @param nsInfo
-     * @return
      */
     private Property processJavaAttribute(TypeInfo typeInfo, JavaAttribute javaAttribute, Property oldProperty, NamespaceInfo nsInfo, JavaType javaType) {
          if (javaAttribute instanceof XmlVariableNode) {
@@ -730,9 +721,6 @@
     /**
      * Handle property-level XmlJavaTypeAdapter
      *
-     * @param xmlAdapter
-     * @param oldProperty
-     * @return
      */
     private Property processXmlJavaTypeAdapter(XmlJavaTypeAdapter xmlAdapter, Property oldProperty) {
         oldProperty.setXmlJavaTypeAdapter(xmlAdapter);
@@ -742,9 +730,6 @@
     /**
      * Handle xml-inverse-reference.
      *
-     * @param xmlInverseReference
-     * @param oldProperty
-     * @return
      */
     private Property processXmlInverseReference(XmlInverseReference xmlInverseReference, Property oldProperty, TypeInfo info) {
         resetProperty(oldProperty, info);
@@ -782,11 +767,6 @@
     /**
      * Handle xml-any-attribute.
      *
-     * @param xmlAnyAttribute
-     * @param oldProperty
-     * @param tInfo
-     * @param javaType
-     * @return
      */
     private Property processXmlAnyAttribute(XmlAnyAttribute xmlAnyAttribute, Property oldProperty, TypeInfo tInfo, JavaType javaType) {
         // if oldProperty is already an Any (via @XmlAnyAttribute annotation)
@@ -876,11 +856,6 @@
      * Handle xml-any-element. If the property was annotated with @XmlAnyElement
      * in code all values will be overridden.
      *
-     * @param xmlAnyElement
-     * @param oldProperty
-     * @param tInfo
-     * @param javaType
-     * @return
      */
     private Property processXmlAnyElement(XmlAnyElement xmlAnyElement, Property oldProperty, TypeInfo tInfo, JavaType javaType) {
 
@@ -947,10 +922,6 @@
     /**
      * XmlAttribute override will completely replace the existing values.
      *
-     * @param xmlAttribute
-     * @param oldProperty
-     * @param nsInfo
-     * @return
      */
     private Property processXmlAttribute(XmlAttribute xmlAttribute, Property oldProperty, TypeInfo typeInfo, NamespaceInfo nsInfo, JavaType javaType) {
         // reset any existing values
@@ -1099,11 +1070,6 @@
     /**
      * XmlElement override will completely replace the existing values.
      *
-     * @param xmlElement
-     * @param oldProperty
-     * @param typeInfo
-     * @param nsInfo
-     * @return
      */
     private Property processXmlElement(XmlElement xmlElement, Property oldProperty, TypeInfo typeInfo, NamespaceInfo nsInfo, JavaType javaType) {
         // reset any existing values
@@ -1335,10 +1301,6 @@
      * The XmlElements object will be set on the property, and it will be
      * flagged as a 'choice'.
      *
-     * @param xmlElements
-     * @param oldProperty
-     * @param tInfo
-     * @return
      */
     private Property processXmlElements(XmlElements xmlElements, Property oldProperty, TypeInfo tInfo) {
         resetProperty(oldProperty, tInfo);
@@ -1392,10 +1354,6 @@
     /**
      * Process an xml-element-ref.
      *
-     * @param xmlElementRef
-     * @param oldProperty
-     * @param info
-     * @return
      */
     private Property processXmlElementRef(XmlElementRef xmlElementRef, Property oldProperty, TypeInfo info) {
         processObjectFactory(info);
@@ -1447,10 +1405,6 @@
     /**
      * Process an xml-element-refs.
      *
-     * @param xmlElementRefs
-     * @param oldProperty
-     * @param info
-     * @return
      */
     private Property processXmlElementRefs(XmlElementRefs xmlElementRefs, Property oldProperty, TypeInfo info) {
         processObjectFactory(info);
@@ -1581,8 +1535,6 @@
      * Process an XmlSchema. This involves creating a NamespaceInfo instance and
      * populating it based on the given XmlSchema.
      *
-     * @param xmlBindings
-     * @param packageName
      * @see NamespaceInfo
      * @see AnnotationsProcessor
      * @return newly created namespace info, or null if schema is null
@@ -1628,9 +1580,6 @@
      * Process an XmlTransformation. The info in the XmlTransformation will be
      * used to generate an XmlTransformationMapping in MappingsGenerator.
      *
-     * @param xmlTransformation
-     * @param oldProperty
-     * @param tInfo
      */
     private Property processXmlTransformation(XmlTransformation xmlTransformation, Property oldProperty, TypeInfo tInfo) {
         // reset any existing values
@@ -1657,9 +1606,6 @@
      * Process XmlJoinNodes.  This method sets the XmlJoinNodes instance on the Property
      * for use in MappingsGen and SchemaGen.
      *
-     * @param xmlJoinNodes
-     * @param oldProperty
-     * @return
      */
     private Property processXmlJoinNodes(XmlJoinNodes xmlJoinNodes, Property oldProperty, TypeInfo typeInfo) {
         // reset any existing values
@@ -1691,7 +1637,6 @@
     /**
      * Convenience method for building a Map of package to classes.
      *
-     * @return
      */
     private Map<String, ArrayList<JavaClass>> buildPackageToJavaClassMap() {
         Map<String, ArrayList<JavaClass>> theMap = new HashMap<String, ArrayList<JavaClass>>();
@@ -1759,7 +1704,6 @@
     /**
      * Lazy load the metadata logger.
      *
-     * @return
      */
     private JAXBMetadataLogger getLogger() {
         if (logger == null) {
@@ -1780,8 +1724,6 @@
      * Convenience method for resetting a number of properties on a given
      * property.
      *
-     * @param oldProperty
-     * @return
      */
     private Property resetProperty(Property oldProperty, TypeInfo tInfo) {
         oldProperty.setIsAttribute(false);
@@ -1834,8 +1776,6 @@
     /**
      * Ensure that a given property is not set as an xml-id.
      *
-     * @param oldProperty
-     * @param tInfo
      */
     private void unsetXmlID(Property oldProperty, TypeInfo tInfo) {
         oldProperty.setIsXmlId(false);
@@ -1848,8 +1788,6 @@
     /**
      * Ensure that a given property is not set as an xml-key.
      *
-     * @param oldProperty
-     * @param tInfo
      */
     private void unsetXmlKey(Property oldProperty, TypeInfo tInfo) {
         if (tInfo.hasXmlKeyProperties()) {
@@ -1868,8 +1806,6 @@
     /**
      * Ensure that a given property is not set as an xml-element-refs.
      *
-     * @param oldProperty
-     * @param tInfo
      */
     private void unsetXmlElementRefs(Property oldProperty, TypeInfo tInfo) {
         if (tInfo.hasElementRefs() && tInfo.getElementRefsPropName().equals(oldProperty.getPropertyName())) {
@@ -1880,7 +1816,6 @@
     /**
      * Ensure that a given property is not set as an xml-elements.
      *
-     * @param oldProperty
      */
     private void unsetXmlElements(Property oldProperty) {
         oldProperty.setXmlElements(null);
@@ -1890,8 +1825,6 @@
     /**
      * Ensure that a given property is not set as an xml-any-attribute.
      *
-     * @param oldProperty
-     * @param tInfo
      */
     private void unsetXmlAnyAttribute(Property oldProperty, TypeInfo tInfo) {
         oldProperty.setIsAnyAttribute(false);
@@ -1903,8 +1836,6 @@
     /**
      * Ensure that a given property is not set as an xml-any-element.
      *
-     * @param oldProperty
-     * @param tInfo
      */
     private void unsetXmlAnyElement(Property oldProperty, TypeInfo tInfo) {
         oldProperty.setIsAny(false);
@@ -1916,8 +1847,6 @@
     /**
      * Ensure that a given property is not set as an xml-value.
      *
-     * @param oldProperty
-     * @param tInfo
      */
     private void unsetXmlValue(Property oldProperty, TypeInfo tInfo) {
         oldProperty.setIsXmlValue(false);
@@ -1939,10 +1868,6 @@
      * - returns 'project' for xml-path 'projects/prj:project/text()'
      * - returns 'data' for xml-path 'pieces-of-data/data[1]/text()'
      *
-     * @param xpath
-     * @param propertyName
-     * @param isAttribute
-     * @return
      */
     public static String getNameFromXPath(String xpath, String propertyName, boolean isAttribute) {
         // handle self mapping
@@ -2008,8 +1933,6 @@
      * other simple type that was converted by ConversionManager,
      * i.e. numerical, boolean, temporal.
      *
-     * @param propList
-     * @return
      */
     private Map createUserPropertyMap(List<XmlProperty> propList) {
         return mergeUserPropertyMap(propList, new HashMap());
@@ -2028,8 +1951,6 @@
      * String or some other simple type that was converted by
      * ConversionManager, i.e. numerical, boolean, temporal.
      *
-     * @param propList
-     * @return
      */
     private Map mergeUserPropertyMap(List<XmlProperty> propList, Map existingMap) {
         Map propMap = existingMap;
@@ -2050,8 +1971,6 @@
      * doing so, so the original generic type will be retrieved and set after
      * the call to set the container type.
      *
-     * @param property
-     * @param containerClassName
      */
     private void setContainerType(Property property, String containerClassName) {
         // store the original generic type as the call to setType will overwrite it
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/Helper.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/Helper.java
index da705a6..b9186fd 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/Helper.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/Helper.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -22,6 +22,7 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 
 import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
 
@@ -29,6 +30,8 @@
 
 import org.eclipse.persistence.internal.oxm.Constants;
 
+import javax.xml.namespace.QName;
+
 /**
  * INTERNAL:
  * <p><b>Purpose:</b>To provide helper methods and constants to assist
@@ -53,7 +56,7 @@
 public class Helper {
     protected ClassLoader loader;
     protected JavaModel jModel;
-    private HashMap xmlToJavaTypeMap;
+    private Map<String, QName> xmlToJavaTypeMap;
     private boolean facets;
 
     public final static String APBYTE = "byte[]";
@@ -113,7 +116,6 @@
      * This constructor builds the map of XML-Java type pairs,
      * and sets the JavaModel and ClassLoader.
      *
-     * @param model
      */
     public Helper(JavaModel model) {
         xmlToJavaTypeMap = buildXMLToJavaTypeMap();
@@ -130,10 +132,9 @@
     /**
      * Builds a map of Java types to XML types.
      *
-     * @return
      */
-    private HashMap buildXMLToJavaTypeMap() {
-        HashMap javaTypes = new HashMap();
+    private Map<String, QName> buildXMLToJavaTypeMap() {
+        Map<String, QName> javaTypes = new HashMap<>();
         // jaxb 2.0 spec pairs
         javaTypes.put(APBYTE, Constants.BASE_64_BINARY_QNAME);
         javaTypes.put(BIGDECIMAL, Constants.DECIMAL_QNAME);
@@ -176,17 +177,15 @@
     /**
      * Return a given method's generic return type as a JavaClass.
      *
-     * @param meth
-     * @return
      */
     public JavaClass getGenericReturnType(JavaMethod meth) {
         JavaClass result = meth.getReturnType();
         JavaClass jClass = null;
         if (result == null) { return null; }
 
-        Collection args = result.getActualTypeArguments();
+        Collection<JavaClass> args = result.getActualTypeArguments();
         if (args.size() >0) {
-            jClass = (JavaClass) args.iterator().next();
+            jClass = args.iterator().next();
         }
         return jClass;
     }
@@ -196,8 +195,6 @@
      * This assumes that the provided class exists on the classpath
      * - null is returned otherwise.
      *
-     * @param javaClass
-     * @return
      */
     public JavaClass getJavaClass(Class javaClass) {
         return jModel.getClass(javaClass);
@@ -207,7 +204,6 @@
      * Return array of JavaClass instances created based on the provided classes.
      * This assumes provided classes exist on the classpath.
      *
-     * @param classes
      * @return JavaClass array
      */
     public JavaClass[] getJavaClassArray(Class... classes) {
@@ -227,8 +223,6 @@
      * class name.  This assumes that a class with the provided name
      * exists on the classpath - null is returned otherwise.
      *
-     * @param javaClassName
-     * @return
      */
     public JavaClass getJavaClass(String javaClassName) {
         return jModel.getClass(javaClassName);
@@ -236,9 +230,8 @@
 
     /**
      * Return a map of default Java types to XML types.
-     * @return
      */
-    public HashMap getXMLToJavaTypeMap() {
+    public Map<String, QName> getXMLToJavaTypeMap() {
         return xmlToJavaTypeMap;
     }
 
@@ -249,9 +242,6 @@
      * exist.
      * Intended to be used in conjunction with isAnnotationPresent.
      *
-     * @param element
-     * @param annotationClass
-     * @return
      * @see #isAnnotationPresent
      */
     public Annotation getAnnotation(JavaHasAnnotations element, Class annotationClass) {
@@ -266,8 +256,6 @@
      * Returns a JavaClass instance wrapping the provided field's resolved
      * type.
      *
-     * @param field
-     * @return
      */
     public JavaClass getType(JavaField field) {
         JavaClass type = field.getResolvedType();
@@ -282,7 +270,6 @@
      *
      * Replacement of direct access to JAXBELEMENT_CLASS field.
      *
-     * @return
      */
     public JavaClass getJaxbElementClass() {
         return jaxbElementClass;
@@ -293,7 +280,6 @@
      *
      * Replacement of direct access to OBJECT_CLASS field.
      *
-     * @return
      */
     public JavaClass getObjectClass() {
         return objectClass;
@@ -302,9 +288,6 @@
     /**
      * Indicates if element contains a given annotation.
      *
-     * @param element
-     * @param annotationClass
-     * @return
      */
     public boolean isAnnotationPresent(JavaHasAnnotations element, Class annotationClass) {
         if (element == null || annotationClass == null) {
@@ -322,8 +305,6 @@
      * 2 - the provided JavaClass' raw name starts with "java."
      * 3 - the provided JavaClass' raw name starts with "javax.", with
      *     the exception of "jakarta.xml.ws." and "javax.xml.rpc"
-     * @param jClass
-     * @return
      */
     public boolean isBuiltInJavaType(JavaClass jClass) {
         String rawName = jClass.getRawName();
@@ -399,9 +380,6 @@
     /**
      * Convenience method to determine if two JavaClass instances are equal.
      *
-     * @param classA
-     * @param classB
-     * @return
      */
     private boolean areClassesEqual(JavaClass classA, JavaClass classB) {
         if (classA == classB) {
@@ -411,8 +389,8 @@
             return false;
         }
 
-        Collection classAargs = classA.getActualTypeArguments();
-        Collection classBargs = classB.getActualTypeArguments();
+        Collection<JavaClass> classAargs = classA.getActualTypeArguments();
+        Collection<JavaClass> classBargs = classB.getActualTypeArguments();
         if (classAargs != null) {
             if (classBargs == null) {
                 return false;
@@ -421,12 +399,12 @@
                 return false;
             }
 
-            Iterator classAargsIter = classAargs.iterator();
-            Iterator classBargsIter = classBargs.iterator();
+            Iterator<JavaClass> classAargsIter = classAargs.iterator();
+            Iterator<JavaClass> classBargsIter = classBargs.iterator();
 
             while(classAargsIter.hasNext()){
-                JavaClass nestedClassA = (JavaClass) classAargsIter.next();
-                JavaClass nestedClassB = (JavaClass) classBargsIter.next();
+                JavaClass nestedClassA = classAargsIter.next();
+                JavaClass nestedClassB = classBargsIter.next();
                 if (!areClassesEqual(nestedClassA, nestedClassB)) {
                     return false;
                 }
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/JavaClass.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/JavaClass.java
index 85969ba..232d2ef 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/JavaClass.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/JavaClass.java
@@ -31,22 +31,22 @@
  * @see java.lang.Class
  */
 public interface JavaClass extends JavaHasAnnotations {
-    Collection getActualTypeArguments();
+    Collection<JavaClass> getActualTypeArguments();
     JavaClass getComponentType();
     String getQualifiedName();
     String getRawName();
     boolean hasActualTypeArguments();
-    Collection getDeclaredClasses();
+    Collection<JavaClass> getDeclaredClasses();
     JavaField getDeclaredField(String arg0);
-    Collection getDeclaredFields();
+    Collection<JavaField> getDeclaredFields();
     JavaMethod getDeclaredMethod(String arg0, JavaClass[] arg1);
-    Collection getDeclaredMethods();
+    Collection<JavaMethod> getDeclaredMethods();
     JavaMethod getMethod(String arg0, JavaClass[] arg1);
-    Collection getMethods();
+    Collection<JavaMethod> getMethods();
     JavaConstructor getConstructor(JavaClass[] parameterTypes);
-    Collection getConstructors();
+    Collection<JavaConstructor> getConstructors();
     JavaConstructor getDeclaredConstructor(JavaClass[] parameterTypes);
-    Collection getDeclaredConstructors();
+    Collection<JavaConstructor> getDeclaredConstructors();
     int getModifiers();
     String getName();
     JavaPackage getPackage();
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaClassImpl.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaClassImpl.java
index 1440786..36df38a 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaClassImpl.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaClassImpl.java
@@ -84,7 +84,7 @@
         this.javaModelImpl = javaModel;
     }
     @Override
-    public Collection getActualTypeArguments() {
+    public Collection<JavaClass> getActualTypeArguments() {
         ArrayList<JavaClass> argCollection = new ArrayList<>();
         if (jType != null) {
             Type[] params = jType.getActualTypeArguments();
@@ -209,7 +209,7 @@
     }
 
     @Override
-    public Collection getDeclaredMethods() {
+    public Collection<JavaMethod> getDeclaredMethods() {
         ArrayList<JavaMethod> methodCollection = new ArrayList<>();
         Method[] methods = jClass.getDeclaredMethods();
         for (Method method : methods) {
@@ -258,7 +258,7 @@
     }
 
     @Override
-    public Collection getConstructors() {
+    public Collection<JavaConstructor> getConstructors() {
         Constructor[] constructors = this.jClass.getConstructors();
         ArrayList<JavaConstructor> constructorCollection = new ArrayList(constructors.length);
         for(Constructor next:constructors) {
@@ -268,7 +268,7 @@
     }
 
     @Override
-    public Collection getDeclaredConstructors() {
+    public Collection<JavaConstructor> getDeclaredConstructors() {
         Constructor[] constructors = this.jClass.getDeclaredConstructors();
         ArrayList<JavaConstructor> constructorCollection = new ArrayList(constructors.length);
         for(Constructor next:constructors) {
@@ -323,7 +323,7 @@
     }
 
     @Override
-    public Collection getMethods() {
+    public Collection<JavaMethod> getMethods() {
         ArrayList<JavaMethod> methodCollection = new ArrayList<>();
         Method[] methods = PrivilegedAccessHelper.getMethods(jClass);
         for (Method method : methods) {
@@ -584,7 +584,6 @@
      * Set the indicator for XML metadata complete - if true,
      * annotations will be ignored.
      *
-     * @param isMetadataComplete
      */
     void setIsMetadataComplete(Boolean isMetadataComplete) {
        if(isMetadataComplete != null){
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 19440c8..1fb26b9 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
@@ -124,7 +124,6 @@
      * JavaModelInput.  If a given package has no entry in this map it is
      * assumed to be metadata incomplete.
      *
-     * @param metadataCompletePackageMap
      */
     public void setMetadataCompletePackageMap(Map<String, Boolean> metadataCompletePackageMap) {
         this.metadataCompletePackages = metadataCompletePackageMap;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelInputImpl.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelInputImpl.java
index 99236c6..d6381f6 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelInputImpl.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/javamodel/reflection/JavaModelInputImpl.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -54,8 +54,6 @@
      * This constructor assumes that the a given type in the list will
      * either be a Class or ParameterizedType.
      *
-     * @param types
-     * @param javaModel
      */
     public JavaModelInputImpl(Type[] types, JavaModel javaModel) {
          jModel = javaModel;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/rs/MOXyJsonProvider.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/rs/MOXyJsonProvider.java
index 97fa748..adfd07d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/rs/MOXyJsonProvider.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/rs/MOXyJsonProvider.java
@@ -306,8 +306,6 @@
      * @param annotations - The annotations corresponding to domain object.
      * @param mediaType - The media type for the HTTP entity.
      * @param httpHeaders - HTTP headers associated with HTTP entity.
-     * @return
-     * @throws JAXBException
      */
     protected JAXBContext getJAXBContext(Set<Class<?>> domainClasses, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, ?> httpHeaders) throws JAXBException {
 
@@ -623,7 +621,6 @@
      * @param httpHeaders - HTTP headers associated with HTTP entity.
      * @param unmarshaller - The instance of <i>Unmarshaller</i> that will be
      * used to unmarshal the JSON message.
-     * @throws JAXBException
      * @see org.eclipse.persistence.jaxb.UnmarshallerProperties
      */
     protected void preReadFrom(Class<Object> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, String> httpHeaders, Unmarshaller unmarshaller) throws JAXBException {
@@ -643,7 +640,6 @@
      * @param httpHeaders - HTTP headers associated with HTTP entity.
      * @param marshaller - The instance of <i>Marshaller</i> that will be used
      * to marshal the domain object to JSON.
-     * @throws JAXBException
      * @see org.eclipse.persistence.jaxb.MarshallerProperties
      */
     protected void preWriteTo(Object object, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, Marshaller marshaller) throws JAXBException {
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlAttribute.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlAttribute.java
index cb68eaa..d375bd2 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlAttribute.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlAttribute.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
@@ -296,7 +296,6 @@
     /**
      * Indicates if the required flag was set via external metadata.
      *
-     * @return
      */
     public boolean isSetRequired() {
         return required != null;
@@ -553,7 +552,6 @@
     /**
      * Indicates if the isReadOnly flag was set.
      *
-     * @return
      */
     public boolean isSetReadOnly() {
         return this.readOnly != null;
@@ -590,7 +588,6 @@
     /**
      * Indicates if the isWriteOnly flag was set.
      *
-     * @return
      */
     public boolean isSetWriteOnly() {
         return this.writeOnly != null;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlElement.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlElement.java
index 15bbcee..d1dd6fc 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlElement.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlElement.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
@@ -768,7 +768,6 @@
     /**
      * Indicates if the isReadOnly flag was set.
      *
-     * @return
      */
     public boolean isSetReadOnly() {
         return this.readOnly != null;
@@ -805,7 +804,6 @@
     /**
      * Indicates if the isWriteOnly flag was set.
      *
-     * @return
      */
     public boolean isSetWriteOnly() {
         return this.writeOnly != null;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlTransformation.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlTransformation.java
index 8a65ddc..516147d 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlTransformation.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlTransformation.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
@@ -139,7 +139,6 @@
     /**
      * Indicates if an XmlReadTransformer has been set, i.e. is non-null.
      *
-     * @return
      */
     public boolean isSetXmlReadTransformer() {
         return xmlReadTransformer != null;
@@ -174,7 +173,6 @@
      * set, i.e. the List of is XmlWriteTransformers is non-null
      * and non-empty.
      *
-     * @return
      */
     public boolean isSetXmlWriteTransformers() {
         return xmlWriteTransformer != null && xmlWriteTransformer.size() > 0;
@@ -292,7 +290,6 @@
         /**
          * Indicates if a method has been set, i.e. the method property is non-null.
          *
-         * @return
          */
         public boolean isSetMethod() {
             return method != null;
@@ -326,7 +323,6 @@
          * Indicates if a transformerClass has been set, i.e. the
          * transformerClass property is non-null.
          *
-         * @return
          */
         public boolean isSetTransformerClass() {
            return transformerClass != null;
@@ -391,7 +387,6 @@
         /**
          * Indicates if a method has been set, i.e. the method property is non-null.
          *
-         * @return
          */
         public boolean isSetMethod() {
             return method != null;
@@ -424,7 +419,6 @@
         /**
          * Indicates if a xmlPath has been set, i.e. the xmlPath property is non-null.
          *
-         * @return
          */
         public boolean isSetXmlPath() {
             return xmlPath != null;
@@ -458,7 +452,6 @@
          * Indicates if a transformerClass has been set, i.e. the
          * transformerClass property is non-null.
          *
-         * @return
          */
         public boolean isSetTransformerClass() {
            return transformerClass != null;
diff --git a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlValue.java b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlValue.java
index 3e7f334..123ef0c 100644
--- a/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlValue.java
+++ b/moxy/org.eclipse.persistence.moxy/src/main/java/org/eclipse/persistence/jaxb/xmlmodel/XmlValue.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
@@ -211,7 +211,6 @@
     /**
      * Indicates if the isReadOnly flag was set.
      *
-     * @return
      */
     public boolean isSetReadOnly() {
         return this.readOnly != null;
@@ -248,7 +247,6 @@
     /**
      * Indicates if the isWriteOnly flag was set.
      *
-     * @return
      */
     public boolean isSetWriteOnly() {
         return this.writeOnly != null;
diff --git a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/moxy/unit/jaxb/compiler/SchemaGeneratorTestCase.java b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/moxy/unit/jaxb/compiler/SchemaGeneratorTestCase.java
index b858f74..cdf894c 100644
--- a/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/moxy/unit/jaxb/compiler/SchemaGeneratorTestCase.java
+++ b/moxy/org.eclipse.persistence.moxy/src/test/java/org/eclipse/persistence/testing/moxy/unit/jaxb/compiler/SchemaGeneratorTestCase.java
@@ -115,7 +115,7 @@
             @Override
             public boolean isSynthetic() { return false; }
             @Override
-            public Collection getActualTypeArguments() { return null; }
+            public Collection<JavaClass> getActualTypeArguments() { return null; }
             @Override
             public JavaClass getComponentType() { return null; }
             @Override
@@ -123,27 +123,27 @@
             @Override
             public boolean hasActualTypeArguments() { return false; }
             @Override
-            public Collection getDeclaredClasses() { return null; }
+            public Collection<JavaClass> getDeclaredClasses() { return null; }
             @Override
             public JavaField getDeclaredField(String arg0) { return null; }
             @Override
-            public Collection getDeclaredFields() { return null; }
+            public Collection<JavaField> getDeclaredFields() { return null; }
             @Override
             public JavaMethod getDeclaredMethod(String arg0, JavaClass[] arg1) { return null; }
             @Override
-            public Collection getDeclaredMethods() { return null; }
+            public Collection<JavaMethod> getDeclaredMethods() { return null; }
             @Override
             public JavaMethod getMethod(String arg0, JavaClass[] arg1) { return null; }
             @Override
-            public Collection getMethods() { return null ;}
+            public Collection<JavaMethod> getMethods() { return null ;}
             @Override
             public JavaConstructor getConstructor(JavaClass[] parameterTypes) { return null; }
             @Override
-            public Collection getConstructors() { return null; }
+            public Collection<JavaConstructor> getConstructors() { return null; }
             @Override
             public JavaConstructor getDeclaredConstructor(JavaClass[] parameterTypes) { return null; }
             @Override
-            public Collection getDeclaredConstructors() { return null; }
+            public Collection<JavaConstructor> getDeclaredConstructors() { return null; }
             @Override
             public int getModifiers() { return 0; }
             @Override
diff --git a/sdo/eclipselink.sdo.test.server/pom.xml b/sdo/eclipselink.sdo.test.server/pom.xml
index 3d1d069..e6376df 100644
--- a/sdo/eclipselink.sdo.test.server/pom.xml
+++ b/sdo/eclipselink.sdo.test.server/pom.xml
@@ -31,6 +31,10 @@
     </parent>
 
     <properties>
+        <comp.xlint>-Xlint:all</comp.xlint>
+        <comp.xdoclint>-Xdoclint:all,-missing</comp.xdoclint>
+        <comp.test.xlint>-Xlint:all</comp.test.xlint>
+
         <skip-server-test-sdo>true</skip-server-test-sdo>
 
         <data-source-name>jdbc/EclipseLinkDS</data-source-name>
@@ -102,6 +106,15 @@
         </testResources>
 
         <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <arg>-Werror</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
             <!--Required for XLST to configure Wildfly modules (see sdo/eclipselink.sdo.test.server.maven/src/test/resources/wildfly/elResources.xml)-->
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
diff --git a/sdo/eclipselink.sdo.test.server/src/it/java/org/eclipse/persistence/testing/sdo/server/DeptImpl.java b/sdo/eclipselink.sdo.test.server/src/it/java/org/eclipse/persistence/testing/sdo/server/DeptImpl.java
index bef1363..f5eb4c6 100644
--- a/sdo/eclipselink.sdo.test.server/src/it/java/org/eclipse/persistence/testing/sdo/server/DeptImpl.java
+++ b/sdo/eclipselink.sdo.test.server/src/it/java/org/eclipse/persistence/testing/sdo/server/DeptImpl.java
@@ -18,6 +18,8 @@
 
 public class DeptImpl extends SDODataObject implements Dept {
 
+    private static final long serialVersionUID = 4475447330847016834L;
+
     public static final int START_PROPERTY_INDEX = 0;
 
     public static final int END_PROPERTY_INDEX = START_PROPERTY_INDEX + 3;
diff --git a/sdo/eclipselink.sdo.test.server/src/it/java/org/eclipse/persistence/testing/sdo/server/DeptServiceInitException.java b/sdo/eclipselink.sdo.test.server/src/it/java/org/eclipse/persistence/testing/sdo/server/DeptServiceInitException.java
index bc49a51..9cf8cdc 100644
--- a/sdo/eclipselink.sdo.test.server/src/it/java/org/eclipse/persistence/testing/sdo/server/DeptServiceInitException.java
+++ b/sdo/eclipselink.sdo.test.server/src/it/java/org/eclipse/persistence/testing/sdo/server/DeptServiceInitException.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2014, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2014, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -19,6 +19,8 @@
  */
 public class DeptServiceInitException extends RuntimeException {
 
+    private static final long serialVersionUID = 2104702765526786415L;
+
     public DeptServiceInitException(Throwable cause) {
         super(cause);
     }
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDOType.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDOType.java
index def14e3..b2cceb0 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDOType.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/SDOType.java
@@ -717,7 +717,7 @@
                     NamespaceResolver nextNR = (NamespaceResolver)namespaceResolvers.get(i);
                     if (nextNR != null) {
                         for (int j = 0, size = nextNR.getNamespaces().size(); j < size; j++) {
-                            Namespace nextNamespace = (Namespace)nextNR.getNamespaces().get(j);
+                            Namespace nextNamespace = nextNR.getNamespaces().get(j);
                             if ((!nextNamespace.getPrefix().equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE)) && (!nextNamespace.getNamespaceURI().equals(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI)) &&
                                 (!nextNamespace.getNamespaceURI().equals(SDOConstants.SDOJAVA_URL)) && (!nextNamespace.getNamespaceURI().equals(SDOConstants.SDOXML_URL)) &&
                                 (!nextNamespace.getNamespaceURI().equals(SDOConstants.SDO_URL))) {
@@ -788,7 +788,7 @@
                 NamespaceResolver parentNR = parentDescriptor.getNonNullNamespaceResolver();
                 if (parentNR != null) {
                     for (int i = 0; i < parentNR.getNamespaces().size(); i++) {
-                        Namespace nextNamespace = (Namespace)parentNR.getNamespaces().get(i);
+                        Namespace nextNamespace = parentNR.getNamespaces().get(i);
                         if ((!nextNamespace.getPrefix().equals(javax.xml.XMLConstants.XMLNS_ATTRIBUTE)) && (!nextNamespace.getNamespaceURI().equals(javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI)) &&
                             (!nextNamespace.getNamespaceURI().equals(SDOConstants.SDOJAVA_URL)) && (!nextNamespace.getNamespaceURI().equals(SDOConstants.SDOXML_URL)) &&
                             (!nextNamespace.getNamespaceURI().equals(SDOConstants.SDO_URL))) {
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOSchemaGenerator.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOSchemaGenerator.java
index fc27274..6b8ad63 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOSchemaGenerator.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOSchemaGenerator.java
@@ -46,7 +46,7 @@
  * @see commonj.sdo.helper.XSDHelper
  */
 public class SDOSchemaGenerator {
-    private Map namespaceToSchemaLocation;
+    private Map<String, String> namespaceToSchemaLocation;
     private SchemaLocationResolver schemaLocationResolver;
     private List allTypes;
     private Schema generatedSchema;
@@ -85,10 +85,10 @@
 
         //Now we have a built schema model
         Project p = new SchemaModelProject();
-        Vector generatedNamespaces = generatedSchema.getNamespaceResolver().getNamespaces();
+        Vector<Namespace> generatedNamespaces = generatedSchema.getNamespaceResolver().getNamespaces();
         XMLDescriptor desc = ((XMLDescriptor)p.getDescriptor(Schema.class));
         for (int i = 0; i < generatedNamespaces.size(); i++) {
-            Namespace next = (Namespace)generatedNamespaces.get(i);
+            Namespace next = generatedNamespaces.get(i);
             desc.getNamespaceResolver().put(next.getPrefix(), next.getNamespaceURI());
 
             if (next.getNamespaceURI().equals(SDOConstants.SDO_URL) || next.getNamespaceURI().equals(SDOConstants.SDOXML_URL) || next.getNamespaceURI().equals(SDOConstants.SDOJAVA_URL)) {
@@ -156,7 +156,7 @@
      * used for getting the value of the schemaLocation attribute of generated imports and includes
      * @return String The generated XSD.
     */
-    public String generate(List types, Map aNamespaceToSchemaLocation) {
+    public String generate(List types, Map<String, String> aNamespaceToSchemaLocation) {
         if ((types == null) || (types.size() == 0)) {
             throw new IllegalArgumentException("No Schema was generated from null or empty list of types.");
         }
@@ -175,9 +175,9 @@
 
         //Now we have a built schema model
         Project p = new SchemaModelProject();
-        Vector namespaces = generatedSchema.getNamespaceResolver().getNamespaces();
+        Vector<Namespace> namespaces = generatedSchema.getNamespaceResolver().getNamespaces();
         for (int i = 0; i < namespaces.size(); i++) {
-            Namespace next = (Namespace)namespaces.get(i);
+            Namespace next = namespaces.get(i);
             ((XMLDescriptor)p.getDescriptor(Schema.class)).getNamespaceResolver().put(next.getPrefix(), next.getNamespaceURI());
         }
 
@@ -277,10 +277,10 @@
         }
 
         Object value = sdoType.get(SDOConstants.JAVA_CLASS_PROPERTY);
-        if ((value != null) && value instanceof String) {
+        if (value instanceof String) {
             String sdoJavaPrefix = getPrefixForURI(SDOConstants.SDOJAVA_URL);
             QName qname = new QName(SDOConstants.SDOJAVA_URL, SDOConstants.SDOJAVA_INSTANCECLASS, sdoJavaPrefix);
-            simpleType.getAttributesMap().put(qname, value);
+            simpleType.getAttributesMap().put(qname, (String) value);
         }
 
         SDOType baseType = null;
@@ -747,7 +747,7 @@
             boolean alreadyGenerated = allTypes.contains(targetType);
             String schemaLocation = null;
             if (namespaceToSchemaLocation != null) {
-                schemaLocation = (String)namespaceToSchemaLocation.get(targetType.getURI());
+                schemaLocation = namespaceToSchemaLocation.get(targetType.getURI());
 
                 if (targetType.getURI().equals(generatedSchema.getTargetNamespace())) {
                     if (!alreadyGenerated) {
@@ -807,7 +807,7 @@
         }
         String lowerName = Character.toLowerCase(name.charAt(0)) + name.substring(1, name.length());
 
-        Object exists = schema.getTopLevelElements().get(lowerName);
+        Element exists = schema.getTopLevelElements().get(lowerName);
         if (exists != null) {
             elem.setName(name);
         } else {
diff --git a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java
index ac7b093..cbbcfe8 100644
--- a/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java
+++ b/sdo/org.eclipse.persistence.sdo/src/main/java/org/eclipse/persistence/sdo/helper/SDOTypesGenerator.java
@@ -78,11 +78,11 @@
 public class SDOTypesGenerator {
     private Project schemaProject;
     private Schema rootSchema;
-    private HashMap processedComplexTypes;
-    private HashMap processedSimpleTypes;
-    private HashMap processedElements;
-    private HashMap processedAttributes;
-    private Map itemNameToSDOName;
+    private Map<QName, ComplexType> processedComplexTypes;
+    private Map<QName, SimpleType> processedSimpleTypes;
+    private Map<QName, Element> processedElements;
+    private Map<QName, Attribute> processedAttributes;
+    private Map<String, String> itemNameToSDOName;
     private boolean processImports;
     private boolean returnAllTypes;
     private java.util.List<NamespaceResolver> namespaceResolvers;
@@ -91,24 +91,24 @@
     private HelperContext aHelperContext;
 
     private java.util.List<SDOType> anonymousTypes;
-    private java.util.Map<QName, Type> generatedTypes;
-    private java.util.Map<QName, SDOType> generatedTypesByXsdQName;
-    private java.util.Map<QName, Property> generatedGlobalElements;
-    private java.util.Map<QName, Property> generatedGlobalAttributes;
+    private Map<QName, Type> generatedTypes;
+    private Map<QName, SDOType> generatedTypesByXsdQName;
+    private Map<QName, Property> generatedGlobalElements;
+    private Map<QName, Property> generatedGlobalAttributes;
     private String packageName;
     private java.util.List<NonContainmentReference> nonContainmentReferences;
     private Map<Type, java.util.List<GlobalRef>> globalRefs;
     private boolean isImportProcessor;
 
     public SDOTypesGenerator(HelperContext aContext) {
-        anonymousTypes = new ArrayList<SDOType>();
-        generatedTypesByXsdQName = new HashMap<QName, SDOType>();
-        processedComplexTypes = new HashMap();
-        processedSimpleTypes = new HashMap();
-        processedElements = new HashMap();
-        processedAttributes = new HashMap();
-        itemNameToSDOName = new HashMap();
-        namespaceResolvers = new ArrayList();
+        anonymousTypes = new ArrayList<>();
+        generatedTypesByXsdQName = new HashMap<>();
+        processedComplexTypes = new HashMap<>();
+        processedSimpleTypes = new HashMap<>();
+        processedElements = new HashMap<>();
+        processedAttributes = new HashMap<>();
+        itemNameToSDOName = new HashMap<>();
+        namespaceResolvers = new ArrayList<>();
         this.aHelperContext = aContext;
     }
 
@@ -252,13 +252,13 @@
         postProcessing();
     }
 
-    private void processImports(java.util.List imports) {
+    private void processImports(java.util.List<Import> imports) {
         if ((imports == null) || (imports.size() == 0) || !isProcessImports()) {
             return;
         }
-        Iterator iter = imports.iterator();
+        Iterator<Import> iter = imports.iterator();
         while (iter.hasNext()) {
-            Import nextImport = (Import) iter.next();
+            Import nextImport = iter.next();
             try {
                 processImportIncludeInternal(nextImport);
             } catch (Exception e) {
@@ -267,13 +267,13 @@
         }
     }
 
-    private void processIncludes(java.util.List includes) {
+    private void processIncludes(java.util.List<Include> includes) {
         if ((includes == null) || (includes.size() == 0) || !isProcessImports()) {
             return;
         }
-        Iterator iter = includes.iterator();
+        Iterator<Include> iter = includes.iterator();
         while (iter.hasNext()) {
-            Include nextInclude = (Include) iter.next();
+            Include nextInclude = iter.next();
             try {
                 processImportIncludeInternal(nextInclude);
             } catch (Exception e) {
@@ -338,7 +338,7 @@
             alreadyProcessed = true;
         } else {
             QName qname = new QName(targetNamespace, sdoTypeName);
-            Object processed = processedComplexTypes.get(qname);
+            ComplexType processed = processedComplexTypes.get(qname);
             if (processed != null) {
                 alreadyProcessed = true;
             }
@@ -365,14 +365,14 @@
     }
 
     private void processGlobalComplexTypes(Schema schema) {
-        Collection complexTypes = schema.getTopLevelComplexTypes().values();
+        Collection<ComplexType> complexTypes = schema.getTopLevelComplexTypes().values();
         if (complexTypes == null) {
             return;
         }
 
-        Iterator complexTypesIter = complexTypes.iterator();
+        Iterator<ComplexType> complexTypesIter = complexTypes.iterator();
         while (complexTypesIter.hasNext()) {
-            ComplexType complexType = (ComplexType) complexTypesIter.next();
+            ComplexType complexType = complexTypesIter.next();
             String targetNamespace = schema.getTargetNamespace();
             if(null == targetNamespace) {
                 targetNamespace = "";
@@ -383,7 +383,7 @@
 
     private void processGlobalComplexType(String targetNamespace, String defaultNamespace, ComplexType complexType) {
         QName qname = new QName(targetNamespace, complexType.getName());
-        Object processed = processedComplexTypes.get(qname);
+        ComplexType processed = processedComplexTypes.get(qname);
 
         if (processed == null) {
             processComplexType(targetNamespace, defaultNamespace, complexType.getName(), complexType);
@@ -426,7 +426,7 @@
 
     //return true if a new type was created
     private SDOType startComplexType(String targetNamespace, String defaultNamespace, String name, ComplexType complexType) {
-        String nameValue = (String) complexType.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
+        String nameValue = complexType.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
         String originalName = name;
         if (nameValue != null) {
             itemNameToSDOName.put(name, nameValue);
@@ -467,14 +467,14 @@
         currentType.setAbstract(complexType.isAbstractValue());
         currentType.setDataType(false);
 
-        String value = (String) complexType.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
+        String value = complexType.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
         if (value != null) {
             XMLConversionManager xmlConversionManager = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlConversionManager();
             java.util.List names = xmlConversionManager.convertObject(value, java.util.List.class);
             currentType.setAliasNames(names);
         }
 
-        String sequencedValue = (String) complexType.getAttributesMap().get(SDOConstants.SDOXML_SEQUENCE_QNAME);
+        String sequencedValue = complexType.getAttributesMap().get(SDOConstants.SDOXML_SEQUENCE_QNAME);
         if (sequencedValue != null) {
             currentType.setSequenced(Boolean.parseBoolean(sequencedValue));
         }
@@ -509,13 +509,13 @@
     }
 
     private void processGlobalAttributes(Schema schema) {
-        Collection attributes = schema.getTopLevelAttributes().values();
+        Collection<Attribute> attributes = schema.getTopLevelAttributes().values();
         if (attributes == null) {
             return;
         }
-        Iterator attributesIter = attributes.iterator();
+        Iterator<Attribute> attributesIter = attributes.iterator();
         while (attributesIter.hasNext()) {
-            Attribute nextAttribute = (Attribute) attributesIter.next();
+            Attribute nextAttribute = attributesIter.next();
             String targetNamespace = schema.getTargetNamespace();
             if(null == targetNamespace) {
                 targetNamespace = "";
@@ -527,7 +527,7 @@
     private void processGlobalAttribute(String targetNamespace, String defaultNamespace, Attribute attribute) {
         if (attribute.getName() != null) {
             QName qname = new QName(targetNamespace, attribute.getName());
-            Object processed = processedAttributes.get(qname);
+            Attribute processed = processedAttributes.get(qname);
 
             if (processed == null) {
                 SDOType attributeType = processAttribute(targetNamespace, defaultNamespace, null, attribute, true);
@@ -613,7 +613,7 @@
                     processAnyAttribute(targetNamespace, defaultNamespace, owningType);
                 }
                 for (int j = 0; j < size; j++) {
-                    processAttribute(targetNamespace, defaultNamespace, owningType, (Attribute) globalAttributeGroup.getAttributes().get(j), false);
+                    processAttribute(targetNamespace, defaultNamespace, owningType, globalAttributeGroup.getAttributes().get(j), false);
                 }
             }
         }
@@ -630,14 +630,14 @@
     }
 
     private void processGlobalSimpleTypes(Schema schema) {
-        Collection simpleTypes = schema.getTopLevelSimpleTypes().values();
+        Collection<SimpleType> simpleTypes = schema.getTopLevelSimpleTypes().values();
         if (simpleTypes == null) {
             return;
         }
 
-        Iterator simpleTypesIter = simpleTypes.iterator();
+        Iterator<SimpleType> simpleTypesIter = simpleTypes.iterator();
         while (simpleTypesIter.hasNext()) {
-            SimpleType simpleType = (SimpleType) simpleTypesIter.next();
+            SimpleType simpleType = simpleTypesIter.next();
             String targetNamespace = schema.getTargetNamespace();
             if(null == targetNamespace) {
                 targetNamespace = "";
@@ -704,7 +704,7 @@
         typeHelper.getImplClassesToSDOType().put(wrapperType.getXmlDescriptor().getJavaClass(), wrapperType);
 
         // Add descriptor to XMLHelper
-        ArrayList list = new ArrayList(1);
+        ArrayList<SDOWrapperType> list = new ArrayList<>(1);
         list.add(wrapperType);
         ((SDOXMLHelper) aHelperContext.getXMLHelper()).addDescriptors(list);
 
@@ -722,7 +722,7 @@
         boolean addedNR = addNextNamespaceResolver(simpleType.getAttributesMap());
         String name = sdoTypeName;
         String originalName = name;
-        String nameValue = (String) simpleType.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
+        String nameValue = simpleType.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
         if (nameValue != null) {
             itemNameToSDOName.put(sdoTypeName, nameValue);
             name = nameValue;
@@ -755,20 +755,20 @@
     }
 
     private void finishSimpleType(String targetNamespace, String defaultNamespace, String sdoTypeName, SimpleType simpleType, SDOType currentType) {
-        String value = (String) simpleType.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
+        String value = simpleType.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
         if (value != null) {
             XMLConversionManager xmlConversionManager = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlConversionManager();
             java.util.List names = xmlConversionManager.convertObject(value, java.util.List.class);
             currentType.setAliasNames(names);
         }
 
-        String instanceClassValue = (String) simpleType.getAttributesMap().get(SDOConstants.SDOJAVA_INSTANCECLASS_QNAME);
+        String instanceClassValue = simpleType.getAttributesMap().get(SDOConstants.SDOJAVA_INSTANCECLASS_QNAME);
         if (instanceClassValue != null) {
             currentType.setInstanceProperty(SDOConstants.JAVA_CLASS_PROPERTY, instanceClassValue);
             currentType.setBaseTypes(null);
         }
 
-        String extendedInstanceClassValue = (String) simpleType.getAttributesMap().get(SDOConstants.SDOJAVA_EXTENDEDINSTANCECLASS_QNAME);
+        String extendedInstanceClassValue = simpleType.getAttributesMap().get(SDOConstants.SDOJAVA_EXTENDEDINSTANCECLASS_QNAME);
         if (extendedInstanceClassValue != null) {
             currentType.setInstanceClassName(extendedInstanceClassValue);
         }
@@ -875,12 +875,12 @@
             if(baseType != null) {
                 if(!baseType.isFinalized() && baseQName.getNamespaceURI().equals(targetNamespace)) {
                     if(baseType.isDataType()) {
-                        SimpleType baseSimpleType = (SimpleType) rootSchema.getTopLevelSimpleTypes().get(baseQName.getLocalPart());
+                        SimpleType baseSimpleType = rootSchema.getTopLevelSimpleTypes().get(baseQName.getLocalPart());
                         if(baseSimpleType != null){
                             processGlobalSimpleType(targetNamespace, defaultNamespace, baseSimpleType);
                         }
                     } else {
-                        ComplexType baseComplexType = (ComplexType) rootSchema.getTopLevelComplexTypes().get(baseQName.getLocalPart());
+                        ComplexType baseComplexType = rootSchema.getTopLevelComplexTypes().get(baseQName.getLocalPart());
                         if(baseComplexType != null){
                             processGlobalComplexType(targetNamespace, defaultNamespace, baseComplexType);
                         }
@@ -936,7 +936,7 @@
                 SDOType typeForMemberType = getTypeForName(targetNamespace, defaultNamespace, nextMemberType);
                 QName baseQName = this.getQNameForString(defaultNamespace, nextMemberType);
                 if(!typeForMemberType.isFinalized() && baseQName.getNamespaceURI().equals(targetNamespace)) {
-                    SimpleType baseSimpleType = (SimpleType) rootSchema.getTopLevelSimpleTypes().get(baseQName.getLocalPart());
+                    SimpleType baseSimpleType = rootSchema.getTopLevelSimpleTypes().get(baseQName.getLocalPart());
                     processSimpleType(targetNamespace, defaultNamespace, baseQName.getLocalPart(), baseSimpleType);
                 }
                 if (i == 0) {
@@ -1000,10 +1000,10 @@
 
         if(!baseType.isFinalized() && baseQName.getNamespaceURI().equals(targetNamespace)) {
             if(baseType.isDataType()) {
-                SimpleType baseSimpleType = (SimpleType) rootSchema.getTopLevelSimpleTypes().get(baseQName.getLocalPart());
+                SimpleType baseSimpleType = rootSchema.getTopLevelSimpleTypes().get(baseQName.getLocalPart());
                 processGlobalSimpleType(targetNamespace, defaultNamespace, baseSimpleType);
             } else {
-                ComplexType baseComplexType = (ComplexType) rootSchema.getTopLevelComplexTypes().get(baseQName.getLocalPart());
+                ComplexType baseComplexType = rootSchema.getTopLevelComplexTypes().get(baseQName.getLocalPart());
                 processGlobalComplexType(targetNamespace, defaultNamespace, baseComplexType);
             }
         }
@@ -1130,13 +1130,13 @@
     }
 
     private void processGlobalElements(Schema schema) {
-        Collection elements = schema.getTopLevelElements().values();
+        Collection<Element> elements = schema.getTopLevelElements().values();
         if (elements == null) {
             return;
         }
-        Iterator elementsIter = elements.iterator();
+        Iterator<Element> elementsIter = elements.iterator();
         while (elementsIter.hasNext()) {
-            Element nextElement = (Element) elementsIter.next();
+            Element nextElement = elementsIter.next();
             String targetNamespace = schema.getTargetNamespace();
             if(null == targetNamespace) {
                 targetNamespace = "";
@@ -1153,7 +1153,7 @@
                 return;
             }
             QName qname = new QName(targetNamespace, element.getName());
-            Object processed = processedElements.get(qname);
+            Element processed = processedElements.get(qname);
 
             if (processed == null) {
                 SDOType elementType = processElement(targetNamespace, defaultNamespace, null, null, element, true, true);
@@ -1214,7 +1214,7 @@
             return;
         }
 
-        String manyValue = (String) element.getAttributesMap().get(SDOConstants.SDOXML_MANY_QNAME);
+        String manyValue = element.getAttributesMap().get(SDOConstants.SDOXML_MANY_QNAME);
         if (manyValue != null) {
             isMany = Boolean.parseBoolean(manyValue);
         }
@@ -1303,11 +1303,11 @@
                     p.setXsdType(qname);
                 }
 
-                String mimeType = (String) element.getAttributesMap().get(SDOConstants.XML_MIME_TYPE_QNAME);
+                String mimeType = element.getAttributesMap().get(SDOConstants.XML_MIME_TYPE_QNAME);
                 if (mimeType != null) {
                     p.setInstanceProperty(SDOConstants.MIME_TYPE_PROPERTY, mimeType);
                 }
-                String mimeTypePropName = (String) element.getAttributesMap().get(SDOConstants.XML_MIME_TYPE_PROPERTY_QNAME);
+                String mimeTypePropName = element.getAttributesMap().get(SDOConstants.XML_MIME_TYPE_PROPERTY_QNAME);
                 if (mimeTypePropName != null) {
                     p.setInstanceProperty(SDOConstants.MIME_TYPE_PROPERTY_PROPERTY, mimeTypePropName);
                 }
@@ -1315,7 +1315,7 @@
                 sdoPropertyType = getSDOTypeForName(targetNamespace, defaultNamespace, typeName);
                 if(!sdoPropertyType.isFinalized() && qname.getNamespaceURI().equals(targetNamespace)) {
                     if(sdoPropertyType.isDataType()) {
-                        SimpleType baseSimpleType = (SimpleType) rootSchema.getTopLevelSimpleTypes().get(qname.getLocalPart());
+                        SimpleType baseSimpleType = rootSchema.getTopLevelSimpleTypes().get(qname.getLocalPart());
                         processGlobalSimpleType(targetNamespace, defaultNamespace, baseSimpleType);
                     }
                 }
@@ -1529,13 +1529,13 @@
                 owningType.setInstanceProperty(SDOConstants.ID_PROPERTY, p.getName());
             } else if (xsdType.getLocalPart().equals(SDOConstants.IDREF)) {
                 p.setContainment(false);
-                String propertyTypeValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_PROPERTYTYPE_QNAME);
+                String propertyTypeValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_PROPERTYTYPE_QNAME);
                 if (propertyTypeValue != null) {
                     buildMapping = false;
                 }
             } else if (xsdType.getLocalPart().equals(SDOConstants.IDREFS)) {
                 p.setContainment(false);
-                String propertyTypeValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_PROPERTYTYPE_QNAME);
+                String propertyTypeValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_PROPERTYTYPE_QNAME);
                 if (propertyTypeValue != null) {
                     buildMapping = false;
                     p.setMany(true);
@@ -1668,7 +1668,7 @@
                 sdoPropertyType = getSDOTypeForName(targetNamespace, defaultNamespace, typeName);
                 if(!sdoPropertyType.isFinalized() && qname.getNamespaceURI().equals(targetNamespace)) {
                     if(sdoPropertyType.isDataType()) {
-                        SimpleType baseSimpleType = (SimpleType) rootSchema.getTopLevelSimpleTypes().get(qname.getLocalPart());
+                        SimpleType baseSimpleType = rootSchema.getTopLevelSimpleTypes().get(qname.getLocalPart());
                         processGlobalSimpleType(targetNamespace, defaultNamespace, baseSimpleType);
                     }
                 }
@@ -1700,7 +1700,7 @@
 
     private SDOType processSimpleComponentAnnotations(SDOType owningType, SimpleComponent simpleComponent, SDOProperty p, String targetNamespace, String defaultNamespace, SDOType sdoPropertyType) {
         //aliasName annotation
-        String aliasNamesValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
+        String aliasNamesValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_ALIASNAME_QNAME);
         if (aliasNamesValue != null) {
             XMLConversionManager xmlConversionManager = ((SDOXMLHelper) aHelperContext.getXMLHelper()).getXmlConversionManager();
             java.util.List names = xmlConversionManager.convertObject(aliasNamesValue, java.util.List.class);
@@ -1708,13 +1708,13 @@
         }
 
         //readOnly annotation
-        String readOnlyValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_READONLY_QNAME);
+        String readOnlyValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_READONLY_QNAME);
         if (readOnlyValue != null) {
             p.setReadOnly(Boolean.parseBoolean(readOnlyValue));
         }
 
         //dataType annotation
-        String dataTypeValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_DATATYPE_QNAME);
+        String dataTypeValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_DATATYPE_QNAME);
         if (dataTypeValue != null) {
             QName xsdQName = ((SDOTypeHelper) aHelperContext.getTypeHelper()).getXSDTypeFromSDOType(sdoPropertyType);
             if ((xsdQName == null) && !sdoPropertyType.isDataType()) {
@@ -1728,7 +1728,7 @@
         }
 
         //string annotation
-        String stringValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_STRING_QNAME);
+        String stringValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_STRING_QNAME);
         if (stringValue != null) {
             QName xsdTypeQName = getQNameForString(defaultNamespace, simpleComponent.getType());
             p.setXsdType(xsdTypeQName);
@@ -1736,7 +1736,7 @@
         }
 
         //name annotation
-        String nameValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
+        String nameValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
         if (nameValue != null) {
             //itemNameToSDOName.put(sdoTypeName, nameValue);
             p.setName(nameValue);
@@ -1752,7 +1752,7 @@
         }
 
         // propertyType annotation
-        String propertyTypeValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_PROPERTYTYPE_QNAME);
+        String propertyTypeValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_PROPERTYTYPE_QNAME);
         if (propertyTypeValue != null) {
             String uri = targetNamespace;
             int colonIndex = propertyTypeValue.indexOf(':');
@@ -1765,7 +1765,7 @@
             nonContainmentReference.setPropertyTypeURI(uri);
             nonContainmentReference.setOwningType(owningType);
             nonContainmentReference.setOwningProp(p);
-            String oppositePropValue = (String) simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_OPPOSITEPROPERTY_QNAME);
+            String oppositePropValue = simpleComponent.getAttributesMap().get(SDOConstants.SDOXML_OPPOSITEPROPERTY_QNAME);
 
             nonContainmentReference.setOppositePropName(oppositePropValue);
             getNonContainmentReferences().add(nonContainmentReference);
@@ -1810,9 +1810,9 @@
 
         Iterator<Type> iter = getGlobalRefs().keySet().iterator();
         while (iter.hasNext()) {
-            Object nextKey = iter.next();
+            Type nextKey = iter.next();
             java.util.List<GlobalRef> value = getGlobalRefs().get(nextKey);
-            java.util.List refsToRemove = new ArrayList();
+            java.util.List<GlobalRef> refsToRemove = new ArrayList<>();
             if (value != null) {
                 for (int i = 0; i < value.size(); i++) {
                     GlobalRef nextGlobalRef = value.get(i);
@@ -1831,7 +1831,7 @@
     private void addGlobalRef(GlobalRef ref) {
         java.util.List<GlobalRef> refs = getGlobalRefs().get(ref.getOwningType());
         if (null == refs) {
-            refs = new ArrayList<GlobalRef>();
+            refs = new ArrayList<>();
             refs.add(ref);
             getGlobalRefs().put(ref.getOwningType(), refs);
         } else {
@@ -1845,7 +1845,7 @@
      */
     private void initialize() {
         if (null == packageName) {
-            String packageValue = (String) rootSchema.getAttributesMap().get(SDOConstants.SDOJAVA_PACKAGE_QNAME);
+            String packageValue = rootSchema.getAttributesMap().get(SDOConstants.SDOJAVA_PACKAGE_QNAME);
             if (null != packageValue) {
                 packageName = packageValue;
             } else if ((null == rootSchema.getTargetNamespace()) || rootSchema.getTargetNamespace().equals(SDOConstants.EMPTY_STRING)) {
@@ -1905,7 +1905,7 @@
             return sdoType;
 
         } else {
-            String sdoName = (String) itemNameToSDOName.get(name);
+            String sdoName = itemNameToSDOName.get(name);
             if (sdoName != null) {
                 name = sdoName;
             }
@@ -1992,7 +1992,7 @@
         // Do not execute the following if theURI isn't the target namespace
         if (type == null && ((theURI != null && theURI.equals(targetNamespace)) || (theURI == null && targetNamespace == null))) {
             processGlobalItem(targetNamespace, defaultNamespace, qualifiedName);
-            String sdoName = (String) itemNameToSDOName.get(localName);
+            String sdoName = itemNameToSDOName.get(localName);
             if (sdoName != null) {
                 localName = sdoName;
             }
@@ -2032,14 +2032,14 @@
 
     public Map<QName, Type> getGeneratedTypes() {
         if (null == generatedTypes) {
-            generatedTypes = new HashMap<QName, Type>();
+            generatedTypes = new HashMap<>();
         }
         return generatedTypes;
     }
 
     public Map<QName, Property> getGeneratedGlobalElements() {
         if (null == generatedGlobalElements) {
-            generatedGlobalElements = new HashMap<QName, Property>();
+            generatedGlobalElements = new HashMap<>();
         }
         return generatedGlobalElements;
     }
@@ -2054,15 +2054,15 @@
 
     public Map<QName, Property> getGeneratedGlobalAttributes() {
         if (null == generatedGlobalAttributes) {
-            generatedGlobalAttributes = new HashMap<QName, Property>();
+            generatedGlobalAttributes = new HashMap<>();
         }
         return generatedGlobalAttributes;
     }
 
-    private void processSubstitutionGroups(Collection elements, String targetNamespace, String defaultNamespace) {
-        Iterator elementsIter = elements.iterator();
+    private void processSubstitutionGroups(Collection<Element> elements, String targetNamespace, String defaultNamespace) {
+        Iterator<Element> elementsIter = elements.iterator();
         while (elementsIter.hasNext()) {
-            Element nextElement = (Element) elementsIter.next();
+            Element nextElement = elementsIter.next();
             if (nextElement.getSubstitutionGroup() != null) {
                 String substitutionGroup = nextElement.getSubstitutionGroup();
                 String localName = null;
@@ -2082,7 +2082,7 @@
 
                 if (rootProp != null && thisProperty != null) {
                     if (rootProp.getSubstitutableElements() == null) {
-                        rootProp.setSubstitutableElements(new java.util.ArrayList<SDOProperty>());
+                        rootProp.setSubstitutableElements(new java.util.ArrayList<>());
                         rootProp.setSubstitutable(true);
                     }
                     rootProp.getSubstitutableElements().add(thisProperty);
@@ -2100,7 +2100,7 @@
         if (value != null) {
             return (SDOType) value;
         } else {
-            String sdoName = (String) itemNameToSDOName.get(typeName);
+            String sdoName = itemNameToSDOName.get(typeName);
             if (sdoName != null) {
                 return getTypeForName(targetNamespace, defaultNamespace, sdoName);
             } else {
@@ -2138,13 +2138,13 @@
             localName = qualifiedName;
         }
 
-        SimpleType simpleType = (SimpleType) rootSchema.getTopLevelSimpleTypes().get(localName);
+        SimpleType simpleType = rootSchema.getTopLevelSimpleTypes().get(localName);
         if (simpleType == null) {
-            ComplexType complexType = (ComplexType) rootSchema.getTopLevelComplexTypes().get(localName);
+            ComplexType complexType = rootSchema.getTopLevelComplexTypes().get(localName);
             if (complexType == null) {
-                Element element = (Element) rootSchema.getTopLevelElements().get(localName);
+                Element element = rootSchema.getTopLevelElements().get(localName);
                 if (element == null) {
-                    Attribute attribute = (Attribute) rootSchema.getTopLevelAttributes().get(localName);
+                    Attribute attribute = rootSchema.getTopLevelAttributes().get(localName);
                     if (attribute != null) {
                         processGlobalAttribute(targetNamespace, defaultNamespace, attribute);
                     }
@@ -2204,10 +2204,10 @@
            closeSource(xsdSource);
        }
        //populate Imports
-       java.util.List imports = schema.getImports();
-       Iterator iter = imports.iterator();
+       java.util.List<Import> imports = schema.getImports();
+       Iterator<Import> iter = imports.iterator();
        while (iter.hasNext()) {
-           Import nextImport = (Import) iter.next();
+           Import nextImport = iter.next();
            Source referencedSchema = getReferencedSchema(xsdSource, nextImport.getNamespace(), nextImport.getSchemaLocation(), schemaResolverWrapper);
            if (referencedSchema != null) {
                Schema importedSchema = getSchema(referencedSchema, schemaResolverWrapper, true);
@@ -2216,10 +2216,10 @@
        }
 
        //populate includes
-       java.util.List includes = schema.getIncludes();
-       Iterator includesIter = includes.iterator();
+       java.util.List<Include> includes = schema.getIncludes();
+       Iterator<Include> includesIter = includes.iterator();
        while (includesIter.hasNext()) {
-            Include nextInclude = (Include) includesIter.next();
+            Include nextInclude = includesIter.next();
 
             Source referencedSchema = getReferencedSchema(xsdSource, schema.getTargetNamespace(), nextInclude.getSchemaLocation(), schemaResolverWrapper);
             if (referencedSchema != null) {
@@ -2232,7 +2232,7 @@
     }
 
     private void closeSource(Source source){
-        if(source != null && source instanceof StreamSource){
+        if(source instanceof StreamSource){
             StreamSource ss = (StreamSource)source;
             try{
                 if(ss.getInputStream() != null){
@@ -2309,7 +2309,7 @@
         return uri;
     }
 
-    public class NonContainmentReference {
+    public static class NonContainmentReference {
         private SDOType owningType;
         private SDOProperty owningProp;
         private String propertyTypeName;
@@ -2363,7 +2363,7 @@
         }
     }
 
-    public class GlobalRef {
+    public static class GlobalRef {
         private SDOType owningType;
         private boolean isElement;
         private String uri;
@@ -2419,14 +2419,14 @@
 
     private java.util.List<NonContainmentReference> getNonContainmentReferences() {
         if (null == nonContainmentReferences) {
-            nonContainmentReferences = new ArrayList<NonContainmentReference>();
+            nonContainmentReferences = new ArrayList<>();
         }
         return nonContainmentReferences;
     }
 
     private Map<Type, java.util.List<GlobalRef>> getGlobalRefs() {
         if (null == globalRefs) {
-            globalRefs = new HashMap<Type, java.util.List<GlobalRef>>();
+            globalRefs = new HashMap<>();
         }
         return globalRefs;
     }
@@ -2465,7 +2465,7 @@
      * Return the SDOType (new or existing) corresponding to this complex type.
      */
     private SDOType preprocessComplexType(ComplexType complexType, Schema schema) {
-        String typeName = (String) complexType.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
+        String typeName = complexType.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
         if(null == typeName) {
             typeName = complexType.getName();
         }
@@ -2498,7 +2498,7 @@
      * Return the SDODataType (new or existing) corresponding to this simple type.
      */
     private SDODataType preprocessSimpleType(SimpleType simpleType, Schema schema) {
-        String typeName = (String) simpleType.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
+        String typeName = simpleType.getAttributesMap().get(SDOConstants.SDOXML_NAME_QNAME);
         if(null == typeName) {
             typeName = simpleType.getName();
         }
@@ -2516,7 +2516,7 @@
                 return (SDODataType)existingType;
             }
             sdoDataType = new SDODataType(typeURI, typeName, sdoTypeHelper);
-            String instanceClassValue = (String) simpleType.getAttributesMap().get(SDOConstants.SDOJAVA_INSTANCECLASS_QNAME);
+            String instanceClassValue = simpleType.getAttributesMap().get(SDOConstants.SDOJAVA_INSTANCECLASS_QNAME);
             if (instanceClassValue != null) {
                 sdoDataType.setInstanceProperty(SDOConstants.JAVA_CLASS_PROPERTY, instanceClassValue);
             }
diff --git a/utils/eclipselink.dbws.builder.test.oracle/pom.xml b/utils/eclipselink.dbws.builder.test.oracle/pom.xml
index bcbb106..7a5ee1e 100644
--- a/utils/eclipselink.dbws.builder.test.oracle/pom.xml
+++ b/utils/eclipselink.dbws.builder.test.oracle/pom.xml
@@ -31,6 +31,9 @@
     </parent>
 
     <properties>
+        <comp.xlint>-Xlint:all</comp.xlint>
+        <comp.xdoclint>-Xdoclint:all,-missing</comp.xdoclint>
+        <comp.test.xlint>-Xlint:all</comp.test.xlint>
         <test-skip-dbws-builder-oracle>${skipTests}</test-skip-dbws-builder-oracle>
     </properties>
 
@@ -103,6 +106,15 @@
         <plugins>
             <plugin>
                 <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <compilerArgs>
+                        <arg>-Werror</arg>
+                    </compilerArgs>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
                 <artifactId>maven-surefire-plugin</artifactId>
                 <configuration>
                     <skip>true</skip>
diff --git a/utils/eclipselink.dbws.builder.test.oracle/src/it/java/dbws/testing/shadowddlgeneration/oldjpub/ViewCache.java b/utils/eclipselink.dbws.builder.test.oracle/src/it/java/dbws/testing/shadowddlgeneration/oldjpub/ViewCache.java
index 50b3adc..2f9d5c5 100644
--- a/utils/eclipselink.dbws.builder.test.oracle/src/it/java/dbws/testing/shadowddlgeneration/oldjpub/ViewCache.java
+++ b/utils/eclipselink.dbws.builder.test.oracle/src/it/java/dbws/testing/shadowddlgeneration/oldjpub/ViewCache.java
@@ -39,6 +39,8 @@
 @SuppressWarnings({"unchecked","rawtypes"})
 public class ViewCache implements Externalizable {
 
+    private static final long serialVersionUID = 5009092516275895424L;
+
     static final String VIEW_CACHE_PREFIX = "viewcachefor";
     public static final String PARAMETER_USER = "USER";
     public static final String PARAMETER_ALL = "ALL";
diff --git a/utils/eclipselink.dbws.builder.test.oracle/src/it/java/dbws/testing/simpletablewithnestedsql/SimpleTableWithNestedSQLTestSuite.java b/utils/eclipselink.dbws.builder.test.oracle/src/it/java/dbws/testing/simpletablewithnestedsql/SimpleTableWithNestedSQLTestSuite.java
index 0c98c3f..d6f87c0 100644
--- a/utils/eclipselink.dbws.builder.test.oracle/src/it/java/dbws/testing/simpletablewithnestedsql/SimpleTableWithNestedSQLTestSuite.java
+++ b/utils/eclipselink.dbws.builder.test.oracle/src/it/java/dbws/testing/simpletablewithnestedsql/SimpleTableWithNestedSQLTestSuite.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
@@ -209,9 +209,9 @@
         XMLUnmarshaller unmarshaller = xmlContext2.createUnmarshaller();
         Schema schema = (Schema)unmarshaller.unmarshal(new StringReader(sw.toString()));
         ComplexType findByNameResponseType =
-            (ComplexType) schema.getTopLevelComplexTypes().get(FINDBYNAME_RESPONSETYPE);
-        Element result = (Element)findByNameResponseType.getSequence().getElements().get(0);
-        Element unnamed = (Element)result.getComplexType().getSequence().getElements().get(0);
+                schema.getTopLevelComplexTypes().get(FINDBYNAME_RESPONSETYPE);
+        Element result = findByNameResponseType.getSequence().getElements().get(0);
+        Element unnamed = result.getComplexType().getSequence().getElements().get(0);
         assertTrue("wrong refType for " + FINDBYNAME_RESPONSETYPE, TABLE_ALIAS.equals(unnamed.getRef()));
     }
 }
diff --git a/utils/org.eclipse.persistence.dbws.builder/src/it/java/dbws/testing/simpletablewithnestedsql/SimpleTableWithNestedSQLTestSuite.java b/utils/org.eclipse.persistence.dbws.builder/src/it/java/dbws/testing/simpletablewithnestedsql/SimpleTableWithNestedSQLTestSuite.java
index 1b7dc9b..ac9216e 100644
--- a/utils/org.eclipse.persistence.dbws.builder/src/it/java/dbws/testing/simpletablewithnestedsql/SimpleTableWithNestedSQLTestSuite.java
+++ b/utils/org.eclipse.persistence.dbws.builder/src/it/java/dbws/testing/simpletablewithnestedsql/SimpleTableWithNestedSQLTestSuite.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
@@ -205,9 +205,9 @@
             unmarshaller = xmlContext2.createUnmarshaller();
             Schema schema = (Schema)unmarshaller.unmarshal(new StringReader(sw.toString()));
             ComplexType findByNameResponseType =
-                (ComplexType) schema.getTopLevelComplexTypes().get(FINDBYNAME_RESPONSETYPE);
-            Element result = (Element)findByNameResponseType.getSequence().getElements().get(0);
-            Element unnamed = (Element)result.getComplexType().getSequence().getElements().get(0);
+                    schema.getTopLevelComplexTypes().get(FINDBYNAME_RESPONSETYPE);
+            Element result = findByNameResponseType.getSequence().getElements().get(0);
+            Element unnamed = result.getComplexType().getSequence().getElements().get(0);
             assertTrue("wrong refType for " + FINDBYNAME_RESPONSETYPE,
                 TABLE_ALIAS.equals(unnamed.getRef()));
         }
