diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassDescriptor.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassDescriptor.java
index b7632b7..a04a542 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassDescriptor.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/descriptors/ClassDescriptor.java
@@ -2613,7 +2613,7 @@
      */
     public Map<DatabaseTable, Set<DatabaseTable>> getMultipleTableForeignKeys() {
         if (multipleTableForeignKeys == null) {
-            multipleTableForeignKeys = new HashMap(5);
+            multipleTableForeignKeys = new HashMap<>(5);
         }
         return multipleTableForeignKeys;
     }
@@ -4790,11 +4790,8 @@
      * INTERNAL:
      * This method is used by the  XML Deployment ClassDescriptor to read and write these mappings
      */
-    public void setForeignKeyFieldNamesForMultipleTable(Vector associations) throws DescriptorException {
-        Enumeration foreignKeys = associations.elements();
-
-        while (foreignKeys.hasMoreElements()) {
-            Association association = (Association) foreignKeys.nextElement();
+    public void setForeignKeyFieldNamesForMultipleTable(List<Association> associations) throws DescriptorException {
+        for (Association association: associations) {
             addForeignKeyFieldNameForMultipleTable((String) association.getKey(), (String) association.getValue());
         }
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/AccessLevel.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/AccessLevel.java
index 9fcd479..79500d7 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/AccessLevel.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/AccessLevel.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
@@ -201,7 +201,6 @@
                 generator.write(" ");
             }
             generator.write("synchronized");
-            needsSpace = true;
         }
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/AttributeDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/AttributeDefinition.java
index f7ee5ee..e33b2f8 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/AttributeDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/AttributeDefinition.java
@@ -34,16 +34,16 @@
      * (and adding the appropriate import) if the type is
      * unambiguous.
      */
-    private void adjustInitialValue(Map typeNameMap) {
+    private void adjustInitialValue(Map<String, Set<String>> typeNameMap) {
         if (getInitialValue() == null) {
             return;
         }
 
         StringBuilder initialValue = new StringBuilder(getInitialValue());
-        Set typeNames = parseForTypeNames(initialValue.toString());
+        Set<String> typeNames = parseForTypeNames(initialValue.toString());
 
-        for (Iterator i = typeNames.iterator(); i.hasNext();) {
-            String typeName = (String)i.next();
+        for (Iterator<String> i = typeNames.iterator(); i.hasNext();) {
+            String typeName = i.next();
             String adjustedTypeName = adjustTypeName(typeName, typeNameMap);
 
             if (!typeName.equals(adjustedTypeName)) {
@@ -59,7 +59,7 @@
         setInitialValue(initialValue.toString());
     }
 
-    protected void adjustTypeNames(Map typeNameMap) {
+    protected void adjustTypeNames(Map<String, Set<String>> typeNameMap) {
         adjustInitialValue(typeNameMap);
     }
 
@@ -72,11 +72,11 @@
     /**
      * Used for calculating imports.  @see org.eclipse.persistence.internal.codegen.ClassDefinition#calculateImports()
      */
-    protected void putTypeNamesInMap(Map typeNameMap) {
+    protected void putTypeNamesInMap(Map<String, Set<String>> typeNameMap) {
         putTypeNameInMap(getTypeName(), typeNameMap);
 
-        for (Iterator i = parseForTypeNames(getInitialValue()).iterator(); i.hasNext();) {
-            putTypeNameInMap((String)i.next(), typeNameMap);
+        for (Iterator<String> i = parseForTypeNames(getInitialValue()).iterator(); i.hasNext();) {
+            putTypeNameInMap(i.next(), typeNameMap);
         }
     }
 
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 2088b6e..7095332 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
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -35,24 +35,24 @@
  */
 public class ClassDefinition extends CodeDefinition {
     protected String packageName;
-    protected Vector imports;
+    protected Vector<String> imports;
     protected int type;
     public static final int CLASS_TYPE = 1;
     public static final int INTERFACE_TYPE = 2;
     protected String superClass;
-    protected Vector interfaces;
-    protected Vector attributes;
-    protected Vector methods;
-    protected Vector innerClasses;
+    protected Vector<String> interfaces;
+    protected Vector<AttributeDefinition> attributes;
+    protected Vector<MethodDefinition> methods;
+    protected Vector<ClassDefinition> innerClasses;
 
     public ClassDefinition() {
         this.packageName = "";
-        this.imports = new Vector(3);
+        this.imports = new Vector<>(3);
         this.type = CLASS_TYPE;
-        this.interfaces = new Vector(3);
-        this.attributes = new Vector();
-        this.methods = new Vector();
-        this.innerClasses = new Vector(3);
+        this.interfaces = new Vector<>(3);
+        this.attributes = new Vector<>();
+        this.methods = new Vector<>();
+        this.innerClasses = new Vector<>(3);
     }
 
     public void addAttribute(AttributeDefinition attribute) {
@@ -69,8 +69,8 @@
         }
     }
 
-    private void addImports(Map typeNameMap) {
-        for (Map.Entry<String, Set<String>> entry : (Set<Map.Entry<String, Set<String>>>) typeNameMap.entrySet()) {
+    private void addImports(Map<String, Set<String>> typeNameMap) {
+        for (Map.Entry<String, Set<String>> entry : typeNameMap.entrySet()) {
             String shortName = entry.getKey();
             Set<String> packageNames = entry.getValue();
 
@@ -100,36 +100,36 @@
         getMethods().addElement(method);
     }
 
-    private void addTypeNamesToMap(HashMap typeNameMap) {
+    private void addTypeNamesToMap(HashMap<String, Set<String>> typeNameMap) {
         putTypeNameInMap(getSuperClass(), typeNameMap);
 
-        for (Iterator i = getInterfaces().iterator(); i.hasNext();) {
-            putTypeNameInMap((String)i.next(), typeNameMap);
+        for (Iterator<String> i = getInterfaces().iterator(); i.hasNext();) {
+            putTypeNameInMap(i.next(), typeNameMap);
         }
 
-        for (Iterator i = getAttributes().iterator(); i.hasNext();) {
-            ((AttributeDefinition)i.next()).putTypeNamesInMap(typeNameMap);
+        for (Iterator<AttributeDefinition> i = getAttributes().iterator(); i.hasNext();) {
+            (i.next()).putTypeNamesInMap(typeNameMap);
         }
 
-        for (Iterator i = getMethods().iterator(); i.hasNext();) {
-            ((MethodDefinition)i.next()).putTypeNamesInMap(typeNameMap);
+        for (Iterator<MethodDefinition> i = getMethods().iterator(); i.hasNext();) {
+            i.next().putTypeNamesInMap(typeNameMap);
         }
     }
 
-    private void adjustTypeNames(HashMap typeNameMap) {
+    private void adjustTypeNames(HashMap<String, Set<String>> typeNameMap) {
         setSuperClass(adjustTypeName(getSuperClass(), typeNameMap));
 
-        for (Iterator i = new Vector(getInterfaces()).iterator(); i.hasNext();) {
-            String interfaceName = (String)i.next();
+        for (Iterator<String> i = new Vector<>(getInterfaces()).iterator(); i.hasNext();) {
+            String interfaceName = i.next();
             replaceInterface(interfaceName, adjustTypeName(interfaceName, typeNameMap));
         }
 
-        for (Iterator i = getAttributes().iterator(); i.hasNext();) {
-            ((AttributeDefinition)i.next()).adjustTypeNames(typeNameMap);
+        for (Iterator<AttributeDefinition> i = getAttributes().iterator(); i.hasNext();) {
+            (i.next()).adjustTypeNames(typeNameMap);
         }
 
-        for (Iterator i = getMethods().iterator(); i.hasNext();) {
-            ((MethodDefinition)i.next()).adjustTypeNames(typeNameMap);
+        for (Iterator<MethodDefinition> i = getMethods().iterator(); i.hasNext();) {
+            i.next().adjustTypeNames(typeNameMap);
         }
     }
 
@@ -149,7 +149,7 @@
     public void calculateImports() {
         // Calculate type name map for class definition.
         // Key - short type name, Value - Set of package names for that type name
-        HashMap typeNameMap = new HashMap();
+        HashMap<String, Set<String>> typeNameMap = new HashMap<>();
         addTypeNamesToMap(typeNameMap);
 
         // Go back through class def, pulling out imports and removing package names from
@@ -164,23 +164,23 @@
         return getMethods().contains(method);
     }
 
-    protected Vector getAttributes() {
+    protected Vector<AttributeDefinition> getAttributes() {
         return attributes;
     }
 
-    protected Vector getImports() {
+    protected Vector<String> getImports() {
         return imports;
     }
 
-    protected Vector getInnerClasses() {
+    protected Vector<ClassDefinition> getInnerClasses() {
         return innerClasses;
     }
 
-    protected Vector getInterfaces() {
+    protected Vector<String> getInterfaces() {
         return interfaces;
     }
 
-    protected Vector getMethods() {
+    protected Vector<MethodDefinition> getMethods() {
         return methods;
     }
 
@@ -208,11 +208,11 @@
         }
     }
 
-    private void setImports(Vector imports) {
+    private void setImports(Vector<String> imports) {
         this.imports = imports;
     }
 
-    private void setMethods(Vector methods) {
+    private void setMethods(Vector<MethodDefinition> methods) {
         this.methods = methods;
     }
 
@@ -233,29 +233,29 @@
     }
 
     protected void sortImports() {
-        setImports(new Vector(new TreeSet(getImports())));
+        setImports(new Vector<>(new TreeSet<>(getImports())));
     }
 
     protected void sortMethods() {
         //Object methodArray[] = getMethods().toArray();
-        Object[] methodArray = Helper.arrayFromVector(getMethods());
+        MethodDefinition[] methodArray = getMethods().toArray(new MethodDefinition[0]);
 
-        Comparator comparison = new Comparator() {
+        Comparator<MethodDefinition> comparison = new Comparator<MethodDefinition>() {
             @Override
-            public int compare(Object first, Object second) {
-                if (((MethodDefinition)first).isConstructor()) {
+            public int compare(MethodDefinition first, MethodDefinition second) {
+                if (first.isConstructor()) {
                     return -1;
-                } else if (((MethodDefinition)second).isConstructor()) {
+                } else if (second.isConstructor()) {
                     return 1;
                 } else {
-                    return ((MethodDefinition)first).getName().compareTo(((MethodDefinition)second).getName());
+                    return first.getName().compareTo(second.getName());
                 }
             }
         };
 
         Arrays.sort(methodArray, comparison);
 
-        Vector sortedMethods = new Vector(getMethods().size());
+        Vector<MethodDefinition> sortedMethods = new Vector<>(getMethods().size());
         for (int index = 0; index < methodArray.length; index++) {
             sortedMethods.addElement(methodArray[index]);
         }
@@ -275,8 +275,8 @@
             generator.cr();
         }
 
-        for (Enumeration importsEnum = getImports().elements(); importsEnum.hasMoreElements();) {
-            String importLine = (String)importsEnum.nextElement();
+        for (Enumeration<String> importsEnum = getImports().elements(); importsEnum.hasMoreElements();) {
+            String importLine = importsEnum.nextElement();
             generator.write("import ");
             generator.write(importLine);
             generator.writeln(";");
@@ -308,9 +308,9 @@
         }
 
         boolean isFirst = true;
-        for (Enumeration interfacesEnum = getInterfaces().elements();
-                 interfacesEnum.hasMoreElements();) {
-            String interfaceName = (String)interfacesEnum.nextElement();
+        for (Enumeration<String> interfacesEnum = getInterfaces().elements();
+             interfacesEnum.hasMoreElements();) {
+            String interfaceName = interfacesEnum.nextElement();
 
             if (isFirst) {
                 if (isInterface()) {
@@ -331,10 +331,10 @@
         generator.writeln(" {");
         generator.cr();
 
-        for (Enumeration attributesEnum = getAttributes().elements();
-                 attributesEnum.hasMoreElements();) {
+        for (Enumeration<AttributeDefinition> attributesEnum = getAttributes().elements();
+             attributesEnum.hasMoreElements();) {
             generator.tab();
-            ((AttributeDefinition)attributesEnum.nextElement()).write(generator);
+            (attributesEnum.nextElement()).write(generator);
             generator.cr();
         }
 
@@ -342,16 +342,16 @@
             generator.cr();
         }
 
-        for (Enumeration methodsEnum = getMethods().elements(); methodsEnum.hasMoreElements();) {
-            ((MethodDefinition)methodsEnum.nextElement()).write(generator);
+        for (Enumeration<MethodDefinition> methodsEnum = getMethods().elements(); methodsEnum.hasMoreElements();) {
+            methodsEnum.nextElement().write(generator);
             generator.cr();
             generator.cr();
         }
 
         //used for Oc4j code gen
-        for (Enumeration innerClassesEnum = getInnerClasses().elements();
-                 innerClassesEnum.hasMoreElements();) {
-            ((ClassDefinition)innerClassesEnum.nextElement()).write(generator);
+        for (Enumeration<ClassDefinition> innerClassesEnum = getInnerClasses().elements();
+             innerClassesEnum.hasMoreElements();) {
+            (innerClassesEnum.nextElement()).write(generator);
             generator.cr();
             generator.cr();
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/CodeDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/CodeDefinition.java
index d430157..f4ae7c2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/CodeDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/CodeDefinition.java
@@ -39,7 +39,7 @@
         this.comment = "";
     }
 
-    private static boolean adjustmentNeededForType(String typeName, Map typeNameMap) {
+    private static boolean adjustmentNeededForType(String typeName, Map<String, Set<String>> typeNameMap) {
         if ((typeName == null) || typeName.equals("")) {
             return false;
         }
@@ -48,7 +48,7 @@
             return false;
         }
 
-        Set packages = (Set)typeNameMap.get(shortName(typeName));
+        Set<String> packages = typeNameMap.get(shortName(typeName));
         return (packages == null) || (packages.size() <= 1);
     }
 
@@ -63,7 +63,7 @@
      *
      * (e.g. int -&gt; int, java.util.Vector -&gt; Vector, java.lang.Boolean[] -&gt; Boolean[], etc.)
      */
-    protected static String adjustTypeName(String typeName, Map typeNameMap) {
+    protected static String adjustTypeName(String typeName, Map<String, Set<String>> typeNameMap) {
         if (adjustmentNeededForType(typeName, typeNameMap)) {
             putTypeNameInMap(typeName, typeNameMap);
             return typeName.substring(packageName(typeName).length() + 1);
@@ -78,8 +78,8 @@
      * indirect collection types.
      * All other searches too intractable at this point.
      */
-    protected static Set parseForTypeNames(String longString) {
-        Set typeNames = new HashSet();
+    protected static Set<String> parseForTypeNames(String longString) {
+        Set<String> typeNames = new HashSet<>();
 
         if (longString != null) {
             typeNames.addAll(parseForTypeNamesInPackage(longString, JAVA_LANG_PACKAGE_NAME));
@@ -90,8 +90,8 @@
         return typeNames;
     }
 
-    private static Set parseForTypeNamesInPackage(String longString, String packageName) {
-        Set typeNames = new HashSet();
+    private static Set<String> parseForTypeNamesInPackage(String longString, String packageName) {
+        Set<String> typeNames = new HashSet<>();
         int packageStartIndex = longString.indexOf(packageName);
 
         while (packageStartIndex != -1) {
@@ -116,7 +116,7 @@
     /**
      * Used for calculating imports.  @see org.eclipse.persistence.internal.codegen.ClassDefinition#calculateImports()
      */
-    protected static void putTypeNameInMap(String typeName, Map typeNameMap) {
+    protected static void putTypeNameInMap(String typeName, Map<String, Set<String>> typeNameMap) {
         if ((typeName == null) || typeName.equals("")) {
             return;
         }
@@ -125,13 +125,13 @@
         String packageName = packageName(typeName);
 
         if (packageName.length() > 0) {
-            Set packageNames;
+            Set<String> packageNames;
 
             if (typeNameMap.get(shortName) == null) {
-                packageNames = new HashSet();
+                packageNames = new HashSet<>();
                 typeNameMap.put(shortName, packageNames);
             } else {
-                packageNames = (Set)typeNameMap.get(shortName);
+                packageNames = typeNameMap.get(shortName);
             }
 
             // There is no package name.  The package is the default package.
@@ -225,7 +225,7 @@
                 nextLineIndex = comment.indexOf(cr, lastLineIndex);
             }
             generator.write(" * ");
-            generator.writeln(comment.substring(lastLineIndex, comment.length()));
+            generator.writeln(comment.substring(lastLineIndex));
             generator.writeln(" */");
             generator.cr();
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/CodeGenerator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/CodeGenerator.java
index de64657..7942f1c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/CodeGenerator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/CodeGenerator.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -132,7 +132,7 @@
             if (index != -1) {
                 String packageName = typeName.substring(index);
                 if (getCurrentClass().getImports().contains(packageName)) {
-                    localTypeName = typeName.substring(index, typeName.length());
+                    localTypeName = typeName.substring(index);
                 }
             }
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/HierarchyNode.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/HierarchyNode.java
index cd20717..5555162 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/HierarchyNode.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/HierarchyNode.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
@@ -23,18 +23,18 @@
     //  the class that this node represents
     public String className;
     public HierarchyNode parent;
-    public ArrayList children;
+    public List<HierarchyNode> children;
 
     /**
      * This member will hold the different definition types that should be implemented by the code generated children
      * Used mostly in CMP code generation
      */
-    public ArrayList definitions;
+    public List<?> definitions;
 
     public HierarchyNode(String className) {
         this.className = className;
-        this.children = new ArrayList();
-        this.definitions = new ArrayList();
+        this.children = new ArrayList<>();
+        this.definitions = new ArrayList<>();
     }
 
     public void setParent(HierarchyNode parent) {
@@ -48,7 +48,7 @@
         }
     }
 
-    public List getChildren() {
+    public List<HierarchyNode> getChildren() {
         return this.children;
     }
 
@@ -62,7 +62,6 @@
 
     @Override
     public String toString() {
-        String result = "HierarchyNode:\n\t" + className + "\n" + children + "\n end HierarchyNode\n";
-        return result;
+        return "HierarchyNode:\n\t" + className + "\n" + children + "\n end HierarchyNode\n";
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/InheritanceHierarchyBuilder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/InheritanceHierarchyBuilder.java
index e1aeef5..574fece 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/InheritanceHierarchyBuilder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/InheritanceHierarchyBuilder.java
@@ -24,6 +24,10 @@
  */
 public class InheritanceHierarchyBuilder {
 
+    private InheritanceHierarchyBuilder() {
+        //no instance please
+    }
+
     /**
      * INTERNAL:
      * Based on a class name either return a pre-existing node from the hierarchyTree or build one and
@@ -38,7 +42,7 @@
         return node;
     }
 
-    public static Hashtable buildInheritanceHierarchyTree(Project project) {
+    public static Hashtable<String, HierarchyNode> buildInheritanceHierarchyTree(Project project) {
         Map<Class<?>, ClassDescriptor> descriptors = project.getDescriptors();
         Hashtable<String, HierarchyNode> hierarchyTree = new Hashtable<>(descriptors.size());
         for (Iterator<ClassDescriptor> descriptorIterator = descriptors.values().iterator();
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 3a75ce4..9c19977 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
@@ -27,16 +27,16 @@
     protected boolean isAbstract;
     protected boolean isConstructor;
     protected String returnType;
-    protected Vector argumentNames;
-    protected Vector lines;
-    protected Vector exceptions;
+    protected Vector<String> argumentNames;
+    protected Vector<String> lines;
+    protected Vector<String> exceptions;
     protected StringBuffer storedBuffer;
 
     protected MethodDefinition() {
         this.isConstructor = false;
         this.returnType = "void";
-        this.lines = new Vector();
-        this.exceptions = new Vector();
+        this.lines = new Vector<>();
+        this.exceptions = new Vector<>();
         this.storedBuffer = new StringBuffer();
     }
 
@@ -57,9 +57,9 @@
         this.storedBuffer.append(partOfLine);
     }
 
-    private void adjustExceptions(Map typeNameMap) {
-        for (Iterator i = new Vector(getExceptions()).iterator(); i.hasNext();) {
-            String exceptionName = (String)i.next();
+    private void adjustExceptions(Map<String, Set<String>> typeNameMap) {
+        for (Iterator<String> i = new Vector<>(getExceptions()).iterator(); i.hasNext();) {
+            String exceptionName = i.next();
             String adjustedExceptionName = adjustTypeName(exceptionName, typeNameMap);
 
             if (!exceptionName.equals(adjustedExceptionName)) {
@@ -73,12 +73,12 @@
      * (and adding the appropriate import) if the type is
      * unambiguous.
      */
-    private void adjustLine(String line, Map typeNameMap) {
+    private void adjustLine(String line, Map<String, Set<String>> typeNameMap) {
         StringBuffer lineInProgress = new StringBuffer(line);
-        Set typeNames = parseForTypeNames(lineInProgress.toString());
+        Set<String> typeNames = parseForTypeNames(lineInProgress.toString());
 
-        for (Iterator i = typeNames.iterator(); i.hasNext();) {
-            String typeName = (String)i.next();
+        for (Iterator<String> i = typeNames.iterator(); i.hasNext();) {
+            String typeName = i.next();
             String adjustedTypeName = adjustTypeName(typeName, typeNameMap);
 
             if (!typeName.equals(adjustedTypeName)) {
@@ -94,13 +94,13 @@
         replaceLine(line, lineInProgress.toString());
     }
 
-    private void adjustLines(Map typeNameMap) {
-        for (Iterator i = new Vector(getLines()).iterator(); i.hasNext();) {
-            adjustLine((String)i.next(), typeNameMap);
+    private void adjustLines(Map<String, Set<String>> typeNameMap) {
+        for (Iterator<String> i = new Vector<>(getLines()).iterator(); i.hasNext();) {
+            adjustLine(i.next(), typeNameMap);
         }
     }
 
-    private void adjustReturnType(Map typeNameMap) {
+    private void adjustReturnType(Map<String, Set<String>> typeNameMap) {
         String adjustedReturnType = adjustTypeName(getReturnType(), typeNameMap);
 
         if (!getReturnType().equals(adjustedReturnType)) {
@@ -108,7 +108,7 @@
         }
     }
 
-    protected void adjustTypeNames(Map typeNameMap) {
+    protected void adjustTypeNames(Map<String, Set<String>> typeNameMap) {
         adjustReturnType(typeNameMap);
         adjustExceptions(typeNameMap);
         adjustLines(typeNameMap);
@@ -168,18 +168,18 @@
         return false;
     }
 
-    protected Vector getArgumentNames() {
+    protected Vector<String> getArgumentNames() {
         if (this.argumentNames == null) {
-            this.argumentNames = new Vector(5);
+            this.argumentNames = new Vector<>(5);
         }
         return argumentNames;
     }
 
     public String getArgumentName(int index) {
-        return (String)getArgumentNames().get(index);
+        return getArgumentNames().get(index);
     }
 
-    public Iterator argumentNames() {
+    public Iterator<String> argumentNames() {
         return getArgumentNames().iterator();
     }
 
@@ -187,15 +187,15 @@
         return getArgumentNames().size();
     }
 
-    protected abstract Vector getArgumentTypeNames();
+    protected abstract Vector<String> getArgumentTypeNames();
 
-    protected abstract Vector getArgumentTypes();
+    protected abstract Vector<String> getArgumentTypes();
 
-    public Vector getLines() {
+    public Vector<String> getLines() {
         return lines;
     }
 
-    protected Vector getExceptions() {
+    protected Vector<String> getExceptions() {
         return this.exceptions;
     }
 
@@ -233,15 +233,15 @@
     /**
      * Used for calculating imports.  @see org.eclipse.persistence.internal.codegen.ClassDefinition#calculateImports()
      */
-    protected void putTypeNamesInMap(Map typeNameMap) {
+    protected void putTypeNamesInMap(Map<String, Set<String>> typeNameMap) {
         putTypeNameInMap(getReturnType(), typeNameMap);
 
-        for (Iterator i = getExceptions().iterator(); i.hasNext();) {
-            putTypeNameInMap((String)i.next(), typeNameMap);
+        for (Iterator<String> i = getExceptions().iterator(); i.hasNext();) {
+            putTypeNameInMap(i.next(), typeNameMap);
         }
 
-        for (Iterator i = getArgumentTypeNames().iterator(); i.hasNext();) {
-            putTypeNameInMap((String)i.next(), typeNameMap);
+        for (Iterator<String> i = getArgumentTypeNames().iterator(); i.hasNext();) {
+            putTypeNameInMap(i.next(), typeNameMap);
         }
     }
 
@@ -296,7 +296,7 @@
 
             generator.cr();
 
-            for (Enumeration linesEnum = getLines().elements(); linesEnum.hasMoreElements();) {
+            for (Enumeration<String> linesEnum = getLines().elements(); linesEnum.hasMoreElements();) {
                 generator.tab();
                 generator.writeln(linesEnum.nextElement());
             }
@@ -310,7 +310,7 @@
     protected void writeThrowsClause(CodeGenerator generator) {
         generator.write(" throws ");
 
-        for (Iterator exceptionIterator = this.exceptions.iterator(); exceptionIterator.hasNext();) {
+        for (Iterator<String> exceptionIterator = this.exceptions.iterator(); exceptionIterator.hasNext();) {
             generator.write(exceptionIterator.next());
 
             if (exceptionIterator.hasNext()) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/NonreflectiveAttributeDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/NonreflectiveAttributeDefinition.java
index 4612549..a3ae03d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/NonreflectiveAttributeDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/NonreflectiveAttributeDefinition.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.codegen;
 
 import java.util.Map;
+import java.util.Set;
 
 /**
  * INTERNAL:
@@ -31,7 +32,7 @@
         this.type = "";
     }
 
-    private void adjustType(Map typeNameMap) {
+    private void adjustType(Map<String, Set<String>> typeNameMap) {
         String adjustedTypeName = adjustTypeName(getTypeName(), typeNameMap);
 
         if (!getTypeName().equals(adjustedTypeName)) {
@@ -40,7 +41,7 @@
     }
 
     @Override
-    protected void adjustTypeNames(Map typeNameMap) {
+    protected void adjustTypeNames(Map<String, Set<String>> typeNameMap) {
         adjustType(typeNameMap);
         super.adjustTypeNames(typeNameMap);
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/NonreflectiveMethodDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/NonreflectiveMethodDefinition.java
index 930ad59..cc49040 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/NonreflectiveMethodDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/NonreflectiveMethodDefinition.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -25,11 +25,11 @@
  * @author Paul Fullbright
  */
 public class NonreflectiveMethodDefinition extends MethodDefinition {
-    protected Vector argumentTypeNames;
+    protected Vector<String> argumentTypeNames;
 
     public NonreflectiveMethodDefinition() {
         super();
-        this.argumentTypeNames = new Vector(5);
+        this.argumentTypeNames = new Vector<>(5);
     }
 
     public void addArgument(String argumentType, String argumentName) {
@@ -37,9 +37,9 @@
         getArgumentTypes().addElement(argumentType);
     }
 
-    private void adjustArgumentTypeNames(Map typeNameMap) {
-        for (Iterator i = new Vector(getArgumentTypeNames()).iterator(); i.hasNext();) {
-            String argumentTypeName = (String)i.next();
+    private void adjustArgumentTypeNames(Map<String, Set<String>> typeNameMap) {
+        for (Iterator<String> i = new Vector<>(getArgumentTypeNames()).iterator(); i.hasNext();) {
+            String argumentTypeName = i.next();
             String adjustedArgumentTypeName = adjustTypeName(argumentTypeName, typeNameMap);
 
             if (!argumentTypeName.equals(adjustedArgumentTypeName)) {
@@ -49,7 +49,7 @@
     }
 
     @Override
-    protected void adjustTypeNames(Map typeNameMap) {
+    protected void adjustTypeNames(Map<String, Set<String>> typeNameMap) {
         super.adjustTypeNames(typeNameMap);
         adjustArgumentTypeNames(typeNameMap);
     }
@@ -70,12 +70,12 @@
     }
 
     @Override
-    protected Vector getArgumentTypeNames() {
+    protected Vector<String> getArgumentTypeNames() {
         return getArgumentTypes();
     }
 
     @Override
-    public Vector getArgumentTypes() {
+    public Vector<String> getArgumentTypes() {
         return this.argumentTypeNames;
     }
 
@@ -89,7 +89,7 @@
     protected void writeArguments(CodeGenerator generator) {
         boolean isFirst = true;
         for (int index = 0; index < getArgumentTypes().size(); ++index) {
-            String argument = (String)getArgumentTypes().elementAt(index);
+            String argument = getArgumentTypes().elementAt(index);
             if (isFirst) {
                 isFirst = false;
             } else {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ReflectiveAttributeDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ReflectiveAttributeDefinition.java
index 41d2338..5fe52e6 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ReflectiveAttributeDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ReflectiveAttributeDefinition.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,13 +24,13 @@
  * @author Paul Fullbright
  */
 public class ReflectiveAttributeDefinition extends AttributeDefinition {
-    protected Class type;
+    protected Class<?> type;
 
     public ReflectiveAttributeDefinition() {
         this.type = null;
     }
 
-    public Class getType() {
+    public Class<?> getType() {
         return type;
     }
 
@@ -45,7 +45,7 @@
         }
     }
 
-    public void setType(Class type) {
+    public void setType(Class<?> type) {
         this.type = type;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ReflectiveMethodDefinition.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ReflectiveMethodDefinition.java
index c4a6b35..ec9c967 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ReflectiveMethodDefinition.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/codegen/ReflectiveMethodDefinition.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -26,18 +26,18 @@
  * @author Paul Fullbright
  */
 public class ReflectiveMethodDefinition extends MethodDefinition {
-    protected Vector argumentTypes;
-    protected Class type;
+    protected Vector<Class<?>> argumentTypes;
+    protected Class<?> type;
 
     public ReflectiveMethodDefinition() {
         super();
-        this.argumentTypes = new Vector(5);
+        this.argumentTypes = new Vector<>(5);
         this.type = null;
     }
 
-    public void addArgument(Class argumentType, String argumentName) {
+    public void addArgument(Class<?> argumentType, String argumentName) {
         getArgumentNames().addElement(argumentName);
-        getArgumentTypes().addElement(argumentType);
+        argumentTypes.addElement(argumentType);
     }
 
     @Override
@@ -58,26 +58,26 @@
     }
 
     @Override
-    protected Vector getArgumentTypeNames() {
-        Vector argumentTypeNames = new Vector();
+    protected Vector<String> getArgumentTypeNames() {
+        Vector<String> argumentTypeNames = new Vector<>();
 
-        for (Iterator i = getArgumentTypes().iterator(); i.hasNext();) {
-            argumentTypeNames.add(((Class)i.next()).getName());
+        for (Iterator<Class<?>> i = argumentTypes.iterator(); i.hasNext();) {
+            argumentTypeNames.add(i.next().getName());
         }
 
         return argumentTypeNames;
     }
 
     @Override
-    public Vector getArgumentTypes() {
-        return this.argumentTypes;
+    public Vector<String> getArgumentTypes() {
+        return getArgumentTypeNames();
     }
 
     @Override
     protected void writeArguments(CodeGenerator generator) {
         boolean isFirst = true;
-        for (int index = 0; index < getArgumentTypes().size(); ++index) {
-            Class argument = (Class)getArgumentTypes().elementAt(index);
+        for (int index = 0; index < argumentTypes.size(); ++index) {
+            Class<?> argument = argumentTypes.elementAt(index);
             if (isFirst) {
                 isFirst = false;
             } else {
@@ -106,11 +106,11 @@
         }
     }
 
-    public Class getReturnTypeClass() {
+    public Class<?> getReturnTypeClass() {
         return type;
     }
 
-    public void setReturnTypeClass(Class type) {
+    public void setReturnTypeClass(Class<?> type) {
         this.type = type;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DescriptorCompare.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DescriptorCompare.java
index ccd6fa8..5c46b3e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DescriptorCompare.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/helper/DescriptorCompare.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,12 +24,12 @@
  * Use to sort vectors of strings.
  * Avoid using this class as sun.misc is not part of many VM's like Netscapes.
  */
-public class DescriptorCompare implements Comparator, Serializable {
+public class DescriptorCompare implements Comparator<ClassDescriptor>, Serializable {
 
     private static final long serialVersionUID = -2792350655245140468L;
 
     @Override
-    public int compare(Object arg1, Object arg2) {
-        return ((ClassDescriptor)arg1).getJavaClassName().compareTo(((ClassDescriptor)arg2).getJavaClassName());
+    public int compare(ClassDescriptor arg1, ClassDescriptor arg2) {
+        return arg1.getJavaClassName().compareTo(arg2.getJavaClassName());
     }
 }
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 1644ad9..27202af 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,6 +32,7 @@
 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;
@@ -42,6 +43,7 @@
 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;
@@ -244,13 +246,13 @@
         }
     }
 
-    public static Vector addAllUniqueToVector(Vector objects, List objectsToAdd) {
+    public static <T> Vector<T> addAllUniqueToVector(Vector<T> objects, List<T> objectsToAdd) {
         if (objectsToAdd == null) {
             return objects;
         }
         int size = objectsToAdd.size();
         for (int index = 0; index < size; index++) {
-            Object element = objectsToAdd.get(index);
+            T element = objectsToAdd.get(index);
             if (!objects.contains(element)) {
                 objects.add(element);
             }
@@ -258,13 +260,13 @@
         return objects;
     }
 
-    public static List addAllUniqueToList(List objects, List objectsToAdd) {
+    public static <T> List<T> addAllUniqueToList(List<T> objects, List<T> objectsToAdd) {
         if (objectsToAdd == null) {
             return objects;
         }
         int size = objectsToAdd.size();
         for (int index = 0; index < size; index++) {
-            Object element = objectsToAdd.get(index);
+            T element = objectsToAdd.get(index);
             if (!objects.contains(element)) {
                 objects.add(element);
             }
@@ -354,9 +356,9 @@
     /**
       * Create a new Vector containing all of the map elements.
       */
-    public static Vector buildVectorFromMapElements(Map map) {
-        Vector vector = new Vector(map.size());
-        Iterator iterator = map.values().iterator();
+    public static <T> Vector<T> buildVectorFromMapElements(Map<?, T> map) {
+        Vector<T> vector = new Vector<>(map.size());
+        Iterator<T> iterator = map.values().iterator();
 
         while (iterator.hasNext()) {
             vector.addElement(iterator.next());
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitManager.java
index c0910c1..fa636d9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/CommitManager.java
@@ -479,16 +479,16 @@
      * stack size, and acts as a deadlock avoidance mechanism.
      */
     public void initializeCommitOrder() {
-        Vector descriptors = Helper.buildVectorFromMapElements(getSession().getDescriptors());
+        Vector<ClassDescriptor> descriptors = Helper.buildVectorFromMapElements(getSession().getDescriptors());
 
         // Must ensure uniqueness, some descriptor my be register twice for interfaces.
-        descriptors = Helper.addAllUniqueToVector(new Vector(descriptors.size()), descriptors);
-        Object[] descriptorsArray = new Object[descriptors.size()];
+        descriptors = Helper.addAllUniqueToVector(new Vector<>(descriptors.size()), descriptors);
+        ClassDescriptor[] descriptorsArray = new ClassDescriptor[descriptors.size()];
         for (int index = 0; index < descriptors.size(); index++) {
             descriptorsArray[index] = descriptors.elementAt(index);
         }
         Arrays.sort(descriptorsArray, new DescriptorCompare());
-        descriptors = new Vector(descriptors.size());
+        descriptors = new Vector<>(descriptors.size());
         for (int index = 0; index < descriptorsArray.length; index++) {
             descriptors.addElement(descriptorsArray[index]);
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/DirectToXMLTypeMappingHelper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/DirectToXMLTypeMappingHelper.java
index 34a5cb7..63831ad 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/DirectToXMLTypeMappingHelper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/DirectToXMLTypeMappingHelper.java
@@ -32,21 +32,22 @@
 
     private static DirectToXMLTypeMappingHelper singleton = null;
 
+    protected DirectToXMLTypeMappingHelper() {
+    }
+
     public static DirectToXMLTypeMappingHelper getInstance() {
 
         if (singleton == null) {
-            Class helperClass = null;
+            Class<? extends DirectToXMLTypeMappingHelper> helperClass = null;
 
             try {
-                helperClass = new PrivilegedClassForName<>("org.eclipse.persistence.sessions.factories.OracleDirectToXMLTypeMappingHelper").run();
+                helperClass = new PrivilegedClassForName<DirectToXMLTypeMappingHelper>("org.eclipse.persistence.sessions.factories.OracleDirectToXMLTypeMappingHelper").run();
             } catch (Throwable cnfe) {
                 helperClass = DirectToXMLTypeMappingHelper.class;
             }
             try {
-                singleton = (DirectToXMLTypeMappingHelper) new PrivilegedNewInstanceFromClass(helperClass).run();
-            } catch (IllegalAccessException e) {
-                throw new RuntimeException("Helper create failed: " + helperClass);
-            } catch (InstantiationException e) {
+                singleton = new PrivilegedNewInstanceFromClass<>(helperClass).run();
+            } catch (ReflectiveOperationException e) {
                 throw new RuntimeException("Helper create failed: " + helperClass);
             }
         }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/MissingDescriptorListener.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/MissingDescriptorListener.java
index a63ac32..d0b4446 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/MissingDescriptorListener.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/MissingDescriptorListener.java
@@ -42,9 +42,15 @@
     protected static final String XML_BINARY_MAPPING_CLASS = "org.eclipse.persistence.oxm.mappings.XMLBinaryDataMapping";
     protected static final String XML_BINARY_COLLECTION_MAPPING_CLASS = "org.eclipse.persistence.oxm.mappings.XMLBinaryDataCollectionMapping";
 
+    /**
+     * Default constructor.
+     */
+    public MissingDescriptorListener() {
+    }
+
     @Override
     public void missingDescriptor(SessionEvent event) {
-        String name = ((Class)event.getResult()).getName();
+        String name = ((Class<?>)event.getResult()).getName();
         DatabaseSession session = (DatabaseSession) ((AbstractSession) event.getSession()).getRootSession(null);
         Project project = session.getProject();
         String namespaceXPath = "";
@@ -64,7 +70,7 @@
 
         if (name.equals(EIS_DESCRIPTOR_CLASS) || name.equals(XML_INTERACTION_CLASS) || name.equals(EIS_LOGIN_CLASS)) {
             try {
-                Class javaClass = null;
+                Class<?> javaClass;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try{
                         javaClass = AccessController.doPrivileged(new PrivilegedClassForName<>(XML_INTERACTION_CLASS));
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/NamespaceResolverWithPrefixes.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/NamespaceResolverWithPrefixes.java
index d4e0cfc..ccc8877 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/NamespaceResolverWithPrefixes.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/NamespaceResolverWithPrefixes.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2018, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2018, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -19,6 +19,13 @@
     protected String primaryPrefix = null;
     protected String secondaryPrefix = null;
 
+    /**
+     * Default constructor
+     */
+    public NamespaceResolverWithPrefixes() {
+        super();
+    }
+
     public void putPrimary(String ns1, String primaryNamespace) {
         this.primaryPrefix = ns1;
         put(ns1, primaryNamespace);
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 e6e3f38..4b67faa 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
@@ -452,7 +452,7 @@
                 AggregateCollectionMapping mapping = (AggregateCollectionMapping)object;
                 List<DatabaseField> sourceFields = mapping.getSourceKeyFields();
                 List<DatabaseField> targetFields = mapping.getTargetForeignKeyFields();
-                List associations = new ArrayList(sourceFields.size());
+                List<Association> associations = new ArrayList<>(sourceFields.size());
                 for (int index = 0; index < sourceFields.size(); index++) {
                     associations.add(new Association(targetFields.get(index), sourceFields.get(index)));
                 }
@@ -462,12 +462,13 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 AggregateCollectionMapping mapping = (AggregateCollectionMapping)object;
-                List associations = (List)value;
+                @SuppressWarnings({"unchecked"})
+                List<Association> associations = (List<Association>) value;
                 mapping.setSourceKeyFields(NonSynchronizedVector.newInstance(associations.size()));
                 mapping.setTargetForeignKeyFields(NonSynchronizedVector.newInstance(associations.size()));
-                Iterator iterator = associations.iterator();
+                Iterator<Association> iterator = associations.iterator();
                 while (iterator.hasNext()) {
-                    Association association = (Association)iterator.next();
+                    Association association = iterator.next();
                     mapping.getSourceKeyFields().add((DatabaseField)association.getValue());
                     mapping.getTargetForeignKeyFields().add((DatabaseField)association.getKey());
                 }
@@ -579,8 +580,8 @@
                  * changed getAggregateToSourceFieldAssociations to hold String->DatabaseField associations
                  */
                 AggregateObjectMapping mapping = (AggregateObjectMapping)object;
-                Vector<Association> associations = mapping.getAggregateToSourceFieldAssociations();
-                Vector translations = new Vector(associations.size());
+                List<Association> associations = mapping.getAggregateToSourceFieldAssociations();
+                Vector<FieldTranslation> translations = new Vector<>(associations.size());
                 for (int index = 0; index < associations.size(); index++) {
                     Association association = associations.get(index);
                     FieldTranslation translation = new FieldTranslation();
@@ -594,9 +595,10 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 AggregateObjectMapping mapping = (AggregateObjectMapping)object;
-                Vector associations = (Vector)value;
+                @SuppressWarnings({"unchecked"})
+                Vector<Association> associations = (Vector<Association>)value;
                 for (int index = 0; index < associations.size(); index++) {
-                    Association association = (Association)associations.get(index);
+                    Association association = associations.get(index);
                     association.setKey(((DatabaseField)association.getKey()).getQualifiedName());
                 }
 
@@ -728,8 +730,7 @@
         platformMapping.setGetMethodName("getDatasourcePlatform");
         platformMapping.setSetMethodName("usePlatform");
         platformMapping.setConverter(new Converter() {
-            protected DatabaseMapping mapping;
-            private Map platformList;
+            private Map<String, String> platformList;
             private String oldPrefix = "oracle.toplink.";
             private String newPrefix = "org.eclipse.persistence.";
             private String oldOxmPrefix = oldPrefix + "ox.";
@@ -756,17 +757,17 @@
                     }
                 }
                 // convert deprecated platforms to new platforms
-                Object result = platformList.get(fieldValue);
+                String result = platformList.get(fieldValue);
                 if (result != null) {
                     fieldValue = result;
                 }
 
                 Object attributeValue;
-                Class attributeClass = session.getDatasourcePlatform().convertObject(fieldValue, ClassConstants.CLASS);
+                Class<?> attributeClass = session.getDatasourcePlatform().convertObject(fieldValue, ClassConstants.CLASS);
                 try {
                     if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()) {
                         try {
-                            attributeValue = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass(attributeClass));
+                            attributeValue = AccessController.doPrivileged(new PrivilegedNewInstanceFromClass<>(attributeClass));
                         }
                         catch (PrivilegedActionException exception) {
                             throw ConversionException.couldNotBeConverted(fieldValue, attributeClass, exception.getException());
@@ -790,7 +791,7 @@
 
             @Override
             public void initialize(DatabaseMapping mapping, Session session) {
-                this.platformList = new HashMap();
+                this.platformList = new HashMap<>();
                 this.platformList.put("org.eclipse.persistence.internal.databaseaccess.AccessPlatform", "org.eclipse.persistence.platform.database.AccessPlatform");
                 this.platformList.put("org.eclipse.persistence.internal.databaseaccess.AttunityPlatform", "org.eclipse.persistence.platform.database.AttunityPlatform");
                 this.platformList.put("org.eclipse.persistence.internal.databaseaccess.CloudscapePlatform", "org.eclipse.persistence.platform.database.CloudscapePlatform");
@@ -808,10 +809,9 @@
                 this.platformList.put("org.eclipse.persistence.oraclespecific.Oracle8Platform", "org.eclipse.persistence.platform.database.oracle.Oracle8Platform");
                 this.platformList.put("org.eclipse.persistence.oraclespecific.Oracle9Platform", "org.eclipse.persistence.platform.database.oracle.Oracle9Platform");
                 this.platformList.put("org.eclipse.persistence.platform.database.SQLAnyWherePlatform", "org.eclipse.persistence.platform.database.SQLAnywherePlatform");
-                this.mapping = mapping;
                 // CR#... Mapping must also have the field classification.
-                if (this.mapping.isDirectToFieldMapping()) {
-                    AbstractDirectMapping directMapping = (AbstractDirectMapping)this.mapping;
+                if (mapping.isDirectToFieldMapping()) {
+                    AbstractDirectMapping directMapping = (AbstractDirectMapping) mapping;
 
                     // Allow user to specify field type to override computed value. (i.e. blob, nchar)
                     if (directMapping.getFieldClassification() == null) {
@@ -1261,8 +1261,8 @@
         operatorConverter.addConversionValue("ascending", ExpressionOperator.getOperator(ExpressionOperator.Ascending));
         operatorConverter.addConversionValue("descending", ExpressionOperator.getOperator(ExpressionOperator.Descending));
         // These are platform specific so not on operator.
-        operatorConverter.addConversionValue("upper", new ExpressionOperator(ExpressionOperator.ToUpperCase, NonSynchronizedVector.newInstance(0)));
-        operatorConverter.addConversionValue("lower", new ExpressionOperator(ExpressionOperator.ToLowerCase, NonSynchronizedVector.newInstance(0)));
+        operatorConverter.addConversionValue("upper", new ExpressionOperator(ExpressionOperator.ToUpperCase, new ArrayList<>(0)));
+        operatorConverter.addConversionValue("lower", new ExpressionOperator(ExpressionOperator.ToLowerCase, new ArrayList<>(0)));
         // Aggregate functions
         operatorConverter.addConversionValue("count", ExpressionOperator.getOperator(ExpressionOperator.Count));
         operatorConverter.addConversionValue("sum", ExpressionOperator.getOperator(ExpressionOperator.Sum));
@@ -1270,8 +1270,8 @@
         operatorConverter.addConversionValue("maximum", ExpressionOperator.getOperator(ExpressionOperator.Maximum));
         operatorConverter.addConversionValue("minimum", ExpressionOperator.getOperator(ExpressionOperator.Minimum));
         // standardDeviation is platform specific.
-        operatorConverter.addConversionValue("standardDeviation", new ExpressionOperator(ExpressionOperator.StandardDeviation, NonSynchronizedVector.newInstance(0)));
-        operatorConverter.addConversionValue("variance", new ExpressionOperator(ExpressionOperator.Variance, NonSynchronizedVector.newInstance(0)));
+        operatorConverter.addConversionValue("standardDeviation", new ExpressionOperator(ExpressionOperator.StandardDeviation, new ArrayList<>(0)));
+        operatorConverter.addConversionValue("variance", new ExpressionOperator(ExpressionOperator.Variance, new ArrayList<>(0)));
         operatorConverter.addConversionValue("distinct", ExpressionOperator.getOperator(ExpressionOperator.Distinct));
         operatorMapping.setConverter(operatorConverter);
         operatorMapping.setXPath("@function");
@@ -1350,7 +1350,7 @@
                 List<String> arguments = query.getArguments();
                 List<String> types = query.getArgumentTypeNames();
                 List<Object> values = query.getArgumentValues();
-                Vector queryArguments = new Vector(arguments.size());
+                Vector<QueryArgument> queryArguments = new Vector<>(arguments.size());
                 for (int index = 0; index < arguments.size(); index++) {
                     QueryArgument queryArgument = new QueryArgument();
                     queryArgument.setKey(arguments.get(index));
@@ -1372,12 +1372,13 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 DatabaseQuery query = (DatabaseQuery)object;
-                List queryArguments = (List)value;
+                @SuppressWarnings({"unchecked"})
+                List<QueryArgument> queryArguments = (List<QueryArgument>)value;
                 List<String> arguments = 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 = (QueryArgument)queryArguments.get(index);
+                    QueryArgument queryArgument = queryArguments.get(index);
                     arguments.add((String)queryArgument.getKey());
                     if (queryArgument.getValue() != null) {
                         values.add(queryArgument.getValue());
@@ -2045,9 +2046,9 @@
             @Override
             public Object getAttributeValueFromObject(Object object) {
                 DatabaseMapping mapping = (DatabaseMapping)object;
-                Vector propertyAssociations = new NonSynchronizedVector();
-                for (Iterator i = mapping.getProperties().entrySet().iterator(); i.hasNext();) {
-                    Map.Entry me = (Map.Entry)i.next();
+                List<PropertyAssociation> propertyAssociations = new ArrayList<>();
+                for (Iterator<Map.Entry<?, ?>> i = mapping.getProperties().entrySet().iterator(); i.hasNext();) {
+                    Map.Entry<?, ?> me = i.next();
                     PropertyAssociation propertyAssociation = new PropertyAssociation();
                     propertyAssociation.setKey(me.getKey());
                     propertyAssociation.setValue(me.getValue());
@@ -2059,9 +2060,10 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 DatabaseMapping mapping = (DatabaseMapping)object;
-                Vector propertyAssociations = (Vector)value;
+                @SuppressWarnings({"unchecked"})
+                List<PropertyAssociation> propertyAssociations = (List<PropertyAssociation>) value;
                 for (int i = 0; i < propertyAssociations.size(); i++) {
-                    PropertyAssociation propertyAssociation = (PropertyAssociation)propertyAssociations.get(i);
+                    PropertyAssociation propertyAssociation = propertyAssociations.get(i);
                     mapping.getProperties().put(propertyAssociation.getKey(), propertyAssociation.getValue());
                 }
             }
@@ -2423,9 +2425,9 @@
             @Override
             public Object getAttributeValueFromObject(Object object) {
                 ClassDescriptor desc = (ClassDescriptor)object;
-                Vector propertyAssociations = new NonSynchronizedVector();
-                for (Iterator i = desc.getProperties().entrySet().iterator(); i.hasNext();) {
-                    Map.Entry me = (Map.Entry)i.next();
+                List<PropertyAssociation> propertyAssociations = new ArrayList<>();
+                for (Iterator<Map.Entry<?, ?>> i = desc.getProperties().entrySet().iterator(); i.hasNext();) {
+                    Map.Entry<?, ?> me = i.next();
                     PropertyAssociation propertyAssociation = new PropertyAssociation();
                     propertyAssociation.setKey(me.getKey());
                     propertyAssociation.setValue(me.getValue());
@@ -2437,9 +2439,10 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 ClassDescriptor desc = (ClassDescriptor)object;
-                Vector propertyAssociations = (Vector)value;
+                @SuppressWarnings({"unchecked"})
+                List<PropertyAssociation> propertyAssociations = (List<PropertyAssociation>) value;
                 for (int i = 0; i < propertyAssociations.size(); i++) {
-                    PropertyAssociation propertyAssociation = (PropertyAssociation)propertyAssociations.get(i);
+                    PropertyAssociation propertyAssociation = propertyAssociations.get(i);
                     desc.getProperties().put(propertyAssociation.getKey(), propertyAssociation.getValue());
                 }
             }
@@ -2469,9 +2472,9 @@
             @Override
             public Object getAttributeValueFromObject(Object object) {
                 ClassDescriptor mapping = (ClassDescriptor)object;
-                Vector associations = mapping.getMultipleTablePrimaryKeyAssociations();
+                List<Association> associations = mapping.getMultipleTablePrimaryKeyAssociations();
                 for (int index = 0; index < associations.size(); index++) {
-                    Association association = (Association)associations.get(index);
+                    Association association = associations.get(index);
                     association.setKey(new DatabaseField((String)association.getKey()));
                     association.setValue(new DatabaseField((String)association.getValue()));
                 }
@@ -2481,9 +2484,10 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 ClassDescriptor mapping = (ClassDescriptor)object;
-                Vector associations = (Vector)value;
+                @SuppressWarnings({"unchecked"})
+                List<Association> associations = (List<Association>) value;
                 for (int index = 0; index < associations.size(); index++) {
-                    Association association = (Association)associations.get(index);
+                    Association association = associations.get(index);
                     association.setKey(((DatabaseField)association.getKey()).getQualifiedName());
                     association.setValue(((DatabaseField)association.getValue()).getQualifiedName());
                 }
@@ -2502,9 +2506,9 @@
             @Override
             public Object getAttributeValueFromObject(Object object) {
                 ClassDescriptor mapping = (ClassDescriptor)object;
-                Vector associations = mapping.getMultipleTableForeignKeyAssociations();
+                List<Association> associations = mapping.getMultipleTableForeignKeyAssociations();
                 for (int index = 0; index < associations.size(); index++) {
-                    Association association = (Association)associations.get(index);
+                    Association association = associations.get(index);
                     association.setKey(new DatabaseField((String)association.getKey()));
                     association.setValue(new DatabaseField((String)association.getValue()));
                 }
@@ -2514,9 +2518,10 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 ClassDescriptor mapping = (ClassDescriptor)object;
-                Vector associations = (Vector)value;
+                @SuppressWarnings({"unchecked"})
+                List<Association> associations = (List<Association>) value;
                 for (int index = 0; index < associations.size(); index++) {
-                    Association association = (Association)associations.get(index);
+                    Association association = associations.get(index);
                     association.setKey(((DatabaseField)association.getKey()).getQualifiedName());
                     association.setValue(((DatabaseField)association.getValue()).getQualifiedName());
                 }
@@ -2610,7 +2615,7 @@
             public Object getAttributeValueFromObject(Object object) {
                 List<DatabaseField> sourceFields = ((DirectCollectionMapping)object).getSourceKeyFields();
                 List<DatabaseField> referenceFields = ((DirectCollectionMapping)object).getReferenceKeyFields();
-                List associations = new ArrayList(sourceFields.size());
+                List<Association> associations = new ArrayList<>(sourceFields.size());
                 for (int index = 0; index < sourceFields.size(); index++) {
                     associations.add(new Association(referenceFields.get(index), sourceFields.get(index)));
                 }
@@ -2620,12 +2625,13 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 DirectCollectionMapping mapping = (DirectCollectionMapping)object;
-                List associations = (List)value;
+                @SuppressWarnings({"unchecked"})
+                List<Association> associations = (List<Association>)value;
                 mapping.setSourceKeyFields(NonSynchronizedVector.newInstance(associations.size()));
                 mapping.setReferenceKeyFields(NonSynchronizedVector.newInstance(associations.size()));
-                Iterator iterator = associations.iterator();
+                Iterator<Association> iterator = associations.iterator();
                 while (iterator.hasNext()) {
-                    Association association = (Association)iterator.next();
+                    Association association = iterator.next();
                     mapping.getSourceKeyFields().add((DatabaseField)association.getValue());
                     mapping.getReferenceKeyFields().add((DatabaseField)association.getKey());
                 }
@@ -3221,7 +3227,7 @@
             public Object getAttributeValueFromObject(Object object) {
                 List<DatabaseField> sourceFields = ((ManyToManyMapping)object).getSourceKeyFields();
                 List<DatabaseField> relationFields = ((ManyToManyMapping)object).getSourceRelationKeyFields();
-                List associations = new ArrayList(sourceFields.size());
+                List<Association> associations = new ArrayList<>(sourceFields.size());
                 for (int index = 0; index < sourceFields.size(); index++) {
                     associations.add(new Association(relationFields.get(index), sourceFields.get(index)));
                 }
@@ -3231,12 +3237,13 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 ManyToManyMapping mapping = (ManyToManyMapping)object;
-                List associations = (List)value;
+                @SuppressWarnings({"unchecked"})
+                List<Association> associations = (List<Association>)value;
                 mapping.setSourceKeyFields(NonSynchronizedVector.newInstance(associations.size()));
                 mapping.setSourceRelationKeyFields(NonSynchronizedVector.newInstance(associations.size()));
-                Iterator iterator = associations.iterator();
+                Iterator<Association> iterator = associations.iterator();
                 while (iterator.hasNext()) {
-                    Association association = (Association)iterator.next();
+                    Association association = iterator.next();
                     mapping.getSourceKeyFields().add((DatabaseField)association.getValue());
                     mapping.getSourceRelationKeyFields().add((DatabaseField)association.getKey());
                 }
@@ -3254,7 +3261,7 @@
             public Object getAttributeValueFromObject(Object object) {
                 List<DatabaseField> targetFields = ((ManyToManyMapping)object).getTargetKeyFields();
                 List<DatabaseField> relationFields = ((ManyToManyMapping)object).getTargetRelationKeyFields();
-                List associations = new ArrayList(targetFields.size());
+                List<Association> associations = new ArrayList<>(targetFields.size());
                 for (int index = 0; index < targetFields.size(); index++) {
                     associations.add(new Association(relationFields.get(index), targetFields.get(index)));
                 }
@@ -3264,12 +3271,13 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 ManyToManyMapping mapping = (ManyToManyMapping)object;
-                List associations = (List)value;
+                @SuppressWarnings({"unchecked"})
+                List<Association> associations = (List<Association>)value;
                 mapping.setTargetKeyFields(NonSynchronizedVector.newInstance(associations.size()));
                 mapping.setTargetRelationKeyFields(NonSynchronizedVector.newInstance(associations.size()));
-                Iterator iterator = associations.iterator();
+                Iterator<Association> iterator = associations.iterator();
                 while (iterator.hasNext()) {
-                    Association association = (Association)iterator.next();
+                    Association association = iterator.next();
                     mapping.getTargetKeyFields().add((DatabaseField)association.getValue());
                     mapping.getTargetRelationKeyFields().add((DatabaseField)association.getKey());
                 }
@@ -3507,7 +3515,7 @@
             public Object getAttributeValueFromObject(Object object) {
                 List<DatabaseField> sourceFields = ((OneToManyMapping)object).getSourceKeyFields();
                 List<DatabaseField> targetFields = ((OneToManyMapping)object).getTargetForeignKeyFields();
-                List associations = new ArrayList(sourceFields.size());
+                List<Association> associations = new ArrayList<>(sourceFields.size());
                 for (int index = 0; index < sourceFields.size(); index++) {
                     associations.add(new Association(targetFields.get(index), sourceFields.get(index)));
                 }
@@ -3517,12 +3525,13 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 OneToManyMapping mapping = (OneToManyMapping)object;
-                List associations = (List)value;
+                @SuppressWarnings({"unchecked"})
+                List<Association> associations = (List<Association>)value;
                 mapping.setSourceKeyFields(NonSynchronizedVector.newInstance(associations.size()));
                 mapping.setTargetForeignKeyFields(NonSynchronizedVector.newInstance(associations.size()));
-                Iterator iterator = associations.iterator();
+                Iterator<Association> iterator = associations.iterator();
                 while (iterator.hasNext()) {
-                    Association association = (Association)iterator.next();
+                    Association association = iterator.next();
                     mapping.getSourceKeyFields().add((DatabaseField)association.getValue());
                     mapping.getTargetForeignKeyFields().add((DatabaseField)association.getKey());
                 }
@@ -3606,7 +3615,7 @@
             @Override
             public Object getAttributeValueFromObject(Object object) {
                 Map<DatabaseField, DatabaseField> sourceToTargetKeyFields = ((OneToOneMapping)object).getSourceToTargetKeyFields();
-                List associations = new ArrayList(sourceToTargetKeyFields.size());
+                List<Association> associations = new ArrayList<>(sourceToTargetKeyFields.size());
                 Iterator<Map.Entry<DatabaseField, DatabaseField>> iterator = sourceToTargetKeyFields.entrySet().iterator();
                 while (iterator.hasNext()) {
                     Map.Entry<DatabaseField, DatabaseField> entry = iterator.next();
@@ -3618,12 +3627,13 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 OneToOneMapping mapping = (OneToOneMapping)object;
-                List associations = (List)value;
-                mapping.setSourceToTargetKeyFields(new HashMap(associations.size() + 1));
-                mapping.setTargetToSourceKeyFields(new HashMap(associations.size() + 1));
-                Iterator iterator = associations.iterator();
+                @SuppressWarnings({"unchecked"})
+                List<Association> associations = (List<Association>)value;
+                mapping.setSourceToTargetKeyFields(new HashMap<>(associations.size() + 1));
+                mapping.setTargetToSourceKeyFields(new HashMap<>(associations.size() + 1));
+                Iterator<Association> iterator = associations.iterator();
                 while (iterator.hasNext()) {
-                    Association association = (Association)iterator.next();
+                    Association association = iterator.next();
                     mapping.getSourceToTargetKeyFields().put((DatabaseField)association.getKey(), (DatabaseField)association.getValue());
                     mapping.getTargetToSourceKeyFields().put((DatabaseField)association.getValue(), (DatabaseField)association.getKey());
                 }
@@ -4555,7 +4565,7 @@
         return descriptor;
     }
 
-    protected ClassDescriptor buildTypesafeEnumConverterDescriptor(Class jaxbTypesafeEnumConverter) {
+    protected ClassDescriptor buildTypesafeEnumConverterDescriptor(Class<?> jaxbTypesafeEnumConverter) {
         XMLDescriptor descriptor = new XMLDescriptor();
         descriptor.setJavaClass(jaxbTypesafeEnumConverter);
 
@@ -4670,10 +4680,10 @@
             @Override
             public Object getAttributeValueFromObject(Object object) {
                 VariableOneToOneMapping mapping = (VariableOneToOneMapping)object;
-                Vector associations = mapping.getSourceToTargetQueryKeyFieldAssociations();
-                Vector queryKeyReferences = new Vector(associations.size());
+                List<Association> associations = mapping.getSourceToTargetQueryKeyFieldAssociations();
+                Vector<QueryKeyReference> queryKeyReferences = new Vector<>(associations.size());
                 for (int index = 0; index < associations.size(); index++) {
-                    Association association = (Association)associations.get(index);
+                    Association association = associations.get(index);
                     QueryKeyReference reference = new QueryKeyReference();
                     reference.setKey(new DatabaseField((String)association.getKey()));
                     reference.setValue(association.getValue());
@@ -4685,9 +4695,10 @@
             @Override
             public void setAttributeValueInObject(Object object, Object value) {
                 VariableOneToOneMapping mapping = (VariableOneToOneMapping)object;
-                Vector associations = (Vector)value;
+                @SuppressWarnings({"unchecked"})
+                Vector<Association> associations = (Vector<Association>)value;
                 for (int index = 0; index < associations.size(); index++) {
-                    Association association = (Association)associations.get(index);
+                    Association association = associations.get(index);
                     association.setKey(((DatabaseField)association.getKey()).getQualifiedName());
                 }
                 mapping.setSourceToTargetQueryKeyFieldAssociations(associations);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject_11_1_1.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/ObjectPersistenceRuntimeXMLProject_11_1_1.java
index 480165f..e6f2396 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
@@ -355,9 +355,9 @@
                 @Override
                 public Object getAttributeValueFromObject(Object object) {
                     ClassDescriptor descriptor = (ClassDescriptor) object;
-                    Vector associations = descriptor.getMultipleTableForeignKeyAssociations();
+                    List<Association> associations = descriptor.getMultipleTableForeignKeyAssociations();
                     for (int index = 0; index < associations.size(); index++) {
-                        Association association = (Association) associations.get(index);
+                        Association association = associations.get(index);
                         String targetPrimaryKeyFieldName = (String) association.getKey();
                         association.setKey(new DatabaseField((String) association.getValue()));
                         association.setValue(new DatabaseField(targetPrimaryKeyFieldName));
@@ -367,9 +367,9 @@
                 @Override
                 public void setAttributeValueInObject(Object object, Object value) {
                     ClassDescriptor descriptor = (ClassDescriptor) object;
-                    Vector associations = (Vector) value;
+                    List<Association> associations = (List<Association>) value;
                     for (int index = 0; index < associations.size(); index++) {
-                        Association association = (Association) associations.get(index);
+                        Association association = associations.get(index);
                         association.setKey(((DatabaseField) association.getKey()).getQualifiedName());
                         association.setValue(((DatabaseField) association.getValue()).getQualifiedName());
                     }
@@ -616,11 +616,11 @@
         sourceToTargetKeyFieldAssociationsMapping.setAttributeAccessor(new AttributeAccessor() {
                 @Override
                 public Object getAttributeValueFromObject(Object object) {
-                    Map sourceToTargetKeyFields = ((XMLObjectReferenceMapping) object).getSourceToTargetKeyFieldAssociations();
-                    List associations = new ArrayList(sourceToTargetKeyFields.size());
-                    Iterator iterator = sourceToTargetKeyFields.entrySet().iterator();
+                    Map<XMLField, XMLField> sourceToTargetKeyFields = ((XMLObjectReferenceMapping) object).getSourceToTargetKeyFieldAssociations();
+                    List<Association> associations = new ArrayList<>(sourceToTargetKeyFields.size());
+                    Iterator<Map.Entry<XMLField, XMLField>> iterator = sourceToTargetKeyFields.entrySet().iterator();
                     while (iterator.hasNext()) {
-                        Map.Entry entry = (Map.Entry)iterator.next();
+                        Map.Entry<XMLField, XMLField> entry = iterator.next();
                         associations.add(new Association(entry.getKey(), entry.getValue()));
                     }
                     return associations;
@@ -629,11 +629,11 @@
                 @Override
                 public void setAttributeValueInObject(Object object, Object value) {
                     XMLObjectReferenceMapping mapping = (XMLObjectReferenceMapping) object;
-                    List associations = (List)value;
-                    mapping.setSourceToTargetKeyFieldAssociations(new HashMap(associations.size() + 1));
-                    Iterator iterator = associations.iterator();
+                    List<Association> associations = (List<Association>)value;
+                    mapping.setSourceToTargetKeyFieldAssociations(new HashMap<>(associations.size() + 1));
+                    Iterator<Association> iterator = associations.iterator();
                     while (iterator.hasNext()) {
-                        Association association = (Association)iterator.next();
+                        Association association = iterator.next();
                         mapping.getSourceToTargetKeyFieldAssociations().put(association.getKey(), association.getValue());
                     }
                 }
@@ -744,10 +744,10 @@
      *           be nested inner classes of ObjectPersistenceRuntimeXMLProject_11_1_1
      *           so that they don't 'leak' out into the runtime
      */
-    class StoredProcedureArgument {
+    static class StoredProcedureArgument {
           String argumentName;
           String argumentFieldName;
-          Class argumentType;
+          Class<?> argumentType;
           String argumentTypeName;
           int argumentSQLType = NULL_SQL_TYPE;
           String argumentSqlTypeName;
@@ -811,7 +811,7 @@
         }
     }
 
-    class StoredProcedureInOutArgument extends StoredProcedureArgument {
+    static class StoredProcedureInOutArgument extends StoredProcedureArgument {
           String outputArgumentName;
           StoredProcedureInOutArgument() {
               super();
@@ -825,7 +825,7 @@
           }
     }
 
-    class StoredProcedureOutArgument extends StoredProcedureArgument {
+    static class StoredProcedureOutArgument extends StoredProcedureArgument {
         StoredProcedureOutArgument() {
             super();
         }
@@ -838,7 +838,7 @@
         }
     }
 
-    class StoredProcedureOutCursorArgument extends StoredProcedureOutArgument {
+    static class StoredProcedureOutCursorArgument extends StoredProcedureOutArgument {
         StoredProcedureOutCursorArgument() {
             super();
         }
@@ -860,28 +860,26 @@
 
     // Made static for performance reasons.
     static class StoredProcedureArgumentInstantiationPolicy extends InstantiationPolicy {
-        ObjectPersistenceRuntimeXMLProject_11_1_1 outer;
         StoredProcedureArgumentType argType;
-        StoredProcedureArgumentInstantiationPolicy(
-            ObjectPersistenceRuntimeXMLProject_11_1_1 outer, StoredProcedureArgumentType argType) {
-            this.outer = outer;
+        StoredProcedureArgumentInstantiationPolicy(StoredProcedureArgumentType argType) {
             this.argType = argType;
         }
+
         @Override
         public Object buildNewInstance() throws DescriptorException {
             Object arg = null;
             switch (argType) {
                 case STORED_PROCEDURE_ARG:
-                    arg = outer.new StoredProcedureArgument();
+                    arg = new StoredProcedureArgument();
                     break;
                 case STORED_PROCEDURE_INOUT_ARG:
-                    arg = outer.new StoredProcedureInOutArgument();
+                    arg = new StoredProcedureInOutArgument();
                     break;
                 case STORED_PROCEDURE_OUT_ARG:
-                    arg = outer.new StoredProcedureOutArgument();
+                    arg = new StoredProcedureOutArgument();
                     break;
                 case STORED_PROCEDURE_OUTCURSOR_ARG:
-                    arg = outer.new StoredProcedureOutCursorArgument();
+                    arg = new StoredProcedureOutCursorArgument();
                     break;
             }
             return arg;
@@ -893,8 +891,7 @@
         XMLDescriptor descriptor = new XMLDescriptor();
         descriptor.setJavaClass(StoredProcedureArgument.class);
         // need policy 'cause TreeBuilder cannot use default constructor
-        descriptor.setInstantiationPolicy(new StoredProcedureArgumentInstantiationPolicy(this,
-            StoredProcedureArgumentType.STORED_PROCEDURE_ARG));
+        descriptor.setInstantiationPolicy(new StoredProcedureArgumentInstantiationPolicy(StoredProcedureArgumentType.STORED_PROCEDURE_ARG));
         descriptor.descriptorIsAggregate();
 
         descriptor.setDefaultRootElement("argument");
@@ -953,8 +950,7 @@
 
         XMLDescriptor descriptor = new XMLDescriptor();
         descriptor.setJavaClass(StoredProcedureInOutArgument.class);
-        descriptor.setInstantiationPolicy(new StoredProcedureArgumentInstantiationPolicy(this,
-            StoredProcedureArgumentType.STORED_PROCEDURE_INOUT_ARG));
+        descriptor.setInstantiationPolicy(new StoredProcedureArgumentInstantiationPolicy(StoredProcedureArgumentType.STORED_PROCEDURE_INOUT_ARG));
         descriptor.getInheritancePolicy().setParentClass(StoredProcedureArgument.class);
 
         //used in case the in databasefield is named different than the out databasefield
@@ -970,8 +966,7 @@
 
         XMLDescriptor descriptor = new XMLDescriptor();
         descriptor.setJavaClass(StoredProcedureOutArgument.class);
-        descriptor.setInstantiationPolicy(new StoredProcedureArgumentInstantiationPolicy(this,
-            StoredProcedureArgumentType.STORED_PROCEDURE_OUT_ARG));
+        descriptor.setInstantiationPolicy(new StoredProcedureArgumentInstantiationPolicy(StoredProcedureArgumentType.STORED_PROCEDURE_OUT_ARG));
         descriptor.getInheritancePolicy().setParentClass(StoredProcedureArgument.class);
 
         return descriptor;
@@ -981,14 +976,13 @@
 
         XMLDescriptor descriptor = new XMLDescriptor();
         descriptor.setJavaClass(StoredProcedureOutCursorArgument.class);
-        descriptor.setInstantiationPolicy(new StoredProcedureArgumentInstantiationPolicy(this,
-            StoredProcedureArgumentType.STORED_PROCEDURE_OUTCURSOR_ARG));
+        descriptor.setInstantiationPolicy(new StoredProcedureArgumentInstantiationPolicy(StoredProcedureArgumentType.STORED_PROCEDURE_OUTCURSOR_ARG));
         descriptor.getInheritancePolicy().setParentClass(StoredProcedureArgument.class);
 
         return descriptor;
     }
 
-    class StoredProcedureArgumentsAccessor extends AttributeAccessor {
+    static class StoredProcedureArgumentsAccessor extends AttributeAccessor {
         StoredProcedureArgumentsAccessor() {
             super();
         }
@@ -996,11 +990,11 @@
         public Object getAttributeValueFromObject(Object anObject) throws DescriptorException {
             StoredProcedureCall spc = (StoredProcedureCall)anObject;
             List<Integer> parameterTypes = spc.getParameterTypes();
-            List parameters = spc.getParameters();
+            List<?> parameters = spc.getParameters();
             List<String> procedureArgumentNames = spc.getProcedureArgumentNames();
-            List storedProcedureArguments = new Vector();
+            List<StoredProcedureArgument> storedProcedureArguments = new Vector<>();
             for (int i = spc.getFirstParameterIndexForCallString(); i < parameterTypes.size(); i++) {
-                StoredProcedureArgument spa = null;
+                StoredProcedureArgument spa;
                 Integer direction = parameterTypes.get(i);
                 Object argument = parameters.get(i);
                 String argumentName = procedureArgumentNames.get(i);
@@ -1050,9 +1044,9 @@
         public void setAttributeValueInObject(Object domainObject, Object attributeValue) throws DescriptorException {
             StoredProcedureCall spc = (StoredProcedureCall)domainObject;
             // vector of parameters/arguments to be added the call
-            Vector procedureArguments = (Vector)attributeValue;
+            List<StoredProcedureArgument> procedureArguments = (Vector<StoredProcedureArgument>)attributeValue;
             for (int i = 0; i < procedureArguments.size(); i++) {
-                StoredProcedureArgument spa = (StoredProcedureArgument)procedureArguments.get(i);
+                StoredProcedureArgument spa = procedureArguments.get(i);
                 Integer direction = spa.getDirection();
                 DatabaseField dbField = spa.getDatabaseField();
                 spc.getProcedureArgumentNames().add(spa.argumentName);
@@ -1122,7 +1116,7 @@
         return descriptor;
     }
 
-    class StoredFunctionResultAccessor extends AttributeAccessor {
+    static class StoredFunctionResultAccessor extends AttributeAccessor {
         StoredFunctionResultAccessor() {
             super();
         }
@@ -1423,8 +1417,8 @@
              // Convert the collection of Strings to an array of Object values (round-trip)
              if(value instanceof Collection) {
                  int i = 0;
-                 Object[] parameters = new Object[((Collection)value).size()];
-                 for(Iterator anIterator = ((Collection)value).iterator(); anIterator.hasNext();) {
+                 Object[] parameters = new Object[((Collection<?>)value).size()];
+                 for(Iterator<?> anIterator = ((Collection<?>)value).iterator(); anIterator.hasNext();) {
                         // Lookup the object type via the predefined parameterTypes array and convert based on that type
                         parameters[i] = XMLConversionManager.getDefaultXMLManager().convertObject(//
                                 anIterator.next(), ((IsSetNullPolicy)object).getIsSetParameterTypes()[i++]);
@@ -1458,19 +1452,20 @@
          }
 
          @Override
+         @SuppressWarnings({"unchecked", "rawtypes"})
          public void setAttributeValueInObject(Object object, Object value) throws DescriptorException {
              try {
                  // Get the Class of each entry in the collection
                  if(value instanceof Collection) {
-                     Class[] parameterTypes = new Class[((Collection)value).size()];
+                     Class<?>[] parameterTypes = new Class[((Collection<?>)value).size()];
                      int i = 0;
-                     for(Iterator anIterator = ((Collection)value).iterator(); anIterator.hasNext();) {
-                         parameterTypes[i++] = Class.forName((String)anIterator.next());
+                     for(Iterator<String> anIterator = ((Collection<String>)value).iterator(); anIterator.hasNext();) {
+                         parameterTypes[i++] = Class.forName(anIterator.next());
                      }
                      ((IsSetNullPolicy)object).setIsSetParameterTypes(parameterTypes);
                  } else {
                      // cast to class array
-                     ((IsSetNullPolicy)object).setIsSetParameterTypes((Class[])value);
+                     ((IsSetNullPolicy)object).setIsSetParameterTypes((Class<?>[])value);
                  }
              } catch (ClassNotFoundException e) {
                  throw new RuntimeException(e);
@@ -1714,11 +1709,11 @@
              @Override
             public Object getAttributeValueFromObject(Object object) {
                  Map<String, DatabaseType> fields = ((OracleObjectType) object).getFields();
-                 List associations = new ArrayList(fields.size());
+                 List<ObjectTypeFieldAssociation> associations = new ArrayList<>(fields.size());
                  Iterator<Map.Entry<String, DatabaseType>> iterator = fields.entrySet().iterator();
                  while (iterator.hasNext()) {
                      Map.Entry<String, DatabaseType> entry = iterator.next();
-                     associations.add(new ObjectTypeFieldAssociation(entry.getKey().toString(),  wrapType(entry.getValue())));
+                     associations.add(new ObjectTypeFieldAssociation(entry.getKey(),  wrapType(entry.getValue())));
                  }
                  return associations;
              }
@@ -1730,7 +1725,7 @@
                  Iterator<ObjectTypeFieldAssociation> iterator = associations.iterator();
                  while (iterator.hasNext()) {
                      ObjectTypeFieldAssociation association = iterator.next();
-                     fieldMap.put((String) association.getKey(), unwrapType((DatabaseTypeWrapper)association.getValue()));
+                     fieldMap.put(association.getKey(), unwrapType(association.getValue()));
                  }
                  objectType.setFields(fieldMap);
              }
@@ -1746,7 +1741,7 @@
       * the value is a DatabaseType.  The value must be wrapped/unwrapped
       * using the wrap/unwrap type methods on the outer class.
       */
-     public class ObjectTypeFieldAssociation implements Map.Entry {
+     public static class ObjectTypeFieldAssociation implements Map.Entry<String, DatabaseTypeWrapper> {
          String key;
          DatabaseTypeWrapper value;
 
@@ -1760,19 +1755,19 @@
          }
 
         @Override
-        public Object getKey() {
+        public String getKey() {
             return key;
         }
 
         @Override
-        public Object getValue() {
+        public DatabaseTypeWrapper getValue() {
             return value;
         }
 
         @Override
-        public Object setValue(Object arg0) {
-            Object oldValue = this.value;
-            this.value = (DatabaseTypeWrapper) arg0;
+        public DatabaseTypeWrapper setValue(DatabaseTypeWrapper arg0) {
+            DatabaseTypeWrapper oldValue = this.value;
+            this.value = arg0;
             return oldValue;
         }
      }
@@ -1782,7 +1777,7 @@
      protected ClassDescriptor buildObjectTypeFieldAssociationDescriptor() {
          XMLDescriptor descriptor = new XMLDescriptor();
          descriptor.setJavaClass(ObjectTypeFieldAssociation.class);
-         descriptor.setInstantiationPolicy(new ObjectTypeFieldAssociationInstantiationPolicy(this));
+         descriptor.setInstantiationPolicy(new ObjectTypeFieldAssociationInstantiationPolicy());
 
          XMLDirectMapping keyMapping = new XMLDirectMapping();
          keyMapping.setAttributeName("key");
@@ -1804,14 +1799,11 @@
       * enables the default constructor of the inner class to be accessed.
       */
      static class ObjectTypeFieldAssociationInstantiationPolicy extends InstantiationPolicy {
-         ObjectPersistenceRuntimeXMLProject_11_1_1 outer;
-         ObjectTypeFieldAssociationInstantiationPolicy(
-             ObjectPersistenceRuntimeXMLProject_11_1_1 outer) {
-             this.outer = outer;
+         ObjectTypeFieldAssociationInstantiationPolicy() {
          }
          @Override
          public Object buildNewInstance() throws DescriptorException {
-             return outer.new ObjectTypeFieldAssociation();
+             return new ObjectTypeFieldAssociation();
          }
      }
      protected ClassDescriptor buildPLSQLrecordDescriptor() {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/PersistenceEntityResolver.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/PersistenceEntityResolver.java
index 5cf1fa1..dac6bfd 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/PersistenceEntityResolver.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/PersistenceEntityResolver.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,7 @@
  * @author Gordon Yorke, Guy Pelletier
  */
 public class PersistenceEntityResolver implements EntityResolver {
-    protected Hashtable m_localResources;
+    protected Hashtable<String, String> m_localResources;
     protected static final String dtdFileName40 = "sessions_4_0.dtd";
     protected static final String doctTypeId40 = "-//Oracle Corp.//DTD TopLink for JAVA 4.0//EN";
     protected static final String dtdFileName45 = "sessions_4_5.dtd";
@@ -48,7 +48,7 @@
      * INTERNAL:
      */
     public PersistenceEntityResolver() {
-        m_localResources = new Hashtable();
+        m_localResources = new Hashtable<>();
         populateLocalResources();
     }
 
@@ -65,20 +65,20 @@
      * INTERNAL:
      */
     protected String getDtdFileName(String docTypeId) {
-        return (String)getLocalResources().get(docTypeId);
+        return getLocalResources().get(docTypeId);
     }
 
     /**
      * INTERNAL:
      */
-    public Hashtable getLocalResources() {
+    public Hashtable<String, String> getLocalResources() {
         return m_localResources;
     }
 
     /**
      * INTERNAL:
      */
-    public void setLocalResources(Hashtable ht) {
+    public void setLocalResources(Hashtable<String, String> ht) {
         m_localResources = ht;
     }
 
@@ -94,11 +94,11 @@
      */
     @Override
     public InputSource resolveEntity(String publicId, String systemId) {
-        for (Enumeration docTypeIds = m_localResources.keys(); docTypeIds.hasMoreElements();) {
-            String docTypeId = (String)docTypeIds.nextElement();
+        for (Enumeration<String> docTypeIds = m_localResources.keys(); docTypeIds.hasMoreElements();) {
+            String docTypeId = docTypeIds.nextElement();
 
             if ((publicId != null) && publicId.equals(docTypeId)) {
-                InputStream localDtdStream =  null;
+                InputStream localDtdStream;
                 if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                     try{
                         localDtdStream = AccessController.doPrivileged(new PrivilegedGetClassLoaderForClass(getClass())).getResourceAsStream(getDtdFileName(docTypeId));
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/SessionBrokerPlaceHolder.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/SessionBrokerPlaceHolder.java
index 31e4861..6c6c770 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/SessionBrokerPlaceHolder.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/SessionBrokerPlaceHolder.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,26 +30,26 @@
 public class SessionBrokerPlaceHolder extends org.eclipse.persistence.sessions.broker.SessionBroker {
 
     /** This member variable stores the sessions that have been retreived */
-    protected Vector sessionsCompleted;
+    protected Vector<String> sessionsCompleted;
 
     /** This member variable stores the sessions that need to be retreived */
-    protected Vector sessionNamesRequired;
+    protected Vector<String> sessionNamesRequired;
 
     public SessionBrokerPlaceHolder() {
         super();
-        this.sessionNamesRequired = new Vector();
-        this.sessionsCompleted = new Vector();
+        this.sessionNamesRequired = new Vector<>();
+        this.sessionsCompleted = new Vector<>();
     }
 
     public void addSessionName(String sessionName) {
         this.sessionNamesRequired.add(sessionName);
     }
 
-    public Vector getSessionNamesRequired() {
+    public Vector<String> getSessionNamesRequired() {
         return this.sessionNamesRequired;
     }
 
-    public Vector getSessionCompleted() {
+    public Vector<String> getSessionCompleted() {
         return this.sessionsCompleted;
     }
 }
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 fe1fc0c..c015112 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
@@ -639,10 +639,10 @@
 
         // Properties (assumes they are all valid)
         if (loginConfig.getPropertyConfigs() != null) {
-            Enumeration e = loginConfig.getPropertyConfigs().elements();
+            Enumeration<PropertyConfig> e = loginConfig.getPropertyConfigs().elements();
 
             while (e.hasMoreElements()) {
-                PropertyConfig propertyConfig = (PropertyConfig)e.nextElement();
+                PropertyConfig propertyConfig = e.nextElement();
                 login.getProperties().put(propertyConfig.getName(), propertyConfig.getValue());
             }
         }
@@ -673,9 +673,9 @@
             }
 
             // Connection pools
-            Enumeration e = poolsConfig.getConnectionPoolConfigs().elements();
+            Enumeration<ConnectionPoolConfig> e = poolsConfig.getConnectionPoolConfigs().elements();
             while (e.hasMoreElements()) {
-                ConnectionPoolConfig connectionPoolConfig = (ConnectionPoolConfig)e.nextElement();
+                ConnectionPoolConfig connectionPoolConfig = e.nextElement();
                 serverSession.addConnectionPool(buildConnectionPoolConfig(connectionPoolConfig, serverSession));
             }
         }
@@ -736,7 +736,7 @@
     /**
      * INTERNAL:
      */
-    @SuppressWarnings({"unchecked"})
+    @SuppressWarnings({"unchecked", "rawtypes"})
     protected ServerPlatform buildCustomServerPlatformConfig(CustomServerPlatformConfig platformConfig, DatabaseSessionImpl session) {
         ServerPlatform platform;
 
@@ -1083,10 +1083,10 @@
     /**
      * INTERNAL:
      */
+    @SuppressWarnings({"unchecked", "rawtypes"})
     protected void buildOc4jJGroupsTransportManagerConfig(Oc4jJGroupsTransportManagerConfig tmConfig, RemoteCommandManager rcm) {
         TransportManager tm = null;
         try {
-            @SuppressWarnings({"unchecked"})
             Class<TransportManager> tmClass = (Class<TransportManager>) m_classLoader.loadClass(tmConfig.getTransportManagerClassName());
             if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
                 Constructor<TransportManager> constructor = AccessController.doPrivileged(new PrivilegedGetConstructorFor<>(tmClass, new Class[] { RemoteCommandManager.class, boolean.class, String.class }, false));
@@ -1158,10 +1158,10 @@
         tm.setInitialContextFactoryName(namingConfig.getInitialContextFactoryName());
 
         // Properties (assumes they are all valid)
-        Enumeration e = namingConfig.getPropertyConfigs().elements();
+        Enumeration<PropertyConfig> e = namingConfig.getPropertyConfigs().elements();
 
         while (e.hasMoreElements()) {
-            PropertyConfig propertyConfig = (PropertyConfig)e.nextElement();
+            PropertyConfig propertyConfig = e.nextElement();
             tm.getRemoteContextProperties().put(propertyConfig.getName(), propertyConfig.getValue());
         }
     }
@@ -1206,10 +1206,10 @@
      */
     protected void processSessionEventManagerConfig(SessionEventManagerConfig sessionEventManagerConfig, AbstractSession session) {
         if (sessionEventManagerConfig != null) {
-            Enumeration e = sessionEventManagerConfig.getSessionEventListeners().elements();
+            Enumeration<String> e = sessionEventManagerConfig.getSessionEventListeners().elements();
 
             while (e.hasMoreElements()) {
-                String listenerClassName = (String)e.nextElement();
+                String listenerClassName = e.nextElement();
 
                 try {
                     @SuppressWarnings({"unchecked"})
@@ -1245,6 +1245,7 @@
     /**
      * INTERNAL:
      */
+    @SuppressWarnings({"unchecked"})
     protected SessionLog buildJavaLogConfig(JavaLogConfig javaLogConfig, AbstractSession session) {
         SessionLog javaLog = null;
         try {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject.java
index 0b1d559..3e097fa 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigProject.java
@@ -830,7 +830,7 @@
         platformClassMapping.setSetMethodName("setPlatformClass");
         platformClassMapping.setXPath("platform-class/text()");
         platformClassMapping.setConverter(new Converter(){
-            private Map platformList;
+            private Map<String, String> platformList;
             private String oldPrefix = "oracle.toplink.";
             private String newPrefix = "org.eclipse.persistence.";
             private String oldOxmPrefix = oldPrefix + "ox.";
@@ -869,7 +869,7 @@
 
             @Override
             public void initialize(DatabaseMapping mapping, Session session){
-                this.platformList = new HashMap();
+                this.platformList = new HashMap<>();
                 this.platformList.put("org.eclipse.persistence.internal.databaseaccess.AccessPlatform", "org.eclipse.persistence.platform.database.AccessPlatform");
                 this.platformList.put("org.eclipse.persistence.internal.databaseaccess.AttunityPlatform", "org.eclipse.persistence.platform.database.AttunityPlatform");
                 this.platformList.put("org.eclipse.persistence.internal.databaseaccess.CloudscapePlatform", "org.eclipse.persistence.platform.database.CloudscapePlatform");
@@ -1225,7 +1225,7 @@
         return descriptor;
     }
 
-    public ClassDescriptor buildServerPlatformConfigDescriptorFor(Class serverPlatformClass) {
+    public ClassDescriptor buildServerPlatformConfigDescriptorFor(Class<?> serverPlatformClass) {
         XMLDescriptor descriptor = new XMLDescriptor();
         descriptor.setJavaClass(serverPlatformClass);
         descriptor.getInheritancePolicy().setParentClass(ServerPlatformConfig.class);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigToplinkProject.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigToplinkProject.java
index 79ab8f0..6ccf2ff 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigToplinkProject.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/XMLSessionConfigToplinkProject.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -25,6 +25,13 @@
  */
 
 public class XMLSessionConfigToplinkProject extends  XMLSessionConfigProject{
+
+    /**
+     * Default constructor.
+     */
+    public XMLSessionConfigToplinkProject() {
+    }
+
     @Override
     public ClassDescriptor buildSessionConfigsDescriptor() {
         XMLDescriptor descriptor = (XMLDescriptor)super.buildSessionConfigsDescriptor();
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/event/SessionEventManagerConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/event/SessionEventManagerConfig.java
index f32df73..b0afbb9 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/event/SessionEventManagerConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/event/SessionEventManagerConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -20,21 +20,21 @@
  * INTERNAL:
  */
 public class SessionEventManagerConfig {
-    private Vector m_sessionEventListeners;
+    private Vector<String> m_sessionEventListeners;
 
     public SessionEventManagerConfig() {
-        m_sessionEventListeners = new Vector();
+        m_sessionEventListeners = new Vector<>();
     }
 
     public void addSessionEventListener(String listener) {
         m_sessionEventListeners.add(listener);
     }
 
-    public void setSessionEventListeners(Vector sessionEventListeners) {
+    public void setSessionEventListeners(Vector<String> sessionEventListeners) {
         m_sessionEventListeners = sessionEventListeners;
     }
 
-    public Vector getSessionEventListeners() {
+    public Vector<String> getSessionEventListeners() {
         return m_sessionEventListeners;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/AppendNewElementsOrderingPolicyConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/AppendNewElementsOrderingPolicyConfig.java
index 8b890b2..bd4721f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/AppendNewElementsOrderingPolicyConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/AppendNewElementsOrderingPolicyConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,4 +16,9 @@
 
 public class AppendNewElementsOrderingPolicyConfig extends NodeOrderingPolicyConfig {
 
+    /**
+     * Default constructor.
+     */
+    public AppendNewElementsOrderingPolicyConfig() {
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/DescriptorLevelDocumentPreservationPolicyConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/DescriptorLevelDocumentPreservationPolicyConfig.java
index 1f36864..ee16331 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/DescriptorLevelDocumentPreservationPolicyConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/DescriptorLevelDocumentPreservationPolicyConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,4 +16,9 @@
 
 public class DescriptorLevelDocumentPreservationPolicyConfig extends DocumentPreservationPolicyConfig {
 
+    /**
+     * Default constructor.
+     */
+    public DescriptorLevelDocumentPreservationPolicyConfig() {
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/DocumentPreservationPolicyConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/DocumentPreservationPolicyConfig.java
index ce16950..d2c1631 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/DocumentPreservationPolicyConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/DocumentPreservationPolicyConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,6 +16,12 @@
 
 public abstract class DocumentPreservationPolicyConfig {
 
+    /**
+     * Default constructor.
+     */
+    protected DocumentPreservationPolicyConfig() {
+    }
+
     private NodeOrderingPolicyConfig m_nodeOrderingPolicy;
 
     public NodeOrderingPolicyConfig getNodeOrderingPolicy() {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/IgnoreNewElementsOrderingPolicyConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/IgnoreNewElementsOrderingPolicyConfig.java
index d84cf8e..54fd570 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/IgnoreNewElementsOrderingPolicyConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/IgnoreNewElementsOrderingPolicyConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,4 +16,7 @@
 
 public class IgnoreNewElementsOrderingPolicyConfig extends NodeOrderingPolicyConfig {
 
+    public IgnoreNewElementsOrderingPolicyConfig() {
+        super();
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/LoginConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/LoginConfig.java
index 9066360..b34004f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/LoginConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/LoginConfig.java
@@ -16,6 +16,7 @@
 
 import java.util.Vector;
 import org.eclipse.persistence.internal.security.SecurableObjectHolder;
+import org.eclipse.persistence.internal.sessions.factories.model.property.PropertyConfig;
 import org.eclipse.persistence.internal.sessions.factories.model.sequencing.SequencingConfig;
 
 /**
@@ -30,7 +31,7 @@
     private boolean m_externalConnectionPooling;
     private boolean m_externalTransactionController;
     private SequencingConfig m_sequencingConfig;
-    private Vector m_propertyConfigs;
+    private Vector<PropertyConfig> m_propertyConfigs;
 
     protected LoginConfig() {
         // Without setting the encryption class name the object holder will
@@ -156,11 +157,11 @@
         return m_sequencingConfig;
     }
 
-    public void setPropertyConfigs(Vector propertyConfigs) {
+    public void setPropertyConfigs(Vector<PropertyConfig> propertyConfigs) {
         m_propertyConfigs = propertyConfigs;
     }
 
-    public Vector getPropertyConfigs() {
+    public Vector<PropertyConfig> getPropertyConfigs() {
         return m_propertyConfigs;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/NoDocumentPreservationPolicyConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/NoDocumentPreservationPolicyConfig.java
index 1429c03..8dabad1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/NoDocumentPreservationPolicyConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/NoDocumentPreservationPolicyConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,4 +16,9 @@
 
 public class NoDocumentPreservationPolicyConfig extends DocumentPreservationPolicyConfig {
 
+    /**
+     * Default constructor.
+     */
+    public NoDocumentPreservationPolicyConfig() {
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/NodeOrderingPolicyConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/NodeOrderingPolicyConfig.java
index a8a8843..91dcbc4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/NodeOrderingPolicyConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/NodeOrderingPolicyConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,4 +16,9 @@
 
 public abstract class NodeOrderingPolicyConfig {
 
+    /**
+     * Default constructor.
+     */
+    protected NodeOrderingPolicyConfig() {
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/RelativePositionOrderingPolicyConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/RelativePositionOrderingPolicyConfig.java
index 4e15254..b1a0d73 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/RelativePositionOrderingPolicyConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/RelativePositionOrderingPolicyConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,4 +16,10 @@
 
 public class RelativePositionOrderingPolicyConfig extends NodeOrderingPolicyConfig {
 
+    /**
+     * Default constructor.
+     */
+    public RelativePositionOrderingPolicyConfig() {
+        super();
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/XMLBinderPolicyConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/XMLBinderPolicyConfig.java
index 9be67d0..009994f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/XMLBinderPolicyConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/login/XMLBinderPolicyConfig.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -16,4 +16,9 @@
 
 public class XMLBinderPolicyConfig extends DocumentPreservationPolicyConfig {
 
+    /**
+     * Default constructor.
+     */
+    public XMLBinderPolicyConfig() {
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/pool/PoolsConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/pool/PoolsConfig.java
index 46b3ada..5e0012d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/pool/PoolsConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/pool/PoolsConfig.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
@@ -23,10 +23,10 @@
     private ReadConnectionPoolConfig m_readConnectionPoolConfig;
     private WriteConnectionPoolConfig m_writeConnectionPoolConfig;
     private ConnectionPoolConfig m_sequenceConnectionPoolConfig;
-    private Vector m_connectionPoolConfigs;
+    private Vector<ConnectionPoolConfig> m_connectionPoolConfigs;
 
     public PoolsConfig() {
-        m_connectionPoolConfigs = new Vector();
+        m_connectionPoolConfigs = new Vector<>();
     }
 
     public void setReadConnectionPoolConfig(ReadConnectionPoolConfig readConnectionPoolConfig) {
@@ -57,11 +57,11 @@
         m_connectionPoolConfigs.add(connectionPoolConfig);
     }
 
-    public void setConnectionPoolConfigs(Vector connectionPoolConfigs) {
+    public void setConnectionPoolConfigs(Vector<ConnectionPoolConfig> connectionPoolConfigs) {
         m_connectionPoolConfigs = connectionPoolConfigs;
     }
 
-    public Vector getConnectionPoolConfigs() {
+    public Vector<ConnectionPoolConfig> getConnectionPoolConfigs() {
         return m_connectionPoolConfigs;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/transport/JMSTopicTransportManagerConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/transport/JMSTopicTransportManagerConfig.java
index c5e02b7..1da9bea 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/transport/JMSTopicTransportManagerConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/transport/JMSTopicTransportManagerConfig.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,10 +15,14 @@
 //     cdelahun - Bug 214534: moved all api to JMSPublishingTransportManagerConfig
 package org.eclipse.persistence.internal.sessions.factories.model.transport;
 
-
 /**
  * INTERNAL:
  */
 public class JMSTopicTransportManagerConfig extends JMSPublishingTransportManagerConfig {
 
+    /**
+     * Default constructor.
+     */
+    public JMSTopicTransportManagerConfig() {
+    }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/transport/naming/JNDINamingServiceConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/transport/naming/JNDINamingServiceConfig.java
index 98cc179..9ced9e4 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/transport/naming/JNDINamingServiceConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/transport/naming/JNDINamingServiceConfig.java
@@ -16,6 +16,7 @@
 
 import java.util.Vector;
 import org.eclipse.persistence.internal.security.SecurableObjectHolder;
+import org.eclipse.persistence.internal.sessions.factories.model.property.PropertyConfig;
 
 /**
  * INTERNAL:
@@ -26,7 +27,7 @@
     private char[] m_encryptedPassword;
     private SecurableObjectHolder m_securableObjectHolder;
     private String m_initialContextFactoryName;
-    private Vector m_propertyConfigs;
+    private Vector<PropertyConfig> m_propertyConfigs;
 
     public JNDINamingServiceConfig() {
         // Without setting the encryption class name the object holder will
@@ -127,11 +128,11 @@
         return m_initialContextFactoryName;
     }
 
-    public void setPropertyConfigs(Vector propertyConfigs) {
+    public void setPropertyConfigs(Vector<PropertyConfig> propertyConfigs) {
         m_propertyConfigs = propertyConfigs;
     }
 
-    public Vector getPropertyConfigs() {
+    public Vector<PropertyConfig> getPropertyConfigs() {
         return m_propertyConfigs;
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/OracleDirectToXMLTypeMappingHelper.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/OracleDirectToXMLTypeMappingHelper.java
index e51fef1..3764494 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/OracleDirectToXMLTypeMappingHelper.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/OracleDirectToXMLTypeMappingHelper.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,6 +33,14 @@
 public class OracleDirectToXMLTypeMappingHelper extends DirectToXMLTypeMappingHelper {
 
     protected String namespaceXPath;
+
+    /**
+     * Default constructor.
+     */
+    public OracleDirectToXMLTypeMappingHelper() {
+        super();
+    }
+
     /**
      * Add the XMLType mapping indicator to the DatabaseMapping descriptor.
      */
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/ProjectClassGenerator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/ProjectClassGenerator.java
index 87cfe21..f3c6d21 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/ProjectClassGenerator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/ProjectClassGenerator.java
@@ -25,7 +25,6 @@
 import java.io.StringWriter;
 import java.io.Writer;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Enumeration;
 import java.util.Hashtable;
@@ -128,7 +127,7 @@
     protected String outputFileName;
     protected Writer outputWriter;
     protected Project project;
-    protected Hashtable descriptorMethodNames;
+    protected Hashtable<ClassDescriptor, String> descriptorMethodNames;
 
     /**
      * PUBLIC:
@@ -139,7 +138,7 @@
         this.outputFileName = "TopLinkProject.java";
         this.className = "TopLinkProject";
         this.packageName = "";
-        this.descriptorMethodNames = new Hashtable();
+        this.descriptorMethodNames = new Hashtable<>();
     }
 
     /**
@@ -633,7 +632,7 @@
 
         method.addLine("HistoryPolicy " + policyName + " = new HistoryPolicy();");
         for (DatabaseTable table : policy.getHistoricalTables()) {
-            String sourceName = null;
+            String sourceName;
             if (table.getTableQualifier().equals("")) {
                 sourceName = table.getName();
             } else {
@@ -673,9 +672,9 @@
                 if (policy.shouldUseClassNameAsIndicator()) {
                     method.addLine("descriptor.getInheritancePolicy().useClassNameAsIndicator();");
                 } else {
-                    for (Iterator indicatorsEnum = policy.getClassNameIndicatorMapping().keySet().iterator();
+                    for (Iterator<String> indicatorsEnum = policy.getClassNameIndicatorMapping().keySet().iterator();
                              indicatorsEnum.hasNext();) {
-                        String className = (String)indicatorsEnum.next();
+                        String className = indicatorsEnum.next();
                         Object value = policy.getClassNameIndicatorMapping().get(className);
                         method.addLine("descriptor.getInheritancePolicy().addClassIndicator(" + className + ".class, " + printString(value) + ");");
                     }
@@ -802,7 +801,7 @@
         if (converter.getDefaultAttributeValue() != null) {
             method.addLine(converterName + ".setDefaultAttributeValue(" + printString(converter.getDefaultAttributeValue()) + ");");
         }
-        for (Iterator typesEnum = converter.getAttributeToFieldValues().keySet().iterator();
+        for (Iterator<Object> typesEnum = converter.getAttributeToFieldValues().keySet().iterator();
                  typesEnum.hasNext();) {
             Object attributeValue = typesEnum.next();
             Object fieldValue = converter.getAttributeToFieldValues().get(attributeValue);
@@ -810,7 +809,7 @@
         }
 
         // Read-only conversions.
-        for (Iterator typesEnum = converter.getFieldToAttributeValues().keySet().iterator();
+        for (Iterator<Object> typesEnum = converter.getFieldToAttributeValues().keySet().iterator();
                  typesEnum.hasNext();) {
             Object fieldValue = typesEnum.next();
             Object attributeValue = converter.getFieldToAttributeValues().get(fieldValue);
@@ -954,10 +953,10 @@
         // Named queries.
         if (descriptor.getQueryManager().getAllQueries().size() > 0) {
             method.addLine("// Named Queries.");
-            Enumeration namedQueries = descriptor.getQueryManager().getAllQueries().elements();
+            Enumeration<DatabaseQuery> namedQueries = descriptor.getQueryManager().getAllQueries().elements();
             int iteration = 0;
             while (namedQueries.hasMoreElements()) {
-                addNamedQueryLines(method, (DatabaseQuery)namedQueries.nextElement(), descriptor.getQueryManager(), iteration);
+                addNamedQueryLines(method, namedQueries.nextElement(), descriptor.getQueryManager(), iteration);
                 ++iteration;
             }
         }
@@ -999,9 +998,9 @@
     }
 
     protected void addNamedQueryLines(NonreflectiveMethodDefinition method, DatabaseQuery query, DescriptorQueryManager queryManager, int iteration) {
-        String queryIdentifier = "namedQuery" + String.valueOf(iteration);
+        String queryIdentifier = "namedQuery" + iteration;
         method.addLine("// Named Query -- " + query.getName());
-        String className = "";
+        String className;
         if (query.getDescriptor() != null) {
             className = query.getDescriptor().getJavaClassName();
         } else {
@@ -1046,28 +1045,28 @@
             method.addLine(queryIdentifier + ".setCascadePolicy(" + cascadePolicy + ");");
         }
         if (query.getQueryTimeout() != DescriptorQueryManager.DefaultTimeout) {
-            method.addLine(queryIdentifier + ".setQueryTimeout(" + String.valueOf(query.getQueryTimeout()) + ");");
+            method.addLine(queryIdentifier + ".setQueryTimeout(" + query.getQueryTimeout() + ");");
         }
         if (query.getQueryTimeoutUnit() != DescriptorQueryManager.DefaultTimeoutUnit) {
             method.addLine(queryIdentifier + ".setQueryTimeoutUnit(" + query.getQueryTimeoutUnit() + ");");
         }
         if (!query.shouldUseWrapperPolicy()) {
-            method.addLine(queryIdentifier + ".setShouldUseWrapperPolicy(" + String.valueOf(query.shouldUseWrapperPolicy()) + ");");
+            method.addLine(queryIdentifier + ".setShouldUseWrapperPolicy(" + query.shouldUseWrapperPolicy() + ");");
         }
         if (!query.shouldIgnoreBindAllParameters()) {
-            method.addLine(queryIdentifier + ".setShouldBindAllParameters(" + String.valueOf(query.shouldBindAllParameters()) + ");");
+            method.addLine(queryIdentifier + ".setShouldBindAllParameters(" + query.shouldBindAllParameters() + ");");
         }
         if (!query.shouldIgnoreCacheStatement()) {
-            method.addLine(queryIdentifier + ".setShouldCacheStatement(" + String.valueOf(query.shouldCacheStatement()) + ");");
+            method.addLine(queryIdentifier + ".setShouldCacheStatement(" + query.shouldCacheStatement() + ");");
         }
         if (query.getSessionName() != null) {
             method.addLine(queryIdentifier + ".setSessionName(\"" + query.getSessionName() + "\");");
         }
         if (!query.shouldMaintainCache()) {
-            method.addLine(queryIdentifier + ".setShouldMaintainCache(" + String.valueOf(query.shouldMaintainCache()) + ");");
+            method.addLine(queryIdentifier + ".setShouldMaintainCache(" + query.shouldMaintainCache() + ");");
         }
         if (!query.shouldPrepare()) {
-            method.addLine(queryIdentifier + ".setShouldPrepare(" + String.valueOf(query.shouldPrepare()) + ");");
+            method.addLine(queryIdentifier + ".setShouldPrepare(" + query.shouldPrepare() + ");");
         }
 
         if (query.isReadQuery()) {
@@ -1076,10 +1075,10 @@
                 method.addLine(queryIdentifier + ".setQueryResultsCachePolicy(new QueryResultsCachePolicy());");
             }
             if (readQuery.getMaxRows() != 0) {
-                method.addLine(queryIdentifier + ".setMaxRows(" + String.valueOf(readQuery.getMaxRows()) + ");");
+                method.addLine(queryIdentifier + ".setMaxRows(" + readQuery.getMaxRows() + ");");
             }
             if (readQuery.getFirstResult() != 0) {
-                method.addLine(queryIdentifier + ".setFirstResult(" + String.valueOf(readQuery.getFirstResult()) + ");");
+                method.addLine(queryIdentifier + ".setFirstResult(" + readQuery.getFirstResult() + ");");
             }
         }
 
@@ -1091,7 +1090,7 @@
 
             // Refresh.
             if (readQuery.shouldRefreshIdentityMapResult()) {
-                method.addLine(queryIdentifier + ".setShouldRefreshIdentityMapResult(" + String.valueOf(readQuery.shouldRefreshIdentityMapResult()) + ");");
+                method.addLine(queryIdentifier + ".setShouldRefreshIdentityMapResult(" + readQuery.shouldRefreshIdentityMapResult() + ");");
             }
 
             // Cache usage.
@@ -1130,7 +1129,7 @@
 
             // Remote refresh.
             if (readQuery.shouldRefreshRemoteIdentityMapResult()) {
-                method.addLine(queryIdentifier + ".setShouldRefreshRemoteIdentityMapResult(" + String.valueOf(readQuery.shouldRefreshRemoteIdentityMapResult()) + ");");
+                method.addLine(queryIdentifier + ".setShouldRefreshRemoteIdentityMapResult(" + readQuery.shouldRefreshRemoteIdentityMapResult() + ");");
             }
 
             // Distinct state.
@@ -1272,9 +1271,9 @@
                     }
                     baseExpression.printJava(javaPrinter);
                     if (databaseString == null) { //e.g. addCount(itemName, attributeExpression)
-                        method.addLine(queryIdentifier + functionString + itemName + "\", " + writer.toString() + ");");
+                        method.addLine(queryIdentifier + functionString + itemName + "\", " + writer + ");");
                     } else { //i.e. addFunctionItem(itemName, attributeExpression, functionName) only
-                        method.addLine(queryIdentifier + functionString + itemName + "\", " + writer.toString() + ", \"" + databaseString + "\");");
+                        method.addLine(queryIdentifier + functionString + itemName + "\", " + writer + ", \"" + databaseString + "\");");
                     }
                 }
             }
@@ -1313,7 +1312,7 @@
     //Build ExpressionBuilder string
     protected String buildBuilderString(String builderString, NonreflectiveMethodDefinition method, int iteration, String queryIdentifier) {
         if (builderString == null) {
-            builderString = "expBuilder" + String.valueOf(iteration);
+            builderString = "expBuilder" + iteration;
             method.addLine("ExpressionBuilder " + builderString + " = " + queryIdentifier + ".getExpressionBuilder();");
         }
         return builderString;
@@ -1324,7 +1323,7 @@
         StringWriter writer = new StringWriter();
         ExpressionJavaPrinter javaPrinter = new ExpressionJavaPrinter(builderString, writer, project.getDatasourceLogin().getPlatform());
         exp.printJava(javaPrinter);
-        method.addLine(queryIdentifier + attrString + writer.toString() + ");");
+        method.addLine(queryIdentifier + attrString + writer + ");");
     }
 
     protected void addReturningPolicyLines(NonreflectiveMethodDefinition method, ReturningPolicy policy) {
@@ -1443,9 +1442,9 @@
     }
 
     protected void addVariableOneToOneMappingLines(NonreflectiveMethodDefinition method, String mappingName, VariableOneToOneMapping mapping) {
-        for (Iterator foreignKeysEnum = mapping.getSourceToTargetQueryKeyNames().keySet().iterator();
+        for (Iterator<DatabaseField> foreignKeysEnum = mapping.getSourceToTargetQueryKeyNames().keySet().iterator();
                  foreignKeysEnum.hasNext();) {
-            DatabaseField sourceField = (DatabaseField)foreignKeysEnum.next();
+            DatabaseField sourceField = foreignKeysEnum.next();
             String targetQueryKey = (String)mapping.getSourceToTargetQueryKeyNames().get(sourceField);
             if (mapping.getForeignKeyFields().contains(sourceField)) {
                 method.addLine(mappingName + ".addForeignQueryKeyName(\"" + sourceField.getQualifiedName() + "\", \"" + targetQueryKey + "\");");
@@ -1457,9 +1456,9 @@
         if (mapping.getTypeField() != null) {
             method.addLine(mappingName + ".setTypeFieldName(\"" + mapping.getTypeFieldName() + "\");");
 
-            for (Iterator typeIndicatorsEnum = mapping.getTypeIndicatorNameTranslation().keySet().iterator();
+            for (Iterator<String> typeIndicatorsEnum = mapping.getTypeIndicatorNameTranslation().keySet().iterator();
                      typeIndicatorsEnum.hasNext();) {
-                String className = (String)typeIndicatorsEnum.next();
+                String className = typeIndicatorsEnum.next();
                 Object value = mapping.getTypeIndicatorNameTranslation().get(className);
                 method.addLine(mappingName + ".addClassIndicator(" + className + ".class, " + printString(value) + ");");
             }
@@ -1602,9 +1601,9 @@
         if (!descriptor.getMappings().isEmpty()) {
             method.addLine("");
             method.addLine("// Mappings.");
-            for (Enumeration mappingsEnum = sortMappings(descriptor.getMappings()).elements();
+            for (Enumeration<DatabaseMapping> mappingsEnum = sortMappings(descriptor.getMappings()).elements();
                      mappingsEnum.hasMoreElements();) {
-                addMappingLines(method, (DatabaseMapping)mappingsEnum.nextElement());
+                addMappingLines(method, mappingsEnum.nextElement());
                 method.addLine("");
             }
         } else {
@@ -1625,16 +1624,8 @@
      *  Take an unsorted list of descriptors and sort it so that the order is maintained.
      */
     private List<ClassDescriptor> buildSortedListOfDescriptors(List<ClassDescriptor> descriptors) {
-        List returnDescriptors = Helper.addAllUniqueToList(new ArrayList(descriptors.size()), descriptors);
-        Object[] descriptorsArray = new Object[returnDescriptors.size()];
-        for (int index = 0; index < returnDescriptors.size(); index++) {
-            descriptorsArray[index] = returnDescriptors.get(index);
-        }
-        Arrays.sort(descriptorsArray, new DescriptorCompare());
-        returnDescriptors = new ArrayList(descriptorsArray.length);
-        for (Object descriptor : descriptorsArray) {
-            returnDescriptors.add(descriptor);
-        }
+        List<ClassDescriptor> returnDescriptors = Helper.addAllUniqueToList(new ArrayList<>(descriptors.size()), descriptors);
+        returnDescriptors.sort(new DescriptorCompare());
         return returnDescriptors;
     }
 
@@ -1719,16 +1710,15 @@
             addedSequencingHeader = true;
             method.addLine(setDefaultOrAddSequenceString(defaultSequence, true));
         }
-        Map sequences = ((DatasourceLogin)datasourceLogin).getSequencesToWrite();
+        Map<String, Sequence> sequences = ((DatasourceLogin)datasourceLogin).getSequencesToWrite();
         if ((sequences != null) && !sequences.isEmpty()) {
             if (!addedSequencingHeader) {
                 method.addLine("");
                 method.addLine("// Sequencing.");
-                addedSequencingHeader = true;
             }
-            Iterator it = sequences.values().iterator();
+            Iterator<Sequence> it = sequences.values().iterator();
             while (it.hasNext()) {
-                Sequence sequence = (Sequence)it.next();
+                Sequence sequence = it.next();
                 method.addLine(setDefaultOrAddSequenceString(sequence, false));
             }
         }
@@ -1765,7 +1755,7 @@
      * first using the local class name then the qualified one for duplicates.
      */
     protected void computeDescriptorMethodNames() {
-        Hashtable shortNames = new Hashtable();
+        Hashtable<String, ClassDescriptor> shortNames = new Hashtable<>();
         Iterator<ClassDescriptor> descriptors = project.getOrderedDescriptors().iterator();
         while (descriptors.hasNext()) {
             ClassDescriptor descriptor = descriptors.next();
@@ -1775,7 +1765,7 @@
                 String shortName = Helper.getShortClassName(descriptor.getJavaClassName());
                 if (shortNames.containsKey(shortName)) {
                     // Use the full package name.
-                    ClassDescriptor firstDescriptor = (ClassDescriptor)shortNames.get(shortName);
+                    ClassDescriptor firstDescriptor = shortNames.get(shortName);
                     getDescriptorMethodNames().put(firstDescriptor, removeDots(firstDescriptor.getJavaClassName()));
                     getDescriptorMethodNames().put(descriptor, removeDots(descriptor.getJavaClassName()));
                 } else {
@@ -1870,7 +1860,7 @@
         return className;
     }
 
-    protected Hashtable getDescriptorMethodNames() {
+    protected Hashtable<ClassDescriptor, String> getDescriptorMethodNames() {
         return descriptorMethodNames;
     }
 
@@ -1963,7 +1953,7 @@
         // This handles most cases.
         //CR#2648.  Get fully qualified name for object.
         // Bug 298443 - account for Byte, Double, Short, Long, etc. constructors.
-        return "new " + value.getClass().getName() + "(\"" + String.valueOf(value) + "\")";
+        return "new " + value.getClass().getName() + "(\"" + value + "\")";
 
     }
 
@@ -1976,7 +1966,7 @@
             startIndex = dotIndex + 1;
             dotIndex = packageName.indexOf('.', startIndex);
         }
-        writer.write(packageName.substring(startIndex, packageName.length()));
+        writer.write(packageName.substring(startIndex));
 
         return writer.toString();
     }
@@ -1989,7 +1979,7 @@
     public void setClassName(String newClassName) {
         int lastDotIndex = newClassName.lastIndexOf('.');
         if (lastDotIndex >= 0) {
-            className = newClassName.substring(lastDotIndex + 1, newClassName.length());
+            className = newClassName.substring(lastDotIndex + 1);
             setPackageName(newClassName.substring(0, lastDotIndex));
         } else {
             className = newClassName;
@@ -1997,7 +1987,7 @@
         setOutputFileName(newClassName);
     }
 
-    protected void setDescriptorMethodNames(Hashtable descriptorMethodNames) {
+    protected void setDescriptorMethodNames(Hashtable<ClassDescriptor, String> descriptorMethodNames) {
         this.descriptorMethodNames = descriptorMethodNames;
     }
 
@@ -2007,7 +1997,7 @@
      * If the file does not include .java it will be appended.
      */
     public void setOutputFileName(String newOutputFileName) {
-        if (newOutputFileName.indexOf(".java") < 0) {
+        if (!newOutputFileName.contains(".java")) {
             outputFileName = newOutputFileName + ".java";
         } else {
             outputFileName = newOutputFileName;
@@ -2050,55 +2040,55 @@
     /**
      * Short the mappings by type.
      */
-    protected Vector sortMappings(Vector mappings) {
-        Vector sortedMappings = new Vector(mappings.size());
+    protected Vector<DatabaseMapping> sortMappings(Vector<DatabaseMapping> mappings) {
+        Vector<DatabaseMapping> sortedMappings = new Vector<>(mappings.size());
 
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             if (mapping.getClass().equals(DirectToFieldMapping.class)) {
                 sortedMappings.addElement(mapping);
             }
         }
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             if (mapping.isTransformationMapping()) {
                 sortedMappings.addElement(mapping);
             }
         }
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             if (mapping.isAggregateMapping()) {
                 sortedMappings.addElement(mapping);
             }
         }
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             if (mapping.isDirectCollectionMapping()) {
                 sortedMappings.addElement(mapping);
             }
         }
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             if (mapping.isObjectReferenceMapping()) {
                 sortedMappings.addElement(mapping);
             }
         }
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             if (mapping.isOneToManyMapping()) {
                 sortedMappings.addElement(mapping);
             }
         }
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             if (mapping.isManyToManyMapping()) {
                 sortedMappings.addElement(mapping);
             }
         }
 
         // Others
-        for (Enumeration mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
-            DatabaseMapping mapping = (DatabaseMapping)mappingsEnum.nextElement();
+        for (Enumeration<DatabaseMapping> mappingsEnum = mappings.elements(); mappingsEnum.hasMoreElements();) {
+            DatabaseMapping mapping = mappingsEnum.nextElement();
             if (!sortedMappings.contains(mapping)) {
                 sortedMappings.addElement(mapping);
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/SessionManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/SessionManager.java
index 13f4292..1d48b54 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/SessionManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/SessionManager.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
@@ -61,7 +61,7 @@
 
     protected static volatile SessionManager manager;
     protected AbstractSession defaultSession;
-    protected ConcurrentMap<String, Session> sessions = null;
+    protected ConcurrentMap<String, Session> sessions;
     protected static boolean shouldPerformDTDValidation;
     private static volatile ConcurrentMap<String, SessionManager> managers;
     private static volatile ServerPlatform detectedPlatform;
@@ -207,9 +207,9 @@
             if (session.isConnected()) {
                 ((DatabaseSession) session).logout();
             }
-        } catch (Throwable ignore) {
+        } catch (Throwable ig) {
             // EL Bug 321843 - Must handle errors from logout.
-            LOG.logThrowable(SessionLog.WARNING, AbstractSessionLog.CONNECTION, ignore);
+            LOG.logThrowable(SessionLog.WARNING, AbstractSessionLog.CONNECTION, ig);
         }
 
         sessions.remove(session.getName());
@@ -389,7 +389,7 @@
     public org.eclipse.persistence.internal.sessions.AbstractSession getSession(String sessionName, Object objectBean) {
         XMLSessionConfigLoader loader = new XMLSessionConfigLoader();
         loader.setSessionName(sessionName);
-        ClassLoader classLoader = null;
+        ClassLoader classLoader;
         if (PrivilegedAccessHelper.shouldUsePrivilegedAccess()){
             try{
                 classLoader = AccessController.doPrivileged(new PrivilegedGetClassLoaderForClass(objectBean.getClass()));
@@ -582,8 +582,8 @@
                             // Must handles errors from logout as session maybe hosed.
                             try {
                                 ((DatabaseSession)session).logout();
-                            } catch (Throwable ignore) {
-                                LOG.logThrowable(SessionLog.WARNING, AbstractSessionLog.CONNECTION, ignore);
+                            } catch (Throwable ig) {
+                                LOG.logThrowable(SessionLog.WARNING, AbstractSessionLog.CONNECTION, ig);
                             }
                         }
                         getSessions().remove(loader.getSessionName());
@@ -628,7 +628,7 @@
      *
      * @param sessions sessions for this session manager
      */
-    public void setSessions(ConcurrentMap sessions) {
+    public void setSessions(ConcurrentMap<String, Session> sessions) {
         this.sessions = sessions;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/TableCreatorClassGenerator.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/TableCreatorClassGenerator.java
index c846541..4847e66 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/TableCreatorClassGenerator.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/TableCreatorClassGenerator.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
@@ -355,7 +355,7 @@
             startIndex = dotIndex + 1;
             dotIndex = packageName.indexOf('.', startIndex);
         }
-        writer.write(packageName.substring(startIndex, packageName.length()));
+        writer.write(packageName.substring(startIndex));
 
         return writer.toString();
     }
@@ -368,7 +368,7 @@
     public void setClassName(String newClassName) {
         int lastDotIndex = newClassName.lastIndexOf('.');
         if (lastDotIndex >= 0) {
-            className = newClassName.substring(lastDotIndex + 1, newClassName.length());
+            className = newClassName.substring(lastDotIndex + 1);
             setPackageName(newClassName.substring(0, lastDotIndex));
         } else {
             className = newClassName;
@@ -382,7 +382,7 @@
      * If the file does not include .java it will be appended.
      */
     public void setOutputFileName(String newOutputFileName) {
-        if (newOutputFileName.indexOf(".java") < 0) {
+        if (!newOutputFileName.contains(".java")) {
             outputFileName = newOutputFileName + ".java";
         } else {
             outputFileName = newOutputFileName;
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLSessionConfigLoader.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLSessionConfigLoader.java
index b2f1210..bbaf0f3 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLSessionConfigLoader.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/factories/XMLSessionConfigLoader.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
@@ -381,6 +381,13 @@
      * @author Guy Pelletier
      */
     public class XMLSessionConfigLoaderErrorHandler implements ErrorHandler {
+
+        /**
+         * Default constructor.
+         */
+        public XMLSessionConfigLoaderErrorHandler() {
+        }
+
         @Override
         public void warning(SAXParseException e) throws SAXException {
             getExceptionStore().add(SessionLoaderException.failedToParseXML(ExceptionLocalization.buildMessage("parsing_warning"), e.getLineNumber(), e.getColumnNumber(), e));
