diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
index f39e44f..e252a34 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/DatasourcePlatform.java
@@ -902,7 +902,7 @@
      * Sets sequences - for XML support only
      */
     @Override
-    public void setSequences(Map sequences) {
+    public void setSequences(Map<String, Sequence> sequences) {
         this.sequences = sequences;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Platform.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Platform.java
index 08c7f70..2b31561 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Platform.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/databaseaccess/Platform.java
@@ -246,13 +246,13 @@
      * INTERNAL:
      * Returns a map of sequence names to Sequences (may be null).
      */
-    Map getSequences();
+    Map<String, Sequence> getSequences();
 
     /**
      * INTERNAL:
      * Used only for writing into XML or Java.
      */
-    Map getSequencesToWrite();
+    Map<String, Sequence> getSequencesToWrite();
 
     /**
      * INTERNAL:
@@ -264,7 +264,7 @@
      * INTERNAL:
      * Used only for reading from XML.
      */
-    void setSequences(Map sequences);
+    void setSequences(Map<String, Sequence> sequences);
 
     /**
      * INTERNAL:
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/ClientSessionSequencing.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/ClientSessionSequencing.java
index e922f63..0c24675 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/ClientSessionSequencing.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/ClientSessionSequencing.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -14,7 +14,6 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.sequencing;
 
-import org.eclipse.persistence.internal.sequencing.Sequencing;
 import org.eclipse.persistence.sessions.server.ClientSession;
 
 /**
@@ -68,9 +67,10 @@
     * SequencingServer.getNextValue takes two arguments
     * the first argument being a session which owns write connection
     * (either DatabaseSession or ClientSession).
-    */
+     * @param cls
+     */
     @Override
-    public Object getNextValue(Class cls) {
+    public Object getNextValue(Class<?> cls) {
         return sequencingServer.getNextValue(clientSession, cls);
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/PreallocationHandler.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/PreallocationHandler.java
index 39c1e59..e158e8e 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/PreallocationHandler.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/PreallocationHandler.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,7 +23,7 @@
  * @see SequencingManager
  */
 class PreallocationHandler implements SequencingLogInOut {
-    protected Map<String, Queue> preallocatedSequences;
+    protected Map<String, Queue<Object>> preallocatedSequences;
 
     public PreallocationHandler() {
         super();
@@ -34,13 +34,13 @@
      * If there is not one, a new empty Queue is registered.
      * This queue is thread-safe, and threads can concurrent poll the queue to remove the first element.
      */
-    public Queue getPreallocated(String sequenceName) {
-        Queue sequences = preallocatedSequences.get(sequenceName);
+    public Queue<Object> getPreallocated(String sequenceName) {
+        Queue<Object> sequences = preallocatedSequences.get(sequenceName);
         if (sequences == null) {
             synchronized (preallocatedSequences) {
                 sequences = preallocatedSequences.get(sequenceName);
                 if (sequences == null) {
-                    sequences = new ConcurrentLinkedQueue();
+                    sequences = new ConcurrentLinkedQueue<>();
                     preallocatedSequences.put(sequenceName, sequences);
                 }
             }
@@ -70,7 +70,7 @@
      * but so handy for testing.
      */
     public void initializePreallocated() {
-        preallocatedSequences = new ConcurrentHashMap(20);
+        preallocatedSequences = new ConcurrentHashMap<>(20);
     }
 
     /**
@@ -87,7 +87,7 @@
      * Although this method is thread-safe, a lock should typically be obtained from the sequence manager before calling this method,
      * to ensure sequential numbers.
      */
-    public void setPreallocated(String seqName, Vector sequences) {
+    public void setPreallocated(String seqName, Vector<?> sequences) {
         getPreallocated(seqName).addAll(sequences);
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/RemoteConnectionSequencing.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/RemoteConnectionSequencing.java
index 2e44ce2..1c561d5 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/RemoteConnectionSequencing.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/RemoteConnectionSequencing.java
@@ -15,7 +15,7 @@
 package org.eclipse.persistence.internal.sequencing;
 
 import java.util.Hashtable;
-import org.eclipse.persistence.internal.sequencing.Sequencing;
+
 import org.eclipse.persistence.internal.sessions.remote.RemoteConnection;
 import org.eclipse.persistence.internal.sessions.remote.RemoteFunctionCall;
 import org.eclipse.persistence.internal.sessions.remote.SequencingFunctionCall;
@@ -29,6 +29,7 @@
  * are implemented as static inner classes in SequenceFunctionCall class:
  * like SequencingFunctionCall.DoesExist.
  */
+@SuppressWarnings({"rawtypes"})
 class RemoteConnectionSequencing implements Sequencing {
     protected RemoteConnection remoteConnection;
     protected Hashtable classToShouldAcquireValueAfterInsert;
@@ -52,7 +53,7 @@
     }
 
     @Override
-    public Object getNextValue(Class cls) {
+    public Object getNextValue(Class<?> cls) {
         return processFunctionCall(new SequencingFunctionCall.GetNextValue(cls));
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/Sequencing.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/Sequencing.java
index 8cb2e11..272261c 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/Sequencing.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/Sequencing.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
@@ -54,6 +54,6 @@
      * Return the newly-generated sequencing value.
      * @param cls Class for which the sequencing value is generated.
      */
-    Object getNextValue(Class cls);
+    Object getNextValue(Class<?> cls);
 
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingFactory.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingFactory.java
index b9c4cc3..8d54ab2 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingFactory.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingFactory.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,6 +35,10 @@
  */
 public class SequencingFactory {
 
+    private SequencingFactory() {
+        // no instance please
+    }
+
     /**
     * INTERNAL:
     * Takes a potential owner - a Session, returns Sequencing object.
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingHome.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingHome.java
index 6739941..9ddf55f 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingHome.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingHome.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
@@ -16,6 +16,7 @@
 
 import java.util.Collection;
 
+import org.eclipse.persistence.descriptors.ClassDescriptor;
 import org.eclipse.persistence.sequencing.SequencingControl;
 
 /**
@@ -44,5 +45,5 @@
 
     boolean isSequencingCallbackRequired();
 
-    void onAddDescriptors(Collection descriptors);
+    void onAddDescriptors(Collection<ClassDescriptor> descriptors);
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingManager.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingManager.java
index fd65441..7935581 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingManager.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingManager.java
@@ -106,7 +106,7 @@
     private SequencingConnectionHandler connectionHandler;
     private Map<String, PreallocationHandler> preallocationHandler;
     private int whenShouldAcquireValueForAll;
-    private Vector connectedSequences;
+    private Vector<Sequence> connectedSequences;
     boolean atLeastOneSequenceShouldUseTransaction;
     boolean atLeastOneSequenceShouldUsePreallocation;
 
@@ -292,7 +292,7 @@
     }
 
     @Override
-    public Object getNextValue(Class cls) {
+    public Object getNextValue(Class<?> cls) {
         return getNextValue(getOwnerSession(), cls);
     }
 
@@ -314,7 +314,7 @@
         }
     }
 
-    protected void setLocks(Map locks) {
+    protected void setLocks(Map<String, ConcurrencyManager> locks) {
         this.locks = locks;
     }
 
@@ -341,13 +341,13 @@
         return manager;
     }
 
-    protected Sequence getSequence(Class cls) {
+    protected Sequence getSequence(Class<?> cls) {
         //** should check here that sequencing is used?
         String seqName = getOwnerSession().getDescriptor(cls).getSequenceNumberName();
         return getSequence(seqName);
     }
 
-    protected void logDebugPreallocation(String seqName, Object firstSequenceValue, Vector sequences) {
+    protected void logDebugPreallocation(String seqName, Object firstSequenceValue, Vector<?> sequences) {
         if (getOwnerSession().shouldLog(SessionLog.FINEST, SessionLog.SEQUENCING)) {
             // the first value has been already removed from sequences vector
             Object[] args = { seqName, sequences.size() + 1, firstSequenceValue, sequences.lastElement() };
@@ -355,7 +355,7 @@
         }
     }
 
-    protected void logDebugLocalPreallocation(AbstractSession writeSession, String seqName, Vector sequences, Accessor accessor) {
+    protected void logDebugLocalPreallocation(AbstractSession writeSession, String seqName, Vector<?> sequences, Accessor accessor) {
         if (writeSession.shouldLog(SessionLog.FINEST, SessionLog.SEQUENCING)) {
             Object[] args = { seqName, sequences.size(), sequences.firstElement(), sequences.lastElement() };
             writeSession.log(SessionLog.FINEST, SessionLog.SEQUENCING, "sequencing_localPreallocation", args, accessor);
@@ -388,7 +388,7 @@
     class Preallocation_Transaction_NoAccessor_State extends State implements SequencingCallbackFactory {
 
         final class SequencingCallbackImpl implements SequencingCallback {
-            Map localSequences = new HashMap();
+            Map<String, Vector<?>> localSequences = new HashMap<>();
             String context;
 
             /**
@@ -401,7 +401,7 @@
                 afterCommitInternal(context, localSequences, accessor);
             }
 
-            public Map getPreallocatedSequenceValues() {
+            public Map<String, Vector<?>> getPreallocatedSequenceValues() {
                 return localSequences;
             }
         }
@@ -423,12 +423,12 @@
         /**
          * Release any locally allocated sequence back to the global sequence pool.
          */
-        void afterCommitInternal(String context, Map localSequences, Accessor accessor) {
-            Iterator it = localSequences.entrySet().iterator();
+        void afterCommitInternal(String context, Map<String, Vector<?>> localSequences, Accessor accessor) {
+            Iterator<Map.Entry<String, Vector<?>>> it = localSequences.entrySet().iterator();
             while(it.hasNext()) {
-                Map.Entry entry = (Map.Entry)it.next();
-                String seqName = (String)entry.getKey();
-                Vector localSequenceForName = (Vector)entry.getValue();
+                Map.Entry<String, Vector<?>> entry = it.next();
+                String seqName = entry.getKey();
+                Vector<?> localSequenceForName = entry.getValue();
                 if (!localSequenceForName.isEmpty()) {
                     getPreallocationHandler(context).setPreallocated(seqName, localSequenceForName);
                     // clear all localSequencesForName
@@ -465,7 +465,7 @@
         public Object getNextValue(Sequence sequence, AbstractSession writeSession) {
             String seqName = sequence.getName();
             if(sequence.getPreallocationSize() > 1) {
-                Queue sequencesForName = getPreallocationHandler(getContext(writeSession)).getPreallocated(seqName);
+                Queue<Object> sequencesForName = getPreallocationHandler(getContext(writeSession)).getPreallocated(seqName);
                 // First grab the first sequence value without locking, a lock is only required if empty.
                 Object sequenceValue = sequencesForName.poll();
                 if (sequenceValue != null) {
@@ -498,15 +498,15 @@
                 }
 
                 Accessor accessor;
-                Vector localSequencesForName;
+                Vector<?> localSequencesForName;
                 if (!keepLocked) {
                     writeSession.beginTransaction();//write accessor is set in begin
                 }
                 try {
                     accessor = writeSession.getAccessor();
                     SequencingCallbackImpl seqCallbackImpl = getCallbackImpl(writeSession, accessor);
-                    Map localSequences = seqCallbackImpl.getPreallocatedSequenceValues();
-                    localSequencesForName = (Vector)localSequences.get(seqName);
+                    Map<String, Vector<?>> localSequences = seqCallbackImpl.getPreallocatedSequenceValues();
+                    localSequencesForName = localSequences.get(seqName);
                     if ((localSequencesForName == null) || localSequencesForName.isEmpty()) {
                         localSequencesForName = sequence.getGeneratedVector(null, writeSession);
                         localSequences.put(seqName, localSequencesForName);
@@ -601,7 +601,7 @@
             String seqName = sequence.getName();
             if(sequence.getPreallocationSize() > 1) {
                 PreallocationHandler handler = getPreallocationHandler(getContext(writeSession));
-                Queue sequencesForName = handler.getPreallocated(seqName);
+                Queue<Object> sequencesForName = handler.getPreallocated(seqName);
                 // First try to get the next sequence value without locking.
                 Object sequenceValue = sequencesForName.poll();
                 if (sequenceValue != null) {
@@ -620,7 +620,7 @@
                     try {
                         accessor.beginTransaction(writeSession);
                         try {
-                            Vector sequences = sequence.getGeneratedVector(accessor, writeSession);
+                            Vector<?> sequences = sequence.getGeneratedVector(accessor, writeSession);
                             accessor.commitTransaction(writeSession);
                             // Remove the first value before adding to the global cache to ensure this thread gets one.
                             sequenceValue = sequences.remove(0);
@@ -683,7 +683,7 @@
             String seqName = sequence.getName();
             if(sequence.getPreallocationSize() > 1) {
                 PreallocationHandler handler = getPreallocationHandler(getContext(writeSession));
-                Queue sequencesForName = handler.getPreallocated(seqName);
+                Queue<Object> sequencesForName = handler.getPreallocated(seqName);
                 // First try to get the next sequence value without locking.
                 Object sequenceValue = sequencesForName.poll();
                 if (sequenceValue != null) {
@@ -696,7 +696,7 @@
                     if (sequenceValue != null) {
                         return sequenceValue;
                     }
-                    Vector sequences = sequence.getGeneratedVector(null, writeSession);
+                    Vector<?> sequences = sequence.getGeneratedVector(null, writeSession);
                     // Remove the first value before adding to the global cache to ensure this thread gets one.
                     sequenceValue = sequences.remove(0);
                     // copy remaining values to global cache.
@@ -752,9 +752,10 @@
 
     /**
      * If sequencing is connected initialize the sequences used by descriptors, otherwise connect.
+     * @param descriptors
      */
     @Override
-    public void onAddDescriptors(Collection descriptors) {
+    public void onAddDescriptors(Collection<ClassDescriptor> descriptors) {
         if (!isConnected()) {
             onConnect();
             return;
@@ -769,8 +770,9 @@
 
     /**
      * Initialize the sequences on login.
+     * @param descriptors class descriptors for which to initialize sequencing
      */
-    protected void onConnectInternal(Collection descriptors) {
+    protected void onConnectInternal(Collection<ClassDescriptor> descriptors) {
         // This method is called in two distinct cases.
         //
         // Connect case.
@@ -864,7 +866,7 @@
         }
         // In AddDescriptors case locks may have been already created
         if (atLeastOneSequenceShouldUsePreallocation && getLocks() == null) {
-            setLocks(new ConcurrentHashMap(20));
+            setLocks(new ConcurrentHashMap<>(20));
         }
         // In AddDescriptors case the factory may have been already created and listeners initialized.
         boolean hasSequencingCallbackFactory = isSequencingCallbackRequired();
@@ -947,11 +949,11 @@
      * If passed collection is null then connect all sequences used by owner session's descriptors.
      * Otherwise connect sequences used by passed descriptors.
      */
-    protected void onConnectSequences(Collection descriptors) {
+    protected void onConnectSequences(Collection<ClassDescriptor> descriptors) {
         boolean isConnected = isConnected();
         int nAlreadyConnectedSequences = 0;
         if (connectedSequences == null) {
-            connectedSequences = new Vector();
+            connectedSequences = new Vector<>();
         } else {
             nAlreadyConnectedSequences = connectedSequences.size();
         }
@@ -961,9 +963,9 @@
         if (descriptors == null) {
             descriptors = getOwnerSession().getDescriptors().values();
         }
-        Iterator itDescriptors = descriptors.iterator();
+        Iterator<ClassDescriptor> itDescriptors = descriptors.iterator();
         while (itDescriptors.hasNext()) {
-            ClassDescriptor descriptor = (ClassDescriptor)itDescriptors.next();
+            ClassDescriptor descriptor = itDescriptors.next();
             // Find root sequence, because inheritance needs to be resolved here.
             // TODO: The way we initialize sequencing needs to be in line with descriptor init.
             ClassDescriptor parentDescriptor = descriptor;
@@ -1006,7 +1008,7 @@
                 // defaultSequence has to disconnect the last
                 for (int i = connectedSequences.size() - 1; i >= nAlreadyConnectedSequences; i--) {
                     try {
-                        Sequence sequenceToDisconnect = (Sequence)connectedSequences.elementAt(i);
+                        Sequence sequenceToDisconnect = connectedSequences.elementAt(i);
                         sequenceToDisconnect.onDisconnect(getOwnerSession().getDatasourcePlatform());
                     } catch (RuntimeException ex2) {
                         //ignore
@@ -1050,7 +1052,7 @@
         // defaultSequence has to disconnect the last
         for (int i = connectedSequences.size() - 1; i >= nAlreadyConnectedSequences; i--) {
             try {
-                Sequence sequenceToDisconnect = (Sequence)connectedSequences.elementAt(i);
+                Sequence sequenceToDisconnect = connectedSequences.elementAt(i);
                 sequenceToDisconnect.onDisconnect(getOwnerSession().getDatasourcePlatform());
             } catch (RuntimeException ex) {
                 if (exception == null) {
@@ -1076,7 +1078,7 @@
 
         int nSize = connectedSequences.size();
         for (int i = nAlreadyConnectedSequences; i < nSize; i++) {
-            Sequence sequence = (Sequence)connectedSequences.get(i);
+            Sequence sequence = connectedSequences.get(i);
             State state = getState(sequence.shouldUsePreallocation(), sequence.shouldUseTransaction());
             if (state == null) {
                 createState(sequence.shouldUsePreallocation(), sequence.shouldUseTransaction());
@@ -1135,31 +1137,32 @@
     }
 
     @Override
-    public Object getNextValue(AbstractSession writeSession, Class cls) {
+    public Object getNextValue(AbstractSession writeSession, Class<?> cls) {
         Sequence sequence = getSequence(cls);
         State state = getState(sequence.shouldUsePreallocation(), sequence.shouldUseTransaction());
         return state.getNextValue(sequence, writeSession);
     }
 
+    @SuppressWarnings({"unchecked", "rawtypes"})
     protected void logDebugSequencingConnected(int nAlreadyConnectedSequences) {
-        Vector[] sequenceVectors = new Vector[NUMBER_OF_STATES];
+        Vector<Sequence>[] sequenceVectors = (Vector<Sequence>[]) new Vector[NUMBER_OF_STATES];
         int size = connectedSequences.size();
         for (int i = nAlreadyConnectedSequences; i < size; i++) {
-            Sequence sequence = (Sequence)connectedSequences.get(i);
+            Sequence sequence = connectedSequences.get(i);
             int stateId = getStateId(sequence.shouldUsePreallocation(), sequence.shouldUseTransaction());
-            Vector v = sequenceVectors[stateId];
+            Vector<Sequence> v = sequenceVectors[stateId];
             if (v == null) {
-                v = new Vector();
+                v = new Vector<>();
                 sequenceVectors[stateId] = v;
             }
             v.addElement(sequence);
         }
         for (int i = 0; i < NUMBER_OF_STATES; i++) {
-            Vector v = sequenceVectors[i];
+            Vector<Sequence> v = sequenceVectors[i];
             if (v != null) {
                 getOwnerSession().log(SessionLog.FINEST, SessionLog.SEQUENCING, "sequencing_connected", states[i]);
                 for (int j = 0; j < v.size(); j++) {
-                    Sequence sequence = (Sequence)v.elementAt(j);
+                    Sequence sequence = v.elementAt(j);
                     Object[] args = { sequence.getName(), Integer.toString(sequence.getPreallocationSize()),
                             Integer.toString(sequence.getInitialValue())};
                     getOwnerSession().log(SessionLog.FINEST, SessionLog.SEQUENCING, "sequence_without_state", args);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingServer.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingServer.java
index 590227f..dc9ea53 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingServer.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SequencingServer.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 1998, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -14,7 +14,6 @@
 //     Oracle - initial API and implementation from Oracle TopLink
 package org.eclipse.persistence.internal.sequencing;
 
-import org.eclipse.persistence.internal.sequencing.Sequencing;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.sessions.server.ConnectionPool;
 
@@ -39,6 +38,6 @@
  * @see ClientSessionSequencing
  */
 public interface SequencingServer extends Sequencing {
-    Object getNextValue(AbstractSession writeSession, Class cls);
+    Object getNextValue(AbstractSession writeSession, Class<?> cls);
     ConnectionPool getConnectionPool();
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SessionBrokerSequencing.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SessionBrokerSequencing.java
index f08bca8..0cb512d 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SessionBrokerSequencing.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sequencing/SessionBrokerSequencing.java
@@ -59,7 +59,7 @@
     }
 
     // internal
-    protected Sequencing get(Class cls) {
+    protected Sequencing get(Class<?> cls) {
         return broker.getSessionForClass(cls).getSequencing();
     }
 
@@ -69,7 +69,7 @@
     }
 
     @Override
-    public Object getNextValue(Class cls) {
+    public Object getNextValue(Class<?> cls) {
         return get(cls).getNextValue(cls);
     }
 }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/DatabaseSessionImpl.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/DatabaseSessionImpl.java
index adde1b3..ebf8e57 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/DatabaseSessionImpl.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/DatabaseSessionImpl.java
@@ -327,8 +327,9 @@
      * INTERNAL:
      * If sequencing is connected then initializes sequences referenced by the passed descriptors,
      * otherwise connects sequencing.
+     * @param descriptors class descriptors
      */
-    public void addDescriptorsToSequencing(Collection descriptors) {
+    public void addDescriptorsToSequencing(Collection<ClassDescriptor> descriptors) {
         getSequencingHome().onAddDescriptors(descriptors);
     }
 
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 c9480c8..fe1fc0c 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
@@ -628,10 +628,10 @@
             }
 
             if ((loginConfig.getSequencingConfig().getSequenceConfigs() != null) && !loginConfig.getSequencingConfig().getSequenceConfigs().isEmpty()) {
-                Enumeration eSequenceConfigs = loginConfig.getSequencingConfig().getSequenceConfigs().elements();
+                Enumeration<SequenceConfig> eSequenceConfigs = loginConfig.getSequencingConfig().getSequenceConfigs().elements();
 
                 while (eSequenceConfigs.hasMoreElements()) {
-                    Sequence sequence = buildSequence((SequenceConfig)eSequenceConfigs.nextElement());
+                    Sequence sequence = buildSequence(eSequenceConfigs.nextElement());
                     login.addSequence(sequence);
                 }
             }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/sequencing/SequencingConfig.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/sequencing/SequencingConfig.java
index 857f175..90916ae 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/sequencing/SequencingConfig.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/factories/model/sequencing/SequencingConfig.java
@@ -21,7 +21,7 @@
  */
 public class SequencingConfig {
     private SequenceConfig m_defaultSequenceConfig;
-    private Vector m_sequenceConfigs;
+    private Vector<SequenceConfig> m_sequenceConfigs;
 
     public SequencingConfig() {
         super();
@@ -35,11 +35,11 @@
         return m_defaultSequenceConfig;
     }
 
-    public void setSequenceConfigs(Vector sequenceConfigs) {
+    public void setSequenceConfigs(Vector<SequenceConfig> sequenceConfigs) {
         m_sequenceConfigs = sequenceConfigs;
     }
 
-    public Vector getSequenceConfigs() {
+    public Vector<SequenceConfig> getSequenceConfigs() {
         return m_sequenceConfigs;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/SequencingFunctionCall.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/SequencingFunctionCall.java
index b3b78aa..be4b019 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/SequencingFunctionCall.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/internal/sessions/remote/SequencingFunctionCall.java
@@ -39,11 +39,11 @@
     }
 
     public static class GetNextValue extends SimpleFunctionCall {
-        public GetNextValue(Class cls) {
+        public GetNextValue(Class<?> cls) {
             this.cls = cls;
         }
 
-        protected Class cls;
+        protected Class<?> cls;
 
         @Override
         protected Object execute(AbstractSession session) {
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/DefaultSequence.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/DefaultSequence.java
index 282800b..7670679 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/DefaultSequence.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/DefaultSequence.java
@@ -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
@@ -171,9 +171,10 @@
      * @param writeSession Session is a Session used for writing (either ClientSession or DatabaseSession);
      * @param seqName String is sequencing number field name
      * @param size int number of values to preallocate (output Vector size).
+     * @return
      */
     @Override
-    public Vector getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
+    public Vector<?> getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
         return getDefaultSequence().getGeneratedVector(accessor, writeSession, seqName, size);
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/QuerySequence.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/QuerySequence.java
index 2f107dd..53c1678 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/QuerySequence.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/QuerySequence.java
@@ -93,7 +93,12 @@
     public boolean equals(Object obj) {
         if (obj instanceof QuerySequence && super.equals(obj)) {
             QuerySequence other = (QuerySequence)obj;
-            return (getSelectQuery() == other.getSelectQuery()) && (getUpdateQuery() == other.getUpdateQuery()) && (shouldAcquireValueAfterInsert() == other.shouldAcquireValueAfterInsert()) && (shouldUseTransaction() == other.shouldUseTransaction()) && (shouldSkipUpdate() == other.shouldSkipUpdate()) && (shouldSelectBeforeUpdate() == other.shouldSelectBeforeUpdate());
+            return (getSelectQuery() == other.getSelectQuery())
+                    && (getUpdateQuery() == other.getUpdateQuery())
+                    && (shouldAcquireValueAfterInsert() == other.shouldAcquireValueAfterInsert())
+                    && (shouldUseTransaction() == other.shouldUseTransaction())
+                    && (shouldSkipUpdate() == other.shouldSkipUpdate())
+                    && (shouldSelectBeforeUpdate() == other.shouldSelectBeforeUpdate());
 
         } else {
             return false;
@@ -323,7 +328,7 @@
                 query.setAccessor(accessor);
             }
         }
-        Vector args = createArguments(query, seqName, size);
+        Vector<Object> args = createArguments(query, seqName, size);
         query.setIsUserDefinedSQLCall(false);
         if (args != null) {
             return writeSession.executeQuery(query, args);
@@ -356,7 +361,7 @@
                 query.setAccessor(accessor);
             }
         }
-        Vector args = createArguments(query, seqName, sizeOrNewValue);
+        Vector<Object> args = createArguments(query, seqName, sizeOrNewValue);
         query.setIsUserDefinedSQLCall(false);
         if (args != null) {
             writeSession.executeQuery(query, args);
@@ -368,10 +373,10 @@
     /**
     * INTERNAL:
     */
-    protected Vector createArguments(DatabaseQuery query, String seqName, Number sizeOrNewValue) {
+    protected Vector<Object> createArguments(DatabaseQuery query, String seqName, Number sizeOrNewValue) {
         int nArgs = query.getArguments().size();
         if (nArgs > 0) {
-            Vector args = new Vector(nArgs);
+            Vector<Object> args = new Vector<>(nArgs);
             args.addElement(seqName);
             if (nArgs > 1) {
                 args.addElement(sizeOrNewValue);
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/Sequence.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/Sequence.java
index 3e5cd81..e0f0594 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/Sequence.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/Sequence.java
@@ -17,7 +17,6 @@
 import java.util.Vector;
 import java.io.Serializable;
 import org.eclipse.persistence.internal.databaseaccess.Platform;
-import org.eclipse.persistence.internal.databaseaccess.DatasourcePlatform;
 import org.eclipse.persistence.internal.databaseaccess.Accessor;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
 import org.eclipse.persistence.exceptions.ValidationException;
@@ -251,7 +250,7 @@
      * @param seqName String is sequencing number field name
      * @param size int number of values to preallocate (output Vector size).
      */
-    public abstract Vector getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size);
+    public abstract Vector<?> getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size);
 
     /**
      * INTERNAL:
@@ -265,7 +264,7 @@
      * @param accessor Accessor is a separate sequencing accessor (may be null);
      * @param writeSession Session is a Session used for writing (either ClientSession or DatabaseSession);
      */
-    public Vector getGeneratedVector(Accessor accessor, AbstractSession writeSession) {
+    public Vector<?> getGeneratedVector(Accessor accessor, AbstractSession writeSession) {
         return getGeneratedVector(accessor, writeSession, getName(), getPreallocationSize());
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/StandardSequence.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/StandardSequence.java
index 31d94da..300f278 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/StandardSequence.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/StandardSequence.java
@@ -76,7 +76,7 @@
     }
 
     @Override
-    public Vector getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
+    public Vector<?> getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
         if (shouldUsePreallocation()) {
             Number value = updateAndSelectSequence(accessor, writeSession, seqName, size);
             if (value == null) {
@@ -97,10 +97,10 @@
      * @param seqName String is sequencing number field name
      * @param size int size of Vector to create.
      */
-    protected Vector createVector(Number sequence, String seqName, int size) {
+    protected Vector<Number> createVector(Number sequence, String seqName, int size) {
         long nextSequence = sequence.longValue();
 
-        Vector sequencesForName = new Vector(size);
+        Vector<Number> sequencesForName = new Vector<>(size);
         nextSequence = nextSequence - size;
 
         // Check for incorrect values return to validate that the sequence is setup correctly.
@@ -122,10 +122,10 @@
      * @param seqName String is sequencing number field name
      * @param size int size of Vector to create.
      */
-    protected Vector createVectorAtNextVal(Number sequence, String seqName, int size) {
+    protected Vector<Number> createVectorAtNextVal(Number sequence, String seqName, int size) {
         long nextSequence = sequence.longValue();
 
-        Vector sequencesForName = new Vector(size);
+        Vector<Number> sequencesForName = new Vector<>(size);
 
         // Check for incorrect values return to validate that the sequence is setup correctly.
         // PRS 36451 intvalue would wrap
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/UUIDSequence.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/UUIDSequence.java
index 8bb7418..586d4e1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/UUIDSequence.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/UUIDSequence.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -19,7 +19,6 @@
 
 import org.eclipse.persistence.internal.databaseaccess.Accessor;
 import org.eclipse.persistence.internal.sessions.AbstractSession;
-import org.eclipse.persistence.sequencing.Sequence;
 
 public class UUIDSequence extends Sequence {
 
@@ -37,7 +36,7 @@
     }
 
     @Override
-    public Vector getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
+    public Vector<?> getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
         return null;
     }
 
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/UnaryTableSequence.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/UnaryTableSequence.java
index a4821c7..cefc2d1 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/UnaryTableSequence.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sequencing/UnaryTableSequence.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
@@ -156,7 +156,7 @@
 
     protected void buildUpdateString1() {
         updateString1 = "UPDATE ";
-        if (qualifier != "") {
+        if (!qualifier.isEmpty()) {
             updateString1 = updateString1 + qualifier + '.';
         }
     }
@@ -173,7 +173,7 @@
 
     protected void buildSelectString1() {
         selectString1 = "SELECT * FROM ";
-        if (qualifier != "") {
+        if (!qualifier.isEmpty()) {
             selectString1 = selectString1 + qualifier + '.';
         }
     }
diff --git a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/DatasourceLogin.java b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/DatasourceLogin.java
index f48987f..c540305 100644
--- a/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/DatasourceLogin.java
+++ b/foundation/org.eclipse.persistence.core/src/main/java/org/eclipse/persistence/sessions/DatasourceLogin.java
@@ -819,7 +819,7 @@
     /**
      * Returns a map of sequence names to Sequences (may be null).
      */
-    public Map getSequences() {
+    public Map<String, Sequence> getSequences() {
         return getDatasourcePlatform().getSequences();
     }
 
@@ -851,7 +851,7 @@
      * INTERNAL:
      * Used only for writing the login into XML or Java.
      */
-    public Map getSequencesToWrite() {
+    public Map<String, Sequence> getSequencesToWrite() {
         return getDatasourcePlatform().getSequencesToWrite();
     }
 
@@ -859,7 +859,7 @@
      * INTERNAL:
      * Used only for reading the login from XML.
      */
-    public void setSequences(Map sequences) {
+    public void setSequences(Map<String, Sequence> sequences) {
         getDatasourcePlatform().setSequences(sequences);
     }
 }
diff --git a/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/nosql/adapters/mongo/OIDSequence.java b/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/nosql/adapters/mongo/OIDSequence.java
index 4794bf0..4cbbd0f 100644
--- a/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/nosql/adapters/mongo/OIDSequence.java
+++ b/foundation/org.eclipse.persistence.nosql/src/main/java/org/eclipse/persistence/nosql/adapters/mongo/OIDSequence.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2011, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2011, 2021 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0 which is available at
@@ -37,7 +37,7 @@
     }
 
     @Override
-    public Vector getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
+    public Vector<?> getGeneratedVector(Accessor accessor, AbstractSession writeSession, String seqName, int size) {
         return null;
     }
 
