diff --git a/src/main/java/org/apache/xmlbeans/impl/regex/RangeToken.java b/src/main/java/org/apache/xmlbeans/impl/regex/RangeToken.java
index b78ab46..e1d2f97 100644
--- a/src/main/java/org/apache/xmlbeans/impl/regex/RangeToken.java
+++ b/src/main/java/org/apache/xmlbeans/impl/regex/RangeToken.java
@@ -121,6 +121,7 @@
     /**
      * this.ranges is sorted.
      */
+    @SuppressWarnings("ConstantConditions")
     protected void compactRanges() {
         boolean DEBUG = false;
         if (this.ranges == null || this.ranges.length <= 2) {
@@ -489,17 +490,6 @@
         return lowers;
     }
 
-    void dumpRanges() {
-        System.err.print("RANGE: ");
-        if (this.ranges == null) {
-            System.err.println(" NULL");
-        }
-        for (int i = 0; i < this.ranges.length; i += 2) {
-            System.err.print("[" + this.ranges[i] + "," + this.ranges[i + 1] + "] ");
-        }
-        System.err.println();
-    }
-
     boolean match(int ch) {
         if (this.map == null) {
             this.createMap();
@@ -586,7 +576,7 @@
                         sb.append(escapeCharInCharClass(this.ranges[i]));
                     } else {
                         sb.append(escapeCharInCharClass(this.ranges[i]));
-                        sb.append((char) '-');
+                        sb.append('-');
                         sb.append(escapeCharInCharClass(this.ranges[i + 1]));
                     }
                 }
diff --git a/src/main/java/org/apache/xmlbeans/impl/repackage/Repackage.java b/src/main/java/org/apache/xmlbeans/impl/repackage/Repackage.java
index 2bb8a1f..25de508 100644
--- a/src/main/java/org/apache/xmlbeans/impl/repackage/Repackage.java
+++ b/src/main/java/org/apache/xmlbeans/impl/repackage/Repackage.java
@@ -69,6 +69,7 @@
 
         _repackager = new Repackager(repackageSpec);
 
+        //noinspection ConstantConditions
         if (sourceDir == null || targetDir == null) {
             _sourceBase = _targetBase = null;
         } else {
@@ -333,15 +334,11 @@
     }
 
     StringBuffer readInputStream(InputStream is) throws IOException {
-        Reader r = new InputStreamReader(is);
-        StringWriter w = new StringWriter();
-
-        copy(r, w);
-
-        w.close();
-        r.close();
-
-        return w.getBuffer();
+        try (Reader r = new InputStreamReader(is, StandardCharsets.ISO_8859_1);
+            StringWriter w = new StringWriter()) {
+            copy(r, w);
+            return w.getBuffer();
+        }
     }
 
     public static void copyFile(File from, File to) throws IOException {
diff --git a/src/main/java/org/apache/xmlbeans/impl/richParser/XMLStreamReaderExtImpl.java b/src/main/java/org/apache/xmlbeans/impl/richParser/XMLStreamReaderExtImpl.java
index 1bd4d4f..98071f0 100644
--- a/src/main/java/org/apache/xmlbeans/impl/richParser/XMLStreamReaderExtImpl.java
+++ b/src/main/java/org/apache/xmlbeans/impl/richParser/XMLStreamReaderExtImpl.java
@@ -182,7 +182,7 @@
         throws XMLStreamException, InvalidLexicalValueException {
         _charSeq.reload(CharSeqTrimWS.XMLWHITESPACE_TRIM);
         String text = _charSeq.toString();
-        byte[] buf = Base64.getDecoder().decode(text.getBytes());
+        byte[] buf = Base64.getDecoder().decode(text.getBytes(StandardCharsets.ISO_8859_1));
         if (buf != null) {
             return new ByteArrayInputStream(buf);
         } else {
@@ -332,7 +332,7 @@
 
     public InputStream getAttributeBase64Value(int index) throws XMLStreamException {
         String text = _charSeq.reloadAtt(index, CharSeqTrimWS.XMLWHITESPACE_TRIM).toString();
-        byte[] buf = Base64.getDecoder().decode(text.getBytes());
+        byte[] buf = Base64.getDecoder().decode(text.getBytes(StandardCharsets.ISO_8859_1));
         if (buf != null) {
             return new ByteArrayInputStream(buf);
         } else {
@@ -486,7 +486,7 @@
     public InputStream getAttributeBase64Value(String uri, String local) throws XMLStreamException {
         CharSequence cs = _charSeq.reloadAtt(uri, local, CharSeqTrimWS.XMLWHITESPACE_TRIM);
         String text = cs.toString();
-        byte[] buf = Base64.getDecoder().decode(text.getBytes());
+        byte[] buf = Base64.getDecoder().decode(text.getBytes(StandardCharsets.ISO_8859_1));
         if (buf != null) {
             return new ByteArrayInputStream(buf);
         } else {
diff --git a/src/main/java/org/apache/xmlbeans/impl/schema/StscState.java b/src/main/java/org/apache/xmlbeans/impl/schema/StscState.java
index b3ed068..247e353 100644
--- a/src/main/java/org/apache/xmlbeans/impl/schema/StscState.java
+++ b/src/main/java/org/apache/xmlbeans/impl/schema/StscState.java
@@ -82,9 +82,9 @@
     private final Map<String, SchemaContainer> _containers = new LinkedHashMap<>();
     private SchemaDependencies _dependencies;
 
-    private Map _redefinedGlobalTypes = new LinkedHashMap();
-    private Map _redefinedModelGroups = new LinkedHashMap();
-    private Map _redefinedAttributeGroups = new LinkedHashMap();
+    private final Map<SchemaTypeImpl,SchemaTypeImpl> _redefinedGlobalTypes = new LinkedHashMap<>();
+    private final Map<SchemaModelGroupImpl,SchemaModelGroupImpl>  _redefinedModelGroups = new LinkedHashMap<>();
+    private final Map<SchemaAttributeGroupImpl,SchemaAttributeGroupImpl>  _redefinedAttributeGroups = new LinkedHashMap<>();
 
     private final Map<QName, SchemaType> _globalTypes = new LinkedHashMap<>();
     private final Map<QName, SchemaGlobalElement> _globalElements = new LinkedHashMap<>();
@@ -156,23 +156,9 @@
 
     private void addContainer(SchemaContainer container) {
         _containers.put(container.getNamespace(), container);
-        List redefModelGroups = container.redefinedModelGroups();
-        for (int i = 0; i < redefModelGroups.size(); i++) {
-            QName name = ((SchemaModelGroup) redefModelGroups.get(i)).getName();
-            _redefinedModelGroups.put(name, redefModelGroups.get(i));
-        }
 
-        List redefAttrGroups = container.redefinedAttributeGroups();
-        for (int i = 0; i < redefAttrGroups.size(); i++) {
-            QName name = ((SchemaAttributeGroup) redefAttrGroups.get(i)).getName();
-            _redefinedAttributeGroups.put(name, redefAttrGroups.get(i));
-        }
-
-        List redefTypes = container.redefinedGlobalTypes();
-        for (int i = 0; i < redefTypes.size(); i++) {
-            QName name = ((SchemaType) redefTypes.get(i)).getName();
-            _redefinedGlobalTypes.put(name, redefTypes.get(i));
-        }
+        // container.redefinedModelGroups() / .redefinedAttributeGroups() / .redefinedGlobalTypes() are always empty
+        // no need to copy them over to _redefinedModelGroups / _redefinedAttributeGroups / _redefinedGlobalTypes
 
         container.globalElements().forEach(g -> _globalElements.put(g.getName(), g));
         container.globalAttributes().forEach(g -> _globalAttributes.put(g.getName(), g));
@@ -280,7 +266,7 @@
      */
     public void warning(String code, Object[] args, XmlObject loc) {
         // it's OK for XMLSchema.xsd itself to have reserved type names
-        if (code == XmlErrorCodes.RESERVED_TYPE_NAME &&
+        if (XmlErrorCodes.RESERVED_TYPE_NAME.equals(code) &&
             loc.documentProperties().getSourceName() != null &&
             loc.documentProperties().getSourceName().indexOf("XMLSchema.xsd") > 0) {
             return;
@@ -669,7 +655,7 @@
         QName redefinedName = redefinedBy.getName();
         name = compatName(name, chameleonNamespace);
         if (name.equals(redefinedName)) {
-            return (SchemaTypeImpl) _redefinedGlobalTypes.get(redefinedBy);
+            return _redefinedGlobalTypes.get(redefinedBy);
             // BUGBUG: should also link against _importingLoader.findRedefinedType
         }
         SchemaTypeImpl result = (SchemaTypeImpl) _globalTypes.get(name);
@@ -691,11 +677,11 @@
                     if (!ignoreMdef(name)) {
                         if (_mdefAll) {
                             warning(XmlErrorCodes.SCHEMA_PROPERTIES$DUPLICATE,
-                                new Object[]{"global type", QNameHelper.pretty(name), ((SchemaType) _redefinedGlobalTypes.get(redefined)).getSourceName()},
+                                new Object[]{"global type", QNameHelper.pretty(name), _redefinedGlobalTypes.get(redefined).getSourceName()},
                                 type.getParseObject());
                         } else {
                             error(XmlErrorCodes.SCHEMA_PROPERTIES$DUPLICATE,
-                                new Object[]{"global type", QNameHelper.pretty(name), ((SchemaType) _redefinedGlobalTypes.get(redefined)).getSourceName()},
+                                new Object[]{"global type", QNameHelper.pretty(name), _redefinedGlobalTypes.get(redefined).getSourceName()},
                                 type.getParseObject());
                         }
                     }
@@ -901,7 +887,7 @@
         QName redefinitionFor = redefinedBy.getName();
         name = compatName(name, chameleonNamespace);
         if (name.equals(redefinitionFor)) {
-            return (SchemaAttributeGroupImpl) _redefinedAttributeGroups.get(redefinedBy);
+            return _redefinedAttributeGroups.get(redefinedBy);
             // BUGBUG: should also link against _importingLoader.findRedefinedAttributeGroup
         }
         SchemaAttributeGroupImpl result = (SchemaAttributeGroupImpl) _attributeGroups.get(name);
@@ -921,11 +907,11 @@
                     if (!ignoreMdef(name)) {
                         if (_mdefAll) {
                             warning(XmlErrorCodes.SCHEMA_PROPERTIES$DUPLICATE,
-                                new Object[]{"attribute group", QNameHelper.pretty(name), ((SchemaComponent) _redefinedAttributeGroups.get(redefined)).getSourceName()},
+                                new Object[]{"attribute group", QNameHelper.pretty(name), _redefinedAttributeGroups.get(redefined).getSourceName()},
                                 attributeGroup.getParseObject());
                         } else {
                             error(XmlErrorCodes.SCHEMA_PROPERTIES$DUPLICATE,
-                                new Object[]{"attribute group", QNameHelper.pretty(name), ((SchemaComponent) _redefinedAttributeGroups.get(redefined)).getSourceName()},
+                                new Object[]{"attribute group", QNameHelper.pretty(name), _redefinedAttributeGroups.get(redefined).getSourceName()},
                                 attributeGroup.getParseObject());
                         }
                     }
@@ -960,7 +946,7 @@
     }
 
     SchemaAttributeGroup[] redefinedAttributeGroups() {
-        return (SchemaAttributeGroup[]) _redefinedAttributeGroups.values().toArray(new SchemaAttributeGroup[0]);
+        return _redefinedAttributeGroups.values().toArray(new SchemaAttributeGroup[0]);
     }
 
     /* MODEL GROUPS ===================================================*/
@@ -983,7 +969,7 @@
         QName redefinitionFor = redefinedBy.getName();
         name = compatName(name, chameleonNamespace);
         if (name.equals(redefinitionFor)) {
-            return (SchemaModelGroupImpl) _redefinedModelGroups.get(redefinedBy);
+            return _redefinedModelGroups.get(redefinedBy);
             // BUGBUG: should also link against _importingLoader.findRedefinedModelGroup
         }
         SchemaModelGroupImpl result = (SchemaModelGroupImpl) _modelGroups.get(name);
@@ -1042,7 +1028,7 @@
     }
 
     SchemaModelGroup[] redefinedModelGroups() {
-        return (SchemaModelGroup[]) _redefinedModelGroups.values().toArray(new SchemaModelGroup[0]);
+        return _redefinedModelGroups.values().toArray(new SchemaModelGroup[0]);
     }
 
     /* IDENTITY CONSTRAINTS ===========================================*/
@@ -1165,7 +1151,8 @@
         StscStack stscStack = tl_stscStack.get();
         stscStack.pop();
         if (stscStack.stack.size() == 0) {
-            tl_stscStack.set(null);            // this is required to release all the references in this classloader
+            // this is required to release all the references in this classloader
+            tl_stscStack.remove();
         }
         // which will enable class unloading and avoid OOM in PermGen
     }
@@ -1190,7 +1177,7 @@
 
         try {
             XmlStringImpl i = new XmlStringImpl();
-            i.set(str);
+            i.setStringValue(str);
             i.setImmutable();
             return new XmlValueRef(i);
         } catch (XmlValueOutOfRangeException e) {
@@ -1350,7 +1337,7 @@
                 } else {
                     uri = relative.toString();
                 }
-            } catch (URISyntaxException e) {
+            } catch (URISyntaxException ignored) {
             }
         }
 
