diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml
index f90af52..03a18bb 100644
--- a/.github/workflows/maven.yml
+++ b/.github/workflows/maven.yml
@@ -32,4 +32,4 @@
       with:
         java-version: ${{ matrix.java }}
     - name: Build with Maven
-      run: mvn -V package --file pom.xml
+      run: mvn -V apache-rat:check package --file pom.xml
diff --git a/LICENSE.txt b/LICENSE.txt
index 1c572e3..d645695 100644
--- a/LICENSE.txt
+++ b/LICENSE.txt
@@ -1,204 +1,202 @@
-/*
- *                                 Apache License
- *                           Version 2.0, January 2004
- *                        http://www.apache.org/licenses/
- *
- *   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
- *
- *   1. Definitions.
- *
- *      "License" shall mean the terms and conditions for use, reproduction,
- *      and distribution as defined by Sections 1 through 9 of this document.
- *
- *      "Licensor" shall mean the copyright owner or entity authorized by
- *      the copyright owner that is granting the License.
- *
- *      "Legal Entity" shall mean the union of the acting entity and all
- *      other entities that control, are controlled by, or are under common
- *      control with that entity. For the purposes of this definition,
- *      "control" means (i) the power, direct or indirect, to cause the
- *      direction or management of such entity, whether by contract or
- *      otherwise, or (ii) ownership of fifty percent (50%) or more of the
- *      outstanding shares, or (iii) beneficial ownership of such entity.
- *
- *      "You" (or "Your") shall mean an individual or Legal Entity
- *      exercising permissions granted by this License.
- *
- *      "Source" form shall mean the preferred form for making modifications,
- *      including but not limited to software source code, documentation
- *      source, and configuration files.
- *
- *      "Object" form shall mean any form resulting from mechanical
- *      transformation or translation of a Source form, including but
- *      not limited to compiled object code, generated documentation,
- *      and conversions to other media types.
- *
- *      "Work" shall mean the work of authorship, whether in Source or
- *      Object form, made available under the License, as indicated by a
- *      copyright notice that is included in or attached to the work
- *      (an example is provided in the Appendix below).
- *
- *      "Derivative Works" shall mean any work, whether in Source or Object
- *      form, that is based on (or derived from) the Work and for which the
- *      editorial revisions, annotations, elaborations, or other modifications
- *      represent, as a whole, an original work of authorship. For the purposes
- *      of this License, Derivative Works shall not include works that remain
- *      separable from, or merely link (or bind by name) to the interfaces of,
- *      the Work and Derivative Works thereof.
- *
- *      "Contribution" shall mean any work of authorship, including
- *      the original version of the Work and any modifications or additions
- *      to that Work or Derivative Works thereof, that is intentionally
- *      submitted to Licensor for inclusion in the Work by the copyright owner
- *      or by an individual or Legal Entity authorized to submit on behalf of
- *      the copyright owner. For the purposes of this definition, "submitted"
- *      means any form of electronic, verbal, or written communication sent
- *      to the Licensor or its representatives, including but not limited to
- *      communication on electronic mailing lists, source code control systems,
- *      and issue tracking systems that are managed by, or on behalf of, the
- *      Licensor for the purpose of discussing and improving the Work, but
- *      excluding communication that is conspicuously marked or otherwise
- *      designated in writing by the copyright owner as "Not a Contribution."
- *
- *      "Contributor" shall mean Licensor and any individual or Legal Entity
- *      on behalf of whom a Contribution has been received by Licensor and
- *      subsequently incorporated within the Work.
- *
- *   2. Grant of Copyright License. Subject to the terms and conditions of
- *      this License, each Contributor hereby grants to You a perpetual,
- *      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- *      copyright license to reproduce, prepare Derivative Works of,
- *      publicly display, publicly perform, sublicense, and distribute the
- *      Work and such Derivative Works in Source or Object form.
- *
- *   3. Grant of Patent License. Subject to the terms and conditions of
- *      this License, each Contributor hereby grants to You a perpetual,
- *      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
- *      (except as stated in this section) patent license to make, have made,
- *      use, offer to sell, sell, import, and otherwise transfer the Work,
- *      where such license applies only to those patent claims licensable
- *      by such Contributor that are necessarily infringed by their
- *      Contribution(s) alone or by combination of their Contribution(s)
- *      with the Work to which such Contribution(s) was submitted. If You
- *      institute patent litigation against any entity (including a
- *      cross-claim or counterclaim in a lawsuit) alleging that the Work
- *      or a Contribution incorporated within the Work constitutes direct
- *      or contributory patent infringement, then any patent licenses
- *      granted to You under this License for that Work shall terminate
- *      as of the date such litigation is filed.
- *
- *   4. Redistribution. You may reproduce and distribute copies of the
- *      Work or Derivative Works thereof in any medium, with or without
- *      modifications, and in Source or Object form, provided that You
- *      meet the following conditions:
- *
- *      (a) You must give any other recipients of the Work or
- *          Derivative Works a copy of this License; and
- *
- *      (b) You must cause any modified files to carry prominent notices
- *          stating that You changed the files; and
- *
- *      (c) You must retain, in the Source form of any Derivative Works
- *          that You distribute, all copyright, patent, trademark, and
- *          attribution notices from the Source form of the Work,
- *          excluding those notices that do not pertain to any part of
- *          the Derivative Works; and
- *
- *      (d) If the Work includes a "NOTICE" text file as part of its
- *          distribution, then any Derivative Works that You distribute must
- *          include a readable copy of the attribution notices contained
- *          within such NOTICE file, excluding those notices that do not
- *          pertain to any part of the Derivative Works, in at least one
- *          of the following places: within a NOTICE text file distributed
- *          as part of the Derivative Works; within the Source form or
- *          documentation, if provided along with the Derivative Works; or,
- *          within a display generated by the Derivative Works, if and
- *          wherever such third-party notices normally appear. The contents
- *          of the NOTICE file are for informational purposes only and
- *          do not modify the License. You may add Your own attribution
- *          notices within Derivative Works that You distribute, alongside
- *          or as an addendum to the NOTICE text from the Work, provided
- *          that such additional attribution notices cannot be construed
- *          as modifying the License.
- *
- *      You may add Your own copyright statement to Your modifications and
- *      may provide additional or different license terms and conditions
- *      for use, reproduction, or distribution of Your modifications, or
- *      for any such Derivative Works as a whole, provided Your use,
- *      reproduction, and distribution of the Work otherwise complies with
- *      the conditions stated in this License.
- *
- *   5. Submission of Contributions. Unless You explicitly state otherwise,
- *      any Contribution intentionally submitted for inclusion in the Work
- *      by You to the Licensor shall be under the terms and conditions of
- *      this License, without any additional terms or conditions.
- *      Notwithstanding the above, nothing herein shall supersede or modify
- *      the terms of any separate license agreement you may have executed
- *      with Licensor regarding such Contributions.
- *
- *   6. Trademarks. This License does not grant permission to use the trade
- *      names, trademarks, service marks, or product names of the Licensor,
- *      except as required for reasonable and customary use in describing the
- *      origin of the Work and reproducing the content of the NOTICE file.
- *
- *   7. Disclaimer of Warranty. Unless required by applicable law or
- *      agreed to in writing, Licensor provides the Work (and each
- *      Contributor provides its Contributions) on an "AS IS" BASIS,
- *      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
- *      implied, including, without limitation, any warranties or conditions
- *      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
- *      PARTICULAR PURPOSE. You are solely responsible for determining the
- *      appropriateness of using or redistributing the Work and assume any
- *      risks associated with Your exercise of permissions under this License.
- *
- *   8. Limitation of Liability. In no event and under no legal theory,
- *      whether in tort (including negligence), contract, or otherwise,
- *      unless required by applicable law (such as deliberate and grossly
- *      negligent acts) or agreed to in writing, shall any Contributor be
- *      liable to You for damages, including any direct, indirect, special,
- *      incidental, or consequential damages of any character arising as a
- *      result of this License or out of the use or inability to use the
- *      Work (including but not limited to damages for loss of goodwill,
- *      work stoppage, computer failure or malfunction, or any and all
- *      other commercial damages or losses), even if such Contributor
- *      has been advised of the possibility of such damages.
- *
- *   9. Accepting Warranty or Additional Liability. While redistributing
- *      the Work or Derivative Works thereof, You may choose to offer,
- *      and charge a fee for, acceptance of support, warranty, indemnity,
- *      or other liability obligations and/or rights consistent with this
- *      License. However, in accepting such obligations, You may act only
- *      on Your own behalf and on Your sole responsibility, not on behalf
- *      of any other Contributor, and only if You agree to indemnify,
- *      defend, and hold each Contributor harmless for any liability
- *      incurred by, or claims asserted against, such Contributor by reason
- *      of your accepting any such warranty or additional liability.
- *
- *   END OF TERMS AND CONDITIONS
- *
- *   APPENDIX: How to apply the Apache License to your work.
- *
- *      To apply the Apache License to your work, attach the following
- *      boilerplate notice, with the fields enclosed by brackets "[]"
- *      replaced with your own identifying information. (Don't include
- *      the brackets!)  The text should be enclosed in the appropriate
- *      comment syntax for the file format. We also recommend that a
- *      file or class name and description of purpose be included on the
- *      same "printed page" as the copyright notice for easier
- *      identification within third-party archives.
- *
- *   Copyright [yyyy] [name of copyright owner]
- *
- *   Licensed under the Apache License, Version 2.0 (the "License");
- *   you may not use this file except in compliance with the License.
- *   You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *   Unless required by applicable law or agreed to in writing, software
- *   distributed under the License is distributed on an "AS IS" BASIS,
- *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *   See the License for the specific language governing permissions and
- *   limitations under the License.
- */
 
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index dfbf4f6..c46205b 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -1,23 +1,24 @@
               Apache Commons BCEL
-              Version 6.4.0-SNAPSHOT
+              Version 6.4.0
               RELEASE NOTES
 
 
 INTRODUCTION:
 
 The Apache Commons BCEL team is pleased to announce the release of
-Apache Commons BCEL 6.4.0-SNAPSHOT!
+Apache Commons BCEL 6.4.0!
 
 The Byte Code Engineering Library (BCEL) is intended to give users a convenient
 way to analyze, create, and manipulate compiled .class files. Classes are
 represented by objects containing all the symbolic information of the given
 class: methods, fields and byte code instructions.
 
-Bug fix release
+Feature and bug fix release.
 
 NEW FEATURES:
 =============
 
+o BCEL-318: Add method org.apache.bcel.classfile.ConstantUtf8.clearCache(). Thanks to Gary Gregory.
 o BCEL-320: Add LruCacheClassPathRepository that can scan many JAR files without OutOfMemoryError. Thanks to Tomo Suzuki, Gary Gregory.
 o BCEL-322: Add constants to org.apache.bcel.Const for Java 14. Thanks to Gary Gregory.
 o BCEL-321: Refactor subclasses of ClassPathRepository for differences in underlying cache. Thanks to Tomo Suzuki.
@@ -27,7 +28,6 @@
 
 o BCEL-316: org.apache.bcel.classfile.Attribute class and subclasses should NOT log to the console by default. Thanks to Gary Gregory.
 o BCEL-278: InvokeInstruction.toString(final ConstantPool cp) throws NoSuchElementException #11. Thanks to Valery Barysoky.
-o BCEL-318: Add org.apache.bcel.classfile.ConstantUtf8.clearCache(). Thanks to Gary Gregory.
 o BCEL-270: Calling toString(ConstantPool) on InvokeInstruction throws NullPointerException. Thanks to Alexandru-Constantin Bledea.
 o BCEL-323: org.apache.bcel.util.BCELifier to set major and minor versions. Thanks to Tomo Suzuki.
 o BCEL-326: Add missing Java 9 and Java 11 class file attributes. #33 Thanks to Mark Roberts.
@@ -50,7 +50,7 @@
 
 https://commons.apache.org/proper/commons-bcel
 
-Download it from https://commons.apache.org/proper/commons-bcel/download_text.cgi
+Download it from https://commons.apache.org/proper/commons-bcel/download_bcel.cgi
 
 Have fun!
 -Apache Commons BCEL team
@@ -72,6 +72,7 @@
 
 -----------------------------------------------------------------------------
 
+
               Apache Commons BCEL
               Version 6.3.1
               RELEASE NOTES
diff --git a/pom.xml b/pom.xml
index 25ef8e7..e400020 100644
--- a/pom.xml
+++ b/pom.xml
@@ -27,7 +27,7 @@
   <parent>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-parent</artifactId>
-    <version>48</version>
+    <version>49</version>
   </parent>
 
   <groupId>org.apache.bcel</groupId>
@@ -49,7 +49,7 @@
     <commons.module.name>org.apache.bcel</commons.module.name>
     <commons.release.version>6.4.0</commons.release.version>
     <commons.release.isDistModule>true</commons.release.isDistModule>
-    <commons.rc.version>RC1</commons.rc.version>
+    <commons.rc.version>RC2</commons.rc.version>
     <commons.bc.version>6.3.1</commons.bc.version>
     <commons.release.desc>(Java 8)</commons.release.desc>
     <commons.scmPubUrl>https://svn.apache.org/repos/infra/websites/production/commons/content/proper/commons-bcel</commons.scmPubUrl>
@@ -213,6 +213,7 @@
   </scm>
 
   <build>
+    <defaultGoal>clean verify apache-rat:check japicmp:cmp checkstyle:check javadoc:javadoc</defaultGoal>
     <plugins>
       <plugin>
         <groupId>org.apache.rat</groupId>
@@ -348,6 +349,15 @@
           </parameter>
         </configuration>
       </plugin>    
+      <plugin>
+        <groupId>com.github.spotbugs</groupId>
+        <artifactId>spotbugs-maven-plugin</artifactId>
+        <version>${commons.spotbugs.version}</version>
+        <configuration>
+          <threshold>Normal</threshold>
+          <effort>Default</effort>
+        </configuration>
+      </plugin>
     </plugins>
   </build>
 
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 78de4f5..895ab3b 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -62,10 +62,10 @@
    -->
 
   <body>
-    <release version="6.4.0" date="2019-09-08" description="Bug fix release">
+    <release version="6.4.0" date="2019-09-20" description="Feature and bug fix release.">
       <action issue="BCEL-316" type="fix" dev="ggregory" due-to="Gary Gregory">org.apache.bcel.classfile.Attribute class and subclasses should NOT log to the console by default.</action>
       <action issue="BCEL-278" type="fix" dev="ggregory" due-to="Valery Barysoky">InvokeInstruction.toString(final ConstantPool cp) throws NoSuchElementException #11.</action>
-      <action issue="BCEL-318" type="fix" dev="ggregory" due-to="Gary Gregory">Add org.apache.bcel.classfile.ConstantUtf8.clearCache().</action>
+      <action issue="BCEL-318" type="add" dev="ggregory" due-to="Gary Gregory">Add method org.apache.bcel.classfile.ConstantUtf8.clearCache().</action>
       <action issue="BCEL-317" type="update" dev="ggregory" due-to="Tomo Suzuki, Gary Gregory">Pluggable cache for ConstantUtf8.</action>
       <action issue="BCEL-320" type="add" dev="ggregory" due-to="Tomo Suzuki, Gary Gregory">Add LruCacheClassPathRepository that can scan many JAR files without OutOfMemoryError.</action>
       <action issue="BCEL-299" type="update" dev="ggregory" due-to="Gary Gregory, zhangminglei">Fix example src/examples/ClassDumper.java ClassDumper.processID().</action>
diff --git a/src/changes/release-notes.vm b/src/changes/release-notes.vm
index 7677a06..d0d6abc 100644
--- a/src/changes/release-notes.vm
+++ b/src/changes/release-notes.vm
@@ -136,7 +136,7 @@
 
 ${project.url}
 
-Download it from ${project.url}/download_text.cgi
+Download it from ${project.url}/download_bcel.cgi
 
 Have fun!
 -Apache Commons BCEL team
@@ -155,3 +155,6 @@
 Or subscribe to the commons-user mailing list
 
 The Apache Commons Team
+
+-----------------------------------------------------------------------------
+
diff --git a/src/examples/ClassDumper.java b/src/examples/ClassDumper.java
index a223672..0c4a18b 100644
--- a/src/examples/ClassDumper.java
+++ b/src/examples/ClassDumper.java
@@ -31,7 +31,7 @@
 import org.apache.bcel.classfile.Method;
 import org.apache.bcel.util.BCELifier;
 
-/** 
+/**
  * Display Java .class file data.
  * Output is based on javap tool.
  * Built using the BCEL libary.
@@ -115,10 +115,10 @@
         if (magic != Const.JVM_CLASSFILE_MAGIC) {
             throw new ClassFormatException(file_name + " is not a Java .class file");
         }
-        System.out.println("Java Class Dump"); 
-        System.out.println("  file: " + file_name); 
-        System.out.printf("%nClass header:%n"); 
-        System.out.printf("  magic: %X%n", magic); 
+        System.out.println("Java Class Dump");
+        System.out.println("  file: " + file_name);
+        System.out.printf("%nClass header:%n");
+        System.out.printf("  magic: %X%n", magic);
     }
 
     /**
@@ -128,10 +128,10 @@
      */
     private final void processVersion () throws IOException, ClassFormatException {
         minor = file.readUnsignedShort();
-        System.out.printf("  minor version: %s%n", minor); 
+        System.out.printf("  minor version: %s%n", minor);
 
         major = file.readUnsignedShort();
-        System.out.printf("  major version: %s%n", major); 
+        System.out.printf("  major version: %s%n", major);
     }
 
     /**
@@ -146,19 +146,19 @@
         constant_pool = new ConstantPool(constant_items);
 
         // constant_pool[0] is unused by the compiler
-        System.out.printf("%nConstant pool(%d):%n", constant_pool_count - 1); 
+        System.out.printf("%nConstant pool(%d):%n", constant_pool_count - 1);
 
         for (int i = 1; i < constant_pool_count; i++) {
             constant_items[i] = Constant.readConstant(file);
             // i'm sure there is a better way to do this
             if (i < 10) {
-                System.out.printf("    #%1d = ", i); 
+                System.out.printf("    #%1d = ", i);
             } else if (i <100) {
-                System.out.printf("   #%2d = ", i); 
+                System.out.printf("   #%2d = ", i);
             } else {
-                System.out.printf("  #%d = ", i); 
-            }    
-            System.out.println(constant_items[i]); 
+                System.out.printf("  #%d = ", i);
+            }
+            System.out.println(constant_items[i]);
 
             // All eight byte constants take up two spots in the constant pool
             tag = constant_items[i].getTag();
@@ -188,15 +188,15 @@
                     " can't be both final and abstract");
         }
 
-        System.out.printf("%nClass info:%n"); 
+        System.out.printf("%nClass info:%n");
         System.out.println("  flags: " + BCELifier.printFlags(access_flags,
                 BCELifier.FLAGS.CLASS));
         class_name_index = file.readUnsignedShort();
-        System.out.printf("  this_class: %d (", class_name_index); 
-        System.out.println(constantToString(class_name_index) + ")"); 
+        System.out.printf("  this_class: %d (", class_name_index);
+        System.out.println(constantToString(class_name_index) + ")");
 
         superclass_name_index = file.readUnsignedShort();
-        System.out.printf("  super_class: %d (", superclass_name_index); 
+        System.out.printf("  super_class: %d (", superclass_name_index);
         if (superclass_name_index > 0) {
             System.out.printf("%s", constantToString(superclass_name_index));
         }
@@ -213,17 +213,17 @@
         interfaces_count = file.readUnsignedShort();
         interfaces = new int[interfaces_count];
 
-        System.out.printf("%nInterfaces(%d):%n", interfaces_count); 
+        System.out.printf("%nInterfaces(%d):%n", interfaces_count);
 
         for (int i = 0; i < interfaces_count; i++) {
             interfaces[i] = file.readUnsignedShort();
             // i'm sure there is a better way to do this
             if (i < 10) {
-                System.out.printf("   #%1d = ", i); 
+                System.out.printf("   #%1d = ", i);
             } else if (i <100) {
-                System.out.printf("  #%2d = ", i); 
+                System.out.printf("  #%2d = ", i);
             } else {
-                System.out.printf(" #%d = ", i); 
+                System.out.printf(" #%d = ", i);
             }
             System.out.println(interfaces[i] + " (" +
                     constant_pool.getConstantString(interfaces[i],
@@ -241,13 +241,13 @@
         fields_count = file.readUnsignedShort();
         fields = new Field[fields_count];
 
-        // sometimes fields[0] is magic used for serialization 
-        System.out.printf("%nFields(%d):%n", fields_count); 
+        // sometimes fields[0] is magic used for serialization
+        System.out.printf("%nFields(%d):%n", fields_count);
 
         for (int i = 0; i < fields_count; i++) {
             processFieldOrMethod();
             if (i < fields_count - 1) {
-                System.out.println(); 
+                System.out.println();
             }
         }
     }
@@ -262,12 +262,12 @@
         methods_count = file.readUnsignedShort();
         methods = new Method[methods_count];
 
-        System.out.printf("%nMethods(%d):%n", methods_count); 
+        System.out.printf("%nMethods(%d):%n", methods_count);
 
         for (int i = 0; i < methods_count; i++) {
             processFieldOrMethod();
             if (i < methods_count - 1) {
-                System.out.println(); 
+                System.out.println();
             }
         }
     }
@@ -282,7 +282,7 @@
         attributes_count = file.readUnsignedShort();
         attributes = new Attribute[attributes_count];
 
-        System.out.printf("%nAttributes(%d):%n", attributes_count); 
+        System.out.printf("%nAttributes(%d):%n", attributes_count);
 
         for (int i = 0; i < attributes_count; i++) {
             attributes[i] = Attribute.readAttribute(file, constant_pool);
@@ -303,17 +303,17 @@
     private final void processFieldOrMethod () throws IOException, ClassFormatException {
         final int access_flags = file.readUnsignedShort();
         final int name_index = file.readUnsignedShort();
-        System.out.printf("  name_index: %d (", name_index); 
-        System.out.println(constantToString(name_index) + ")"); 
+        System.out.printf("  name_index: %d (", name_index);
+        System.out.println(constantToString(name_index) + ")");
         System.out.println("  access_flags: " + BCELifier.printFlags(access_flags,
                 BCELifier.FLAGS.METHOD));
         final int descriptor_index = file.readUnsignedShort();
-        System.out.printf("  descriptor_index: %d (", descriptor_index); 
-        System.out.println(constantToString(descriptor_index) + ")"); 
+        System.out.printf("  descriptor_index: %d (", descriptor_index);
+        System.out.println(constantToString(descriptor_index) + ")");
 
         final int attributes_count = file.readUnsignedShort();
         final Attribute[] attributes = new Attribute[attributes_count];
-        System.out.println("  attribute count: " + attributes_count); 
+        System.out.println("  attribute count: " + attributes_count);
 
         for (int i = 0; i < attributes_count; i++) {
             // going to peek ahead a bit
@@ -323,10 +323,10 @@
             // restore file location
             file.reset();
             // Usefull for debugging
-            // System.out.printf("  attribute_name_index: %d (", attribute_name_index); 
-            // System.out.println(constantToString(attribute_name_index) + ")"); 
-            // System.out.printf("  atribute offset in file: %x%n", + file.getStreamPosition()); 
-            // System.out.println("  atribute_length: " + attribute_length); 
+            // System.out.printf("  attribute_name_index: %d (", attribute_name_index);
+            // System.out.println(constantToString(attribute_name_index) + ")");
+            // System.out.printf("  atribute offset in file: %x%n", + file.getStreamPosition());
+            // System.out.println("  atribute_length: " + attribute_length);
 
             // A stronger verification test would be to read attribute_length bytes
             // into a buffer.  Then pass that buffer to readAttribute and also
@@ -337,17 +337,17 @@
             final long pos2 = file.getStreamPosition();
             if ((pos2 - pos1) != (attribute_length + 6)) {
                 System.out.printf("%nWHOOPS attribute_length: %d pos2-pos1-6: %d pos1: %x(%d) pos2: %x(%d)%n",
-                        attribute_length, pos2-pos1-6, pos1, pos1, pos2, pos2); 
+                        attribute_length, pos2-pos1-6, pos1, pos1, pos2, pos2);
             }
-            System.out.printf("  "); 
-            System.out.println(attributes[i]); 
+            System.out.printf("  ");
+            System.out.println(attributes[i]);
         }
     }
 
     private final String constantToString (final int index) {
-        final Constant c = constant_items[index]; 
-        return constant_pool.constantToString(c); 
-    }    
+        final Constant c = constant_items[index];
+        return constant_pool.constantToString(c);
+    }
 
 }
 
diff --git a/src/examples/HelloWorldBuilder.java b/src/examples/HelloWorldBuilder.java
index eb45906..00487c7 100644
--- a/src/examples/HelloWorldBuilder.java
+++ b/src/examples/HelloWorldBuilder.java
@@ -44,15 +44,15 @@
  *     public static void main(String[] argv) {
  *         BufferedReader in   = new BufferedReader(new InputStreamReader(System.in));
  *         String name = null;
- * 
+ *
  *         try {
  *             System.out.print("Please enter your name> ");
  *             name = in.readLine();
- *         } catch(IOException e) { 
+ *         } catch(IOException e) {
  *             System.out.println(e);
- *             return; 
+ *             return;
  *         }
- * 
+ *
  *         System.out.println("Hello, " + name);
  *     }
  * }
@@ -148,7 +148,7 @@
                 Type.VOID, new Type[]{Type.STRING},
                 Constants.INVOKESPECIAL));
         il.append(new ALOAD(name));
-    
+
         // Concatenate strings using a StringBuffer and print them.
         il.append(factory.createInvoke("java.lang.StringBuffer", "append",
                 Type.STRINGBUFFER, new Type[]{Type.STRING},
diff --git a/src/examples/Mini/ASCII_CharStream.java b/src/examples/Mini/ASCII_CharStream.java
index 943c51f..002032c 100644
--- a/src/examples/Mini/ASCII_CharStream.java
+++ b/src/examples/Mini/ASCII_CharStream.java
@@ -364,7 +364,7 @@
         bufcolumn[j] = newCol + columnDiff;
         columnDiff = nextColDiff;
         i++;
-     } 
+     }
 
      if (i < len)
      {
diff --git a/src/examples/Mini/ASTExpr.java b/src/examples/Mini/ASTExpr.java
index a82442b..63e87c7 100644
--- a/src/examples/Mini/ASTExpr.java
+++ b/src/examples/Mini/ASTExpr.java
@@ -47,7 +47,7 @@
  * obeying the aritmetical precedences (* stronger than +, etc.) and
  * are discarded in the first pass.
 */
-public class ASTExpr extends SimpleNode 
+public class ASTExpr extends SimpleNode
 implements MiniParserConstants, MiniParserTreeConstants, org.apache.bcel.Constants {
   protected int         kind=-1;    // Single twig to leaf?
   private   int         unop=-1;    // Special case: Unary operand applied
@@ -87,7 +87,7 @@
 
   /* Special constructor, called from ASTTerm.traverse() and
    * ASTFactor.traverse(), when traverse()ing the parse tree replace
-   * themselves with Expr nodes. 
+   * themselves with Expr nodes.
    */
   ASTExpr(final ASTExpr[] children, final int kind, final int line, final int column) {
     this(line, column, kind, JJTEXPR);
@@ -140,25 +140,25 @@
       for(int i=0; i < exprs.length; i++) {
         exprs[i] = exprs[i].traverse(env); // References may change
     }
-    
+
       return this;
     }
   }
 
-  /** 
+  /**
    * Second and third pass
    * @return type of expression
    * @param expected type
    */
   public int eval(final int expected) {
     int child_type = T_UNKNOWN, t;
-    
+
     is_simple = true;
 
     // Determine expected node type depending on used operator.
     if(unop != -1) {
       if(unop == MINUS) {
-        child_type = type = T_INT;  // - 
+        child_type = type = T_INT;  // -
     } else {
         child_type = type = T_BOOLEAN; // !
     }
@@ -178,7 +178,7 @@
 
     // Get type of subexpressions
     for(int i=0; i < exprs.length; i++) {
-      t = exprs[i].eval(child_type); 
+      t = exprs[i].eval(child_type);
 
       if(t != child_type) {
         MiniC.addError(exprs[i].getLine(), exprs[i].getColumn(),
@@ -202,7 +202,7 @@
 
   /**
    * Fourth pass, produce Java code.
-   */  
+   */
   public void code(final StringBuffer buf) {
     if(unop != -1) {
       exprs[0].code(buf);
@@ -225,7 +225,7 @@
       case MULT:  ASTFunDecl.push(buf, _body_int + " * " + _body_int2); break;
       case DIV:   ASTFunDecl.push(buf, _body_int + " / " + _body_int2); break;
 
-      case AND:   ASTFunDecl.push(buf, toInt(toBool(_body_int) + " && " + 
+      case AND:   ASTFunDecl.push(buf, toInt(toBool(_body_int) + " && " +
               toBool(_body_int2))); break;
       case OR:    ASTFunDecl.push(buf, toInt(toBool(_body_int) + " || " +
               toBool(_body_int2))); break;
diff --git a/src/examples/Mini/ASTFunDecl.java b/src/examples/Mini/ASTFunDecl.java
index 4b2e507..0cb714b 100644
--- a/src/examples/Mini/ASTFunDecl.java
+++ b/src/examples/Mini/ASTFunDecl.java
@@ -52,7 +52,7 @@
   private ASTIdent[]  argv;
   private ASTExpr     body;
   private int         type = T_UNKNOWN;
-  private int         line, column; 
+  private int         line, column;
   private boolean     is_simple;  // true, if simple expression like `12 + f(a)'
   private boolean     is_recursive; // Not used yet, TODO
 //  private int         max_depth; // max. expression tree depth
@@ -73,13 +73,13 @@
 
   ASTFunDecl(final ASTIdent name, final ASTIdent[] argv, final ASTExpr body, final int type) {
     this(JJTFUNDECL);
-    
+
     this.name = name;
     this.argv = argv;
     this.body = body;
     this.type = type;
   }
-  
+
   /**
    * Overrides SimpleNode.closeNode()
    * Cast children to appropiate type.
@@ -118,12 +118,12 @@
     /* Update entry of this function, i.e. set argument references.
      * The entry is already in there by garantuee, but may be of wrong type,
      * i.e. the user defined a function `TRUE', e.g. and `TRUE' is of type `Variable'.
-     */   
+     */
     try {
       final Function fun = (Function)env.get(name.getName());
       fun.setArgs(argv);
     } catch(final ClassCastException e) {} // Who cares?
-    
+
     body = body.traverse(env); // Traverse expression body
 
     return this;
@@ -138,7 +138,7 @@
 
     if((expected != T_UNKNOWN) && (type != expected)) {
         MiniC.addError(line, column,
-                     "Function f ist not of type " + TYPE_NAMES[expected] + 
+                     "Function f ist not of type " + TYPE_NAMES[expected] +
                      " as previously assumed, but " + TYPE_NAMES[type]);
     }
 
@@ -172,18 +172,18 @@
     else {
       out.print("  public static final " + "int" + // type_names[type] +
                 " " + fname + "(");
-      
+
       for(int i = 0; i < argv.length; i++) {
         out.print("int " + argv[i].getName());
-        
+
         if(i < argv.length - 1) {
         out.print(", ");
     }
       }
-      
+
       out.println(")\n    throws IOException\n  {");
     }
-    
+
     if(!ignore) {
       final StringBuffer buf = new StringBuffer();
 
diff --git a/src/examples/Mini/ASTIfExpr.java b/src/examples/Mini/ASTIfExpr.java
index d331d9a..a04f4ed 100644
--- a/src/examples/Mini/ASTIfExpr.java
+++ b/src/examples/Mini/ASTIfExpr.java
@@ -69,7 +69,7 @@
    * Overrides ASTExpr.traverse()
    */
   @Override
-  public ASTExpr traverse(final Environment env) { 
+  public ASTExpr traverse(final Environment env) {
     this.env = env;
 
     if_expr   = if_expr.traverse(env);
@@ -94,7 +94,7 @@
 
     if((if_type=if_expr.eval(T_BOOLEAN)) != T_BOOLEAN) {
         MiniC.addError(if_expr.getLine(), if_expr.getColumn(),
-                     "IF expression is not of type boolean, but " + 
+                     "IF expression is not of type boolean, but " +
                      TYPE_NAMES[if_type] + ".");
     }
 
diff --git a/src/examples/Mini/ASTLetExpr.java b/src/examples/Mini/ASTLetExpr.java
index 364625b..b3a1dbb 100644
--- a/src/examples/Mini/ASTLetExpr.java
+++ b/src/examples/Mini/ASTLetExpr.java
@@ -56,7 +56,7 @@
    */
   @Override
   public void closeNode() {
-    int i; /* length must be a multiple of 
+    int i; /* length must be a multiple of
                                          * two (ident = expr) + 1 (body expr) */
     final int len_2 = children.length / 2;
     idents = new ASTIdent[len_2];
@@ -78,12 +78,12 @@
   @Override
   public ASTExpr traverse(final Environment env) {
     this.env = env;
-    
+
     // Traverse RHS exprs first, so no references to LHS vars are allowed
     for(int i=0; i < exprs.length; i++) {
         exprs[i] = exprs[i].traverse((Environment)env.clone());
     }
-    
+
     // Put argument names into hash table aka. environment
     for(int i=0; i < idents.length; i++) {
       final ASTIdent id    = idents[i];
@@ -99,10 +99,10 @@
     }
 
     body = body.traverse(env);
-    
+
     return this;
   }
-  
+
   /**
    * Second pass
    * Overrides AstExpr.eval()
@@ -115,7 +115,7 @@
 
     for(int i=0; i < idents.length; i++) {
       final int t = exprs[i].eval(T_UNKNOWN);
-      
+
       idents[i].setType(t);
       //      is_simple = is_simple && exprs[i].isSimple();
     }
diff --git a/src/examples/Mini/ASTProgram.java b/src/examples/Mini/ASTProgram.java
index 8966ccf..7d52785 100644
--- a/src/examples/Mini/ASTProgram.java
+++ b/src/examples/Mini/ASTProgram.java
@@ -57,7 +57,7 @@
      * WRITE has one arg of type T_INT, both return T_INT.
      */
     ASTIdent   ident  = new ASTIdent("WRITE", T_INT, -1, -1);
-    ASTIdent[] args   = { new ASTIdent("", T_INT, -1, -1) }; 
+    ASTIdent[] args   = { new ASTIdent("", T_INT, -1, -1) };
     Function   fun    = new Function(ident, args, true);
     env.put(fun);
 
@@ -65,7 +65,7 @@
     args  = new ASTIdent[0];
     fun   = new Function(ident, args, true);
     env.put(fun);
-    
+
     /* Add predefined idents TRUE/FALSE of type T_BOOLEAN
      */
     ident = new ASTIdent("TRUE", T_BOOLEAN, -1, -1);
@@ -103,7 +103,7 @@
    *
    * Put everything into the environment, which is copied appropiately to each
    * recursion level, i.e. each FunDecl gets its own copy that it can further
-   * manipulate. 
+   * manipulate.
    *
    * Checks for name clashes of function declarations.
    */
@@ -121,7 +121,7 @@
         name  = f.getName();
         fname = name.getName();
         fun   = env.get(fname); // Lookup in env
-        
+
         if(fun != null) {
         MiniC.addError(f.getLine(), f.getColumn(),
                          "Redeclaration of " + fun + ".");
@@ -129,24 +129,24 @@
         env.put(new Function(name, null)); // `args' will be set by FunDecl.traverse()
     }
 
-        
+
       }
 
       // Go for it
       for(int i=0; i < fun_decls.length; i++) {
         fun_decls[i] = fun_decls[i].traverse((Environment)env.clone());
-        
+
         // Look for `main' routine
         fname = fun_decls[i].getName().getName();
         if(fname.equals("main")) {
         main = (Function)env.get(fname);
     }
       }
-      
+
       if(main == null) {
         MiniC.addError(0, 0, "You didn't declare a `main' function.");
     } else if(main.getNoArgs() != 0) {
-        MiniC.addError(main.getLine(), main.getColumn(), 
+        MiniC.addError(main.getLine(), main.getColumn(),
                         "Main function has too many arguments declared.");
     }
     }
@@ -154,7 +154,7 @@
     return this;
   }
 
-  /** 
+  /**
    * Second pass, determine type of each node, if possible.
    */
   public void eval(final int pass) {
@@ -183,11 +183,11 @@
     out.println("import java.io.IOException;\n");
 
     out.println("public final class " + name + " {");
-    out.println("  private static BufferedReader _in = new BufferedReader" + 
+    out.println("  private static BufferedReader _in = new BufferedReader" +
                 "(new InputStreamReader(System.in));\n");
 
     out.println("  private static int _readInt() throws IOException {\n" +
-                "    System.out.print(\"Please enter a number> \");\n" + 
+                "    System.out.print(\"Please enter a number> \");\n" +
                 "    return Integer.parseInt(_in.readLine());\n  }\n");
 
     out.println("  private static int _writeInt(int n) {\n" +
@@ -268,7 +268,7 @@
     il.append(new INVOKEVIRTUAL(cp.addMethodref("java.lang.StringBuffer",
                                                 "toString",
                                                 "()Ljava/lang/String;")));
-    
+
     il.append(new INVOKEVIRTUAL(cp.addMethodref("java.io.PrintStream",
                                                 "println",
                                                 "(Ljava/lang/String;)V")));
@@ -294,7 +294,7 @@
 
     method = new MethodGen(ACC_PUBLIC, Type.VOID, Type.NO_ARGS, null,
                            "<init>", class_name, il, cp);
-    
+
     method.setMaxStack(1);
     class_gen.addMethod(method.getMethod());
 
diff --git a/src/examples/Mini/Environment.java b/src/examples/Mini/Environment.java
index 3f61c02..1afd1bf 100644
--- a/src/examples/Mini/Environment.java
+++ b/src/examples/Mini/Environment.java
@@ -26,14 +26,14 @@
  * That environment contains all function definitions and identifiers.
  * Hash keys are Strings (identifiers), which are mapped to a table index.
  *
- * The table consists of `SIZE' fields which have `SLOTS' subfields. Thus 
+ * The table consists of `SIZE' fields which have `SLOTS' subfields. Thus
  * the maximum number of storable items is `SLOTS' * `SIZE'.
  *
  */
 public class Environment implements Cloneable {
   private static final int SIZE  = 127; // Prime number large enough for most cases
   private static final int SLOTS = 3;   // Number of slots of each field
-  
+
   private final int       size;               // The table is an array of
   private final Vector<EnvEntry>[]  table;              // Vectors
   private int       elements=0;
@@ -136,7 +136,7 @@
     } catch(final ArrayIndexOutOfBoundsException e) {}
   }
 
-  private static int lookup(final Vector<EnvEntry> v, final String key) 
+  private static int lookup(final Vector<EnvEntry> v, final String key)
        throws ArrayIndexOutOfBoundsException
   {
     final int len = v.size();
@@ -153,7 +153,7 @@
   }
 
   @Override
-  public Object clone() { 
+  public Object clone() {
     final Vector<EnvEntry>[] copy = new Vector[size];
 
     for(int i=0; i < size; i++) {
@@ -199,7 +199,7 @@
           for(int j=0; j < len; j++) {
         entries[k++] = v.elementAt(j);
     }
-        } catch(final ArrayIndexOutOfBoundsException e) {}  
+        } catch(final ArrayIndexOutOfBoundsException e) {}
       }
     }
 
diff --git a/src/examples/Mini/Function.java b/src/examples/Mini/Function.java
index f6c56bd..b584a69 100644
--- a/src/examples/Mini/Function.java
+++ b/src/examples/Mini/Function.java
@@ -45,7 +45,7 @@
     column   = name.getColumn();
     setArgs(args);
   }
-  
+
   @Override
   public String toString() {
     final StringBuffer buf = new StringBuffer();
@@ -74,8 +74,8 @@
   public int        getColumn()       { return column; }
   public ASTIdent   getArg(final int i)     { return args[i]; }
   public ASTIdent[] getArgs()         { return args; }
-  public void       setArgs(final ASTIdent[] args) { 
-    this.args = args; 
+  public void       setArgs(final ASTIdent[] args) {
+    this.args = args;
     no_args   = (args == null)? 0 : args.length;
   }
 }
diff --git a/src/examples/Mini/MiniC.java b/src/examples/Mini/MiniC.java
index 645c0fc..34a7b3e 100644
--- a/src/examples/Mini/MiniC.java
+++ b/src/examples/Mini/MiniC.java
@@ -30,7 +30,7 @@
   private static Vector<String> warnings = null;
   private static String file     = null;
   private static int   pass      = 0;
-        
+
   public static void main(final String[] argv) {
     final String[]   file_name = new String[argv.length];
     int        files=0;
@@ -55,7 +55,7 @@
           file_name[files++] = argv[i];
         }
       }
-        
+
       if(files == 0) {
         System.err.println("Nothing to compile.");
     }
@@ -170,7 +170,7 @@
 
     if(diff > 0) {
       final char[] chs = new char[diff];
-      
+
       for(int i=0; i < diff; i++) {
         chs[i] = ' ';
     }
diff --git a/src/examples/Mini/MiniParserTokenManager.java b/src/examples/Mini/MiniParserTokenManager.java
index 694e1f7..bffe0b1 100644
--- a/src/examples/Mini/MiniParserTokenManager.java
+++ b/src/examples/Mini/MiniParserTokenManager.java
@@ -317,7 +317,7 @@
 {
    if (((active0 &= old0)) == 0L) {
     return jjStartNfa_0(0, old0);
-} 
+}
    try { curChar = ASCII_CharStream.readChar(); }
    catch(final java.io.IOException e) {
       jjStopStringLiteralDfa_0(1, active0);
@@ -361,7 +361,7 @@
 {
    if (((active0 &= old0)) == 0L) {
     return jjStartNfa_0(1, old0);
-} 
+}
    try { curChar = ASCII_CharStream.readChar(); }
    catch(final java.io.IOException e) {
       jjStopStringLiteralDfa_0(2, active0);
@@ -399,7 +399,7 @@
 {
    if (((active0 &= old0)) == 0L) {
     return jjStartNfa_0(2, old0);
-} 
+}
    try { curChar = ASCII_CharStream.readChar(); }
    catch(final java.io.IOException e) {
       jjStopStringLiteralDfa_0(3, active0);
@@ -554,34 +554,34 @@
    }
 }
 static final int[] jjnextStates = {
-   4, 5, 
+   4, 5,
 };
 public static final String[] jjstrLiteralImages = {
-"", null, null, null, null, null, null, null, null, "\106\125\116", 
-"\111\106", "\124\110\105\116", "\105\114\123\105", "\106\111", "\114\105\124", 
-"\111\116", "\76", "\74", "\76\75", "\74\75", "\75\75", "\41\75", "\41", 
-"\106\101\114\123\105", "\124\122\125\105", "\101\116\104", "\117\122", "\53", "\55", "\52", "\45", 
-"\57", "\50", "\51", "\75", "\54", "\122\105\101\104", "\127\122\111\124\105", null, 
+"", null, null, null, null, null, null, null, null, "\106\125\116",
+"\111\106", "\124\110\105\116", "\105\114\123\105", "\106\111", "\114\105\124",
+"\111\116", "\76", "\74", "\76\75", "\74\75", "\75\75", "\41\75", "\41",
+"\106\101\114\123\105", "\124\122\125\105", "\101\116\104", "\117\122", "\53", "\55", "\52", "\45",
+"\57", "\50", "\51", "\75", "\54", "\122\105\101\104", "\127\122\111\124\105", null,
 null, null, null, null, };
 public static final String[] lexStateNames = {
-   "DEFAULT", 
-   "SINGLE_LINE_COMMENT_STATE", 
+   "DEFAULT",
+   "SINGLE_LINE_COMMENT_STATE",
 };
 public static final int[] jjnewLexState = {
-   -1, -1, -1, -1, -1, -1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
-   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 
+   -1, -1, -1, -1, -1, -1, 1, 0, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
+   -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
 };
 static final long[] jjtoToken = {
-   0x73ffffffe01L, 
+   0x73ffffffe01L,
 };
 static final long[] jjtoSkip = {
-   0xbeL, 
+   0xbeL,
 };
 static final long[] jjtoSpecial = {
-   0x80L, 
+   0x80L,
 };
 static final long[] jjtoMore = {
-   0x140L, 
+   0x140L,
 };
 static private ASCII_CharStream input_stream;
 static private final int[] jjrounds = new int[6];
@@ -654,7 +654,7 @@
 static int jjmatchedPos;
 static int jjmatchedKind;
 
-public static Token getNextToken() 
+public static Token getNextToken()
 {
   Token specialToken = null;
   Token matchedToken;
@@ -662,13 +662,13 @@
 
   EOFLoop :
   for (;;)
-  {   
-   try   
-   {     
+  {
+   try
+   {
       curChar = ASCII_CharStream.BeginToken();
-   }     
+   }
    catch(final java.io.IOException e)
-   {        
+   {
       jjmatchedKind = 0;
       matchedToken = jjFillToken();
       matchedToken.specialToken = specialToken;
diff --git a/src/examples/Mini/Node.java b/src/examples/Mini/Node.java
index 18cc9cb..3a0ade2 100644
--- a/src/examples/Mini/Node.java
+++ b/src/examples/Mini/Node.java
@@ -36,7 +36,7 @@
   /** This pair of methods are used to inform the node of its
     parent. */
   void jjtSetParent(Node n);
-  
+
   Node jjtGetParent();
 
   /** This method tells the node to add its argument to the node's
diff --git a/src/examples/Mini/ParseException.java b/src/examples/Mini/ParseException.java
index 399b9bd..99aee2b 100644
--- a/src/examples/Mini/ParseException.java
+++ b/src/examples/Mini/ParseException.java
@@ -141,7 +141,7 @@
         break;
       }
       retval += add_escapes(tok.image);
-      tok = tok.next; 
+      tok = tok.next;
     }
     retval += "\" at line " + currentToken.next.beginLine + ", column " + currentToken.next.beginColumn + "." + eol;
     if (expectedTokenSequences.length == 1) {
@@ -157,7 +157,7 @@
    * The end of line string for this machine.
    */
   protected String eol = System.getProperty("line.separator", "\n");
- 
+
   /**
    * Used to convert raw characters to their escaped version
    * when these raw version cannot be used as part of an ASCII
diff --git a/src/examples/Mini/SimpleNode.java b/src/examples/Mini/SimpleNode.java
index 54ed00d..0f91b76 100644
--- a/src/examples/Mini/SimpleNode.java
+++ b/src/examples/Mini/SimpleNode.java
@@ -46,7 +46,7 @@
 
   public void closeNode() {
   }
-  
+
   public void jjtSetParent(final Node n) { parent = n; }
   public Node jjtGetParent() { return parent; }
 
diff --git a/src/examples/Mini/TokenMgrError.java b/src/examples/Mini/TokenMgrError.java
index 587d3f7..4e9340a 100644
--- a/src/examples/Mini/TokenMgrError.java
+++ b/src/examples/Mini/TokenMgrError.java
@@ -102,7 +102,7 @@
    /**
     * Returns a detailed message for the Error when it is thrown by the
     * token manager to indicate a lexical error.
-    * Parameters : 
+    * Parameters :
     *    EOFSeen     : indicates if EOF caused the lexicl error
     *    curLexState : lexical state in which this error occured
     *    errorLine   : line number when the error occured
@@ -122,7 +122,7 @@
    /**
     * You can also modify the body of this method to customize your error messages.
     * For example, cases like LOOP_DETECTED and INVALID_LEXICAL_STATE are not
-    * of end-users concern, so you can return something like : 
+    * of end-users concern, so you can return something like :
     *
     *     "Internal Error : Please file a bug report .... "
     *
diff --git a/src/examples/helloify.java b/src/examples/helloify.java
index 2df07b7..44c05cc 100644
--- a/src/examples/helloify.java
+++ b/src/examples/helloify.java
@@ -95,7 +95,7 @@
         if (m.isNative() || m.isAbstract() || (code == null)) {
             return m;
         }
-    
+
         // Create instruction list to be inserted at method start.
         final String mesg = "Hello from " + Utility.methodSignatureToString(m.getSignature(),
                 name,
diff --git a/src/examples/patchclass.java b/src/examples/patchclass.java
index 029f584..91fcb94 100644
--- a/src/examples/patchclass.java
+++ b/src/examples/patchclass.java
@@ -56,7 +56,7 @@
     }
 
     /*
-     * Replace all occurences of string "<em>old</em>" with 
+     * Replace all occurences of string "<em>old</em>" with
      * "<em>replacement</em>" in all Utf8 constants
      */
     private static void patchIt(final String old, final String replacement, final Constant[] constant_pool) {
diff --git a/src/main/java/org/apache/bcel/Const.java b/src/main/java/org/apache/bcel/Const.java
index ba9e156..139bd74 100644
--- a/src/main/java/org/apache/bcel/Const.java
+++ b/src/main/java/org/apache/bcel/Const.java
@@ -336,7 +336,7 @@
    */
   @Deprecated
   public static final short MAX_ACC_FLAG     = ACC_ENUM;
-  
+
   /** One of the access flags for fields, methods, or classes.
    * ACC_MODULE is negative as a short.
    * @see #ACC_PUBLIC
diff --git a/src/main/java/org/apache/bcel/Repository.java b/src/main/java/org/apache/bcel/Repository.java
index 9e5ef21..edcccb4 100644
--- a/src/main/java/org/apache/bcel/Repository.java
+++ b/src/main/java/org/apache/bcel/Repository.java
@@ -37,7 +37,7 @@
     private static org.apache.bcel.util.Repository repository = SyntheticRepository.getInstance();
 
 
-    /** 
+    /**
      * @return currently used repository instance
      */
     public static org.apache.bcel.util.Repository getRepository() {
@@ -45,7 +45,7 @@
     }
 
 
-    /** 
+    /**
      * Sets repository instance to be used for class loading
      */
     public static void setRepository( final org.apache.bcel.util.Repository rep ) {
@@ -53,7 +53,7 @@
     }
 
 
-    /** 
+    /**
      * Lookups class somewhere found on your CLASSPATH, or whereever the
      * repository instance looks for it.
      *
@@ -68,7 +68,7 @@
 
     /**
      * Tries to find class source using the internal repository instance.
-     * 
+     *
      * @see Class
      * @return JavaClass object for given runtime class
      * @throws ClassNotFoundException if the class could not be found or
@@ -97,7 +97,7 @@
     }
 
 
-    /** 
+    /**
      * Clears the repository.
      */
     public static void clearCache() {
diff --git a/src/main/java/org/apache/bcel/classfile/Attribute.java b/src/main/java/org/apache/bcel/classfile/Attribute.java
index e833c96..72e5c4e 100644
--- a/src/main/java/org/apache/bcel/classfile/Attribute.java
+++ b/src/main/java/org/apache/bcel/classfile/Attribute.java
@@ -49,7 +49,7 @@
 public abstract class Attribute implements Cloneable, Node {
 
     private static final boolean debug = Boolean.getBoolean(Attribute.class.getCanonicalName() + ".debug"); // Debugging on/off
-    
+
     private static final Map<String, Object> readers = new HashMap<>();
 
     /**
@@ -270,7 +270,7 @@
      */
     @Override
     public abstract void accept(Visitor v);
-    
+
     /**
      * Use copy() if you want to have a deep copy(), i.e., with all references
      * copied correctly.
diff --git a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
index 6ac696e..f421f66 100644
--- a/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
+++ b/src/main/java/org/apache/bcel/classfile/ConstantUtf8.java
@@ -40,18 +40,18 @@
  * <p>
  * Here is a sample Maven invocation with caching disabled:
  * </p>
- * 
+ *
  * <pre>
  * mvn test -Dbcel.statistics=true -Dbcel.maxcached.size=0 -Dbcel.maxcached=0
  * </pre>
  * <p>
  * Here is a sample Maven invocation with caching enabled:
  * </p>
- * 
+ *
  * <pre>
  * mvn test -Dbcel.statistics=true -Dbcel.maxcached.size=100000 -Dbcel.maxcached=5000000
  * </pre>
- * 
+ *
  * @see Constant
  */
 public final class ConstantUtf8 extends Constant {
@@ -105,7 +105,7 @@
 
     /**
      * Clears the cache.
-     * 
+     *
      * @since 6.4.0
      */
     public static synchronized void clearCache() {
@@ -122,7 +122,7 @@
      * <p>
      * See {@link ConstantUtf8} class Javadoc for details.
      * </p>
-     * 
+     *
      * @param value the value.
      * @return a new or cached instance of the given value.
      * @since 6.0
@@ -150,7 +150,7 @@
      * <p>
      * See {@link ConstantUtf8} class Javadoc for details.
      * </p>
-     * 
+     *
      * @param dataInput the value.
      * @return a new or cached instance of the given value.
      * @throws IOException if an I/O error occurs.
@@ -165,7 +165,7 @@
      * <p>
      * See {@link ConstantUtf8} class Javadoc for details.
      * </p>
-     * 
+     *
      * @param value the value.
      * @return a new or cached instance of the given value.
      * @since 6.0
@@ -187,7 +187,7 @@
 
     /**
      * Initializes from another object.
-     * 
+     *
      * @param constantUtf8 the value.
      */
     public ConstantUtf8(final ConstantUtf8 constantUtf8) {
diff --git a/src/main/java/org/apache/bcel/classfile/LocalVariable.java b/src/main/java/org/apache/bcel/classfile/LocalVariable.java
index f8100cf..7ad67e4 100644
--- a/src/main/java/org/apache/bcel/classfile/LocalVariable.java
+++ b/src/main/java/org/apache/bcel/classfile/LocalVariable.java
@@ -45,7 +45,7 @@
     // Technically, a decscriptor_index for a local variable table entry
     // and a signature_index for a local variable type table entry.
     private int signature_index; // Index of variable signature
-    private int index; /* Variable is `index'th local variable on
+    private int index; /* Variable is index'th local variable on
      * this method's frame.
      */
     private ConstantPool constant_pool;
@@ -53,18 +53,19 @@
 
 
     /**
-     * Initialize from another object. Note that both objects use the same
+     * Initializes from another LocalVariable. Note that both objects use the same
      * references (shallow copy). Use copy() for a physical copy.
+     *
+     * @param localVariable Another LocalVariable.
      */
-    public LocalVariable(final LocalVariable c) {
-        this(c.getStartPC(), c.getLength(), c.getNameIndex(), c.getSignatureIndex(), c.getIndex(),
-                c.getConstantPool());
-        this.orig_index = c.getOrigIndex();
+    public LocalVariable(final LocalVariable localVariable) {
+        this(localVariable.getStartPC(), localVariable.getLength(), localVariable.getNameIndex(),
+                localVariable.getSignatureIndex(), localVariable.getIndex(), localVariable.getConstantPool());
+        this.orig_index = localVariable.getOrigIndex();
     }
 
-
     /**
-     * Construct object from file stream.
+     * Constructs object from file stream.
      * @param file Input stream
      * @throws IOException
      */
@@ -129,20 +130,20 @@
 
 
     /**
-     * Dump local variable to file stream in binary format.
+     * Dumps local variable to file stream in binary format.
      *
-     * @param file Output file stream
-     * @throws IOException
+     * @param dataOutputStream Output file stream
+     * @exception IOException if an I/O error occurs.
+     * @see java.io.FilterOutputStream#out
      */
-    public void dump( final DataOutputStream file ) throws IOException {
-        file.writeShort(start_pc);
-        file.writeShort(length);
-        file.writeShort(name_index);
-        file.writeShort(signature_index);
-        file.writeShort(index);
+    public void dump(final DataOutputStream dataOutputStream) throws IOException {
+        dataOutputStream.writeShort(start_pc);
+        dataOutputStream.writeShort(length);
+        dataOutputStream.writeShort(name_index);
+        dataOutputStream.writeShort(signature_index);
+        dataOutputStream.writeShort(index);
     }
 
-
     /**
      * @return Constant pool used by this object.
      */
@@ -212,7 +213,7 @@
 
 
     /**
-     * @return Start of range where he variable is valid
+     * @return Start of range where the variable is valid
      */
     public int getStartPC() {
         return start_pc;
diff --git a/src/main/java/org/apache/bcel/classfile/Module.java b/src/main/java/org/apache/bcel/classfile/Module.java
index a0a9d62..7b1be3e 100644
--- a/src/main/java/org/apache/bcel/classfile/Module.java
+++ b/src/main/java/org/apache/bcel/classfile/Module.java
@@ -40,7 +40,7 @@
     private ModuleExports[] exports_table;
     private ModuleOpens[] opens_table;
     private final int uses_count;
-    private final int uses_index[];
+    private final int[] uses_index;
     private ModuleProvides[] provides_table;
 
     /**
@@ -191,7 +191,7 @@
         buf.append("Module:\n");
         buf.append("  name:    ") .append(cp.getConstantString(module_name_index, Const.CONSTANT_Module).replace('/', '.')).append("\n");
         buf.append("  flags:   ") .append(String.format("%04x", module_flags)).append("\n");
-        final String version = (module_version_index == 0 ? "0" : cp.getConstantString(module_version_index, Const.CONSTANT_Utf8));
+        final String version = module_version_index == 0 ? "0" : cp.getConstantString(module_version_index, Const.CONSTANT_Utf8);
         buf.append("  version: ") .append(version).append("\n");
 
         buf.append("  requires(").append(requires_table.length).append("):\n");
diff --git a/src/main/java/org/apache/bcel/classfile/ModuleExports.java b/src/main/java/org/apache/bcel/classfile/ModuleExports.java
index e654b86..ab10d07 100644
--- a/src/main/java/org/apache/bcel/classfile/ModuleExports.java
+++ b/src/main/java/org/apache/bcel/classfile/ModuleExports.java
@@ -35,7 +35,7 @@
     private final int exports_index;  // points to CONSTANT_Package_info
     private final int exports_flags;
     private final int exports_to_count;
-    private final int exports_to_index[];  // points to CONSTANT_Module_info
+    private final int[] exports_to_index;  // points to CONSTANT_Module_info
 
 
     /**
diff --git a/src/main/java/org/apache/bcel/classfile/ModuleOpens.java b/src/main/java/org/apache/bcel/classfile/ModuleOpens.java
index a4cf6da..2cbf22b 100644
--- a/src/main/java/org/apache/bcel/classfile/ModuleOpens.java
+++ b/src/main/java/org/apache/bcel/classfile/ModuleOpens.java
@@ -35,7 +35,7 @@
     private final int opens_index;  // points to CONSTANT_Package_info
     private final int opens_flags;
     private final int opens_to_count;
-    private final int opens_to_index[];  // points to CONSTANT_Module_info
+    private final int[] opens_to_index;  // points to CONSTANT_Module_info
 
 
     /**
diff --git a/src/main/java/org/apache/bcel/classfile/ModuleProvides.java b/src/main/java/org/apache/bcel/classfile/ModuleProvides.java
index 5996e6b..15f5621 100644
--- a/src/main/java/org/apache/bcel/classfile/ModuleProvides.java
+++ b/src/main/java/org/apache/bcel/classfile/ModuleProvides.java
@@ -34,7 +34,7 @@
 
     private final int provides_index;  // points to CONSTANT_Class_info
     private final int provides_with_count;
-    private final int provides_with_index[];  // points to CONSTANT_Class_info
+    private final int[] provides_with_index;  // points to CONSTANT_Class_info
 
 
     /**
diff --git a/src/main/java/org/apache/bcel/classfile/ModuleRequires.java b/src/main/java/org/apache/bcel/classfile/ModuleRequires.java
index 136a227..2d5d80b 100644
--- a/src/main/java/org/apache/bcel/classfile/ModuleRequires.java
+++ b/src/main/java/org/apache/bcel/classfile/ModuleRequires.java
@@ -94,7 +94,7 @@
         final String module_name = constant_pool.constantToString(requires_index, Const.CONSTANT_Module);
         buf.append(Utility.compactClassName(module_name, false));
         buf.append(", ").append(String.format("%04x", requires_flags));
-        final String version = (requires_version_index == 0 ? "0" : constant_pool.getConstantString(requires_version_index, Const.CONSTANT_Utf8));
+        final String version = requires_version_index == 0 ? "0" : constant_pool.getConstantString(requires_version_index, Const.CONSTANT_Utf8);
         buf.append(", ").append(version);
         return buf.toString();
     }
diff --git a/src/main/java/org/apache/bcel/classfile/Visitor.java b/src/main/java/org/apache/bcel/classfile/Visitor.java
index 0655c13..966b004 100644
--- a/src/main/java/org/apache/bcel/classfile/Visitor.java
+++ b/src/main/java/org/apache/bcel/classfile/Visitor.java
@@ -173,63 +173,63 @@
     /**
      * @since 6.4.0
      */
-    default void visitModule(Module constantModule) {
+    default void visitModule(final Module constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModuleRequires(ModuleRequires constantModule) {
-        // empty
-    }
-    
-    /**
-     * @since 6.4.0
-     */
-    default void visitModuleExports(ModuleExports constantModule) {
+    default void visitModuleRequires(final ModuleRequires constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModuleOpens(ModuleOpens constantModule) {
+    default void visitModuleExports(final ModuleExports constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModuleProvides(ModuleProvides constantModule) {
+    default void visitModuleOpens(final ModuleOpens constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModulePackages(ModulePackages constantModule) {
+    default void visitModuleProvides(final ModuleProvides constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitModuleMainClass(ModuleMainClass obj) {
+    default void visitModulePackages(final ModulePackages constantModule) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitNestHost(NestHost obj) {
+    default void visitModuleMainClass(final ModuleMainClass obj) {
         // empty
     }
 
     /**
      * @since 6.4.0
      */
-    default void visitNestMembers(NestMembers obj) {
+    default void visitNestHost(final NestHost obj) {
+        // empty
+    }
+
+    /**
+     * @since 6.4.0
+     */
+    default void visitNestMembers(final NestMembers obj) {
         // empty
     }
 }
diff --git a/src/main/java/org/apache/bcel/generic/InstructionComparator.java b/src/main/java/org/apache/bcel/generic/InstructionComparator.java
index 9cb7f0a..a31e55a 100644
--- a/src/main/java/org/apache/bcel/generic/InstructionComparator.java
+++ b/src/main/java/org/apache/bcel/generic/InstructionComparator.java
@@ -33,30 +33,26 @@
  */
 public interface InstructionComparator {
 
-    InstructionComparator DEFAULT = new InstructionComparator() {
-
-        @Override
-        public boolean equals( final Instruction i1, final Instruction i2 ) {
-            if (i1.getOpcode() == i2.getOpcode()) {
-                if (i1 instanceof BranchInstruction) {
-                 // BIs are never equal to make targeters work correctly (BCEL-195)
-                    return false;
+    InstructionComparator DEFAULT = (i1, i2) -> {
+        if (i1.getOpcode() == i2.getOpcode()) {
+            if (i1 instanceof BranchInstruction) {
+             // BIs are never equal to make targeters work correctly (BCEL-195)
+                return false;
 //                } else if (i1 == i2) { TODO consider adding this shortcut
 //                    return true; // this must be AFTER the BI test
-                } else if (i1 instanceof ConstantPushInstruction) {
-                    return ((ConstantPushInstruction) i1).getValue().equals(
-                            ((ConstantPushInstruction) i2).getValue());
-                } else if (i1 instanceof IndexedInstruction) {
-                    return ((IndexedInstruction) i1).getIndex() == ((IndexedInstruction) i2)
-                            .getIndex();
-                } else if (i1 instanceof NEWARRAY) {
-                    return ((NEWARRAY) i1).getTypecode() == ((NEWARRAY) i2).getTypecode();
-                } else {
-                    return true;
-                }
+            } else if (i1 instanceof ConstantPushInstruction) {
+                return ((ConstantPushInstruction) i1).getValue().equals(
+                        ((ConstantPushInstruction) i2).getValue());
+            } else if (i1 instanceof IndexedInstruction) {
+                return ((IndexedInstruction) i1).getIndex() == ((IndexedInstruction) i2)
+                        .getIndex();
+            } else if (i1 instanceof NEWARRAY) {
+                return ((NEWARRAY) i1).getTypecode() == ((NEWARRAY) i2).getTypecode();
+            } else {
+                return true;
             }
-            return false;
         }
+        return false;
     };
 
 
diff --git a/src/main/java/org/apache/bcel/generic/InstructionHandle.java b/src/main/java/org/apache/bcel/generic/InstructionHandle.java
index 323aa32..552e8a3 100644
--- a/src/main/java/org/apache/bcel/generic/InstructionHandle.java
+++ b/src/main/java/org/apache/bcel/generic/InstructionHandle.java
@@ -59,14 +59,14 @@
 
     /**
      * Does nothing.
-     * 
+     *
      * @deprecated Does nothing as of 6.3.1.
      */
     @Deprecated
     protected void addHandle() {
         // noop
     }
-    
+
     public final InstructionHandle getNext() {
         return next;
     }
diff --git a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java
index b7722af..d2316df 100644
--- a/src/main/java/org/apache/bcel/generic/LocalVariableGen.java
+++ b/src/main/java/org/apache/bcel/generic/LocalVariableGen.java
@@ -21,7 +21,7 @@
 import org.apache.bcel.classfile.LocalVariable;
 
 /**
- * This class represents a local variable within a method. It contains its
+ * Represents a local variable within a method. It contains its
  * scope, name and type. The generated LocalVariable object can be obtained
  * with getLocalVariable which needs the instruction list and the constant
  * pool as parameters.
@@ -66,7 +66,7 @@
 
 
     /**
-     * Generate a local variable that with index `index'. Note that double and long
+     * Generates a local variable that with index `index'. Note that double and long
      * variables need two indexs. Index indices have to be provided by the user.
      *
      * @param index index of local variable
@@ -84,7 +84,7 @@
 
 
     /**
-     * Get LocalVariable object.
+     * Gets LocalVariable object.
      *
      * This relies on that the instruction list has already been dumped to byte code or
      * or that the `setPositions' methods has been called for the instruction list.
diff --git a/src/main/java/org/apache/bcel/generic/MethodGen.java b/src/main/java/org/apache/bcel/generic/MethodGen.java
index 48d0776..b0743e3 100644
--- a/src/main/java/org/apache/bcel/generic/MethodGen.java
+++ b/src/main/java/org/apache/bcel/generic/MethodGen.java
@@ -23,7 +23,6 @@
 import java.util.Stack;
 import java.util.Hashtable;
 import java.util.Arrays;
-import java.util.Comparator;
 
 import org.apache.bcel.Const;
 import org.apache.bcel.classfile.AnnotationEntry;
@@ -358,12 +357,7 @@
             }
         }
         if (size > 1) {
-            Arrays.sort(lg, new Comparator<LocalVariableGen>() {
-                @Override
-                public int compare(final LocalVariableGen o1, final LocalVariableGen o2) {
-                    return o1.getIndex() - o2.getIndex();
-                }
-            });
+            Arrays.sort(lg, (o1, o2) -> o1.getIndex() - o2.getIndex());
         }
         return lg;
     }
diff --git a/src/main/java/org/apache/bcel/util/ClassPath.java b/src/main/java/org/apache/bcel/util/ClassPath.java
index 7ac79fd..a9954c1 100644
--- a/src/main/java/org/apache/bcel/util/ClassPath.java
+++ b/src/main/java/org/apache/bcel/util/ClassPath.java
@@ -430,22 +430,14 @@
 
     }
 
-    private static final FilenameFilter ARCHIVE_FILTER = new FilenameFilter() {
-
-        @Override
-        public boolean accept(final File dir, String name) {
-            name = name.toLowerCase(Locale.ENGLISH);
-            return name.endsWith(".zip") || name.endsWith(".jar");
-        }
+    private static final FilenameFilter ARCHIVE_FILTER = (dir, name) -> {
+        name = name.toLowerCase(Locale.ENGLISH);
+        return name.endsWith(".zip") || name.endsWith(".jar");
     };
 
-    private static final FilenameFilter MODULES_FILTER = new FilenameFilter() {
-
-        @Override
-        public boolean accept(final File dir, String name) {
-            name = name.toLowerCase(Locale.ENGLISH);
-            return name.endsWith(".jmod");
-        }
+    private static final FilenameFilter MODULES_FILTER = (dir, name) -> {
+        name = name.toLowerCase(Locale.ENGLISH);
+        return name.endsWith(".jmod");
     };
 
     public static final ClassPath SYSTEM_CLASS_PATH = new ClassPath(getClassPath());
diff --git a/src/main/java/org/apache/bcel/util/LruCacheClassPathRepository.java b/src/main/java/org/apache/bcel/util/LruCacheClassPathRepository.java
index 4b5f099..157a0e7 100644
--- a/src/main/java/org/apache/bcel/util/LruCacheClassPathRepository.java
+++ b/src/main/java/org/apache/bcel/util/LruCacheClassPathRepository.java
@@ -29,7 +29,7 @@
  * This repository supports a class path consisting of too many JAR files to handle in {@link ClassPathRepository} or
  * {@link MemorySensitiveClassPathRepository} without causing {@code OutOfMemoryError}.
  * </p>
- * 
+ *
  * @since 6.4.0
  */
 public class LruCacheClassPathRepository extends AbstractClassPathRepository {
diff --git a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java
index 3d6b036..1baf276 100644
--- a/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java
+++ b/src/main/java/org/apache/bcel/verifier/VerifierAppFrame.java
@@ -126,13 +126,7 @@
         jScrollPane1.getViewport().setBackground(Color.red);
         messagesScrollPane.getViewport().setBackground(Color.red);
         messagesScrollPane.setPreferredSize(new Dimension(10, 10));
-        classNamesJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
-
-            @Override
-            public void valueChanged( final ListSelectionEvent e ) {
-                classNamesJList_valueChanged(e);
-            }
-        });
+        classNamesJList.addListSelectionListener(e -> classNamesJList_valueChanged(e));
         classNamesJList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
         jScrollPane3.setBorder(BorderFactory.createLineBorder(Color.black));
         jScrollPane3.setPreferredSize(new Dimension(100, 100));
@@ -151,46 +145,16 @@
         newFileMenuItem.setText("New...");
         newFileMenuItem.setAccelerator(javax.swing.KeyStroke.getKeyStroke(78,
                 InputEvent.CTRL_MASK, true));
-        newFileMenuItem.addActionListener(new java.awt.event.ActionListener() {
-
-            @Override
-            public void actionPerformed( final ActionEvent e ) {
-                newFileMenuItem_actionPerformed(e);
-            }
-        });
+        newFileMenuItem.addActionListener(e -> newFileMenuItem_actionPerformed(e));
         pass3aTextPane.setEditable(false);
         pass3bTextPane.setEditable(false);
-        pass3aJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
-
-            @Override
-            public void valueChanged( final ListSelectionEvent e ) {
-                pass3aJList_valueChanged(e);
-            }
-        });
-        pass3bJList.addListSelectionListener(new javax.swing.event.ListSelectionListener() {
-
-            @Override
-            public void valueChanged( final ListSelectionEvent e ) {
-                pass3bJList_valueChanged(e);
-            }
-        });
+        pass3aJList.addListSelectionListener(e -> pass3aJList_valueChanged(e));
+        pass3bJList.addListSelectionListener(e -> pass3bJList_valueChanged(e));
         jMenu2.setText("Help");
         whatisMenuItem.setText("What is...");
-        whatisMenuItem.addActionListener(new java.awt.event.ActionListener() {
-
-            @Override
-            public void actionPerformed( final ActionEvent e ) {
-                whatisMenuItem_actionPerformed(e);
-            }
-        });
+        whatisMenuItem.addActionListener(e -> whatisMenuItem_actionPerformed(e));
         aboutMenuItem.setText("About");
-        aboutMenuItem.addActionListener(new java.awt.event.ActionListener() {
-
-            @Override
-            public void actionPerformed( final ActionEvent e ) {
-                aboutMenuItem_actionPerformed(e);
-            }
-        });
+        aboutMenuItem.addActionListener(e -> aboutMenuItem_actionPerformed(e));
         jSplitPane2.add(messagesPanel, JSplitPane.BOTTOM);
         messagesPanel.add(messagesScrollPane, null);
         messagesScrollPane.getViewport().add(messagesTextPane, null);
diff --git a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java
index 0c145a4..1874e51 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/DOUBLE_Upper.java
@@ -34,7 +34,11 @@
         super(Const.T_UNKNOWN, "Double_Upper");
     }
 
-    /** Use this method to get the single instance of this class. */
+    /**
+     * Gets the single instance of this class.
+     *
+     * @return the single instance of this class.
+     */
     public static DOUBLE_Upper theInstance() {
         return singleton;
     }
diff --git a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java
index 788b2b5..b0a27b2 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/LONG_Upper.java
@@ -34,7 +34,11 @@
         super(Const.T_UNKNOWN, "Long_Upper");
     }
 
-    /** Use this method to get the single instance of this class. */
+    /**
+     * Gets the single instance of this class.
+     *
+     * @return the single instance of this class.
+     */
     public static LONG_Upper theInstance() {
         return singleton;
     }
diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java
index 9779cc8..3db76d6 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariableInfo.java
@@ -28,12 +28,12 @@
  * the name and the type of a local variable in
  * a given slot (== index). This information
  * often changes in course of byte code offsets.
- *
  */
 public class LocalVariableInfo{
 
     /** The types database. KEY: String representing the offset integer. */
     private final Hashtable<String, Type> types = new Hashtable<>();
+
     /** The names database. KEY: String representing the offset integer. */
     private final Hashtable<String, String> names = new Hashtable<>();
 
@@ -44,6 +44,7 @@
     private void setName(final int offset, final String name) {
         names.put(Integer.toString(offset), name);
     }
+
     /**
      * Adds a type of a local variable and a certain slot to our 'types'
      * (Hashtable) database.
@@ -53,54 +54,64 @@
     }
 
     /**
-     * Returns the type of the local variable that uses this local
-     * variable slot at the given bytecode offset.
-     * Care for legal bytecode offsets yourself, otherwise the return value
-     * might be wrong.
-     * May return 'null' if nothing is known about the type of this local
-     * variable slot at the given bytecode offset.
+     * Returns the type of the local variable that uses this local variable slot at the given bytecode offset. Care for
+     * legal bytecode offsets yourself, otherwise the return value might be wrong. May return 'null' if nothing is known
+     * about the type of this local variable slot at the given bytecode offset.
+     *
+     * @param offset bytecode offset.
+     * @return the type of the local variable that uses this local variable slot at the given bytecode offset.
      */
     public Type getType(final int offset) {
         return types.get(Integer.toString(offset));
     }
+
     /**
-     * Returns the name of the local variable that uses this local
-     * variable slot at the given bytecode offset.
-     * Care for legal bytecode offsets yourself, otherwise the return value
-     * might be wrong.
-     * May return 'null' if nothing is known about the type of this local
-     * variable slot at the given bytecode offset.
+     * Returns the name of the local variable that uses this local variable slot at the given bytecode offset. Care for
+     * legal bytecode offsets yourself, otherwise the return value might be wrong. May return 'null' if nothing is known
+     * about the type of this local variable slot at the given bytecode offset.
+     *
+     * @param offset bytecode offset.
+     * @return the name of the local variable that uses this local variable slot at the given bytecode offset.
      */
     public String getName(final int offset) {
         return names.get(Integer.toString(offset));
     }
+
     /**
      * Adds some information about this local variable (slot).
+     *
+     * @param name variable name
+     * @param startPc Range in which the variable is valid.
+     * @param length length of ...
+     * @param type variable type
+     *
      * @throws LocalVariableInfoInconsistentException if the new information conflicts
      *         with already gathered information.
      */
-    public void add(final String name, final int startpc, final int length, final Type t) throws LocalVariableInfoInconsistentException{
-        for (int i=startpc; i<=startpc+length; i++) { // incl/incl-notation!
-            add(i,name,t);
+    public void add(final String name, final int startPc, final int length, final Type type)
+            throws LocalVariableInfoInconsistentException {
+        for (int i = startPc; i <= startPc + length; i++) { // incl/incl-notation!
+            add(i, name, type);
         }
     }
 
     /**
      * Adds information about name and type for a given offset.
+     *
      * @throws LocalVariableInfoInconsistentException if the new information conflicts
      *         with already gathered information.
      */
-    private void add(final int offset, final String name, final Type t) throws LocalVariableInfoInconsistentException{
+    private void add(final int offset, final String name, final Type t) throws LocalVariableInfoInconsistentException {
         if (getName(offset) != null) {
-            if (! getName(offset).equals(name)) {
-                throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+
-                    "' a local variable has two different names: '"+getName(offset)+"' and '"+name+"'.");
+            if (!getName(offset).equals(name)) {
+                throw new LocalVariableInfoInconsistentException("At bytecode offset '" + offset
+                        + "' a local variable has two different names: '" + getName(offset) + "' and '" + name + "'.");
             }
         }
         if (getType(offset) != null) {
-            if (! getType(offset).equals(t)) {
-                throw new LocalVariableInfoInconsistentException("At bytecode offset '"+offset+
-                    "' a local variable has two different types: '"+getType(offset)+"' and '"+t+"'.");
+            if (!getType(offset).equals(t)) {
+                throw new LocalVariableInfoInconsistentException("At bytecode offset '" + offset
+                        + "' a local variable has two different types: '" + getType(offset) + "' and '" + t + "'.");
             }
         }
         setName(offset, name);
diff --git a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java
index 14479e7..069efa6 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/LocalVariablesInfo.java
@@ -26,7 +26,6 @@
  * A utility class holding the information about
  * the names and the types of the local variables in
  * a given method.
- *
  */
 public class LocalVariablesInfo{
 
@@ -41,7 +40,12 @@
         }
     }
 
-    /** Returns the LocalVariableInfo for the given slot. */
+    /**
+     * Returns the LocalVariableInfo for the given slot.
+     *
+     * @param slot Slot to query.
+     * @return The LocalVariableInfo for the given slot.
+     */
     public LocalVariableInfo getLocalVariableInfo(final int slot) {
         if (slot < 0 || slot >= localVariableInfos.length) {
             throw new AssertionViolatedException("Slot number for local variable information out of range.");
@@ -52,22 +56,27 @@
     /**
      * Adds information about the local variable in slot 'slot'. Automatically
      * adds information for slot+1 if 't' is Type.LONG or Type.DOUBLE.
+     *
+     * @param name variable name
+     * @param startPc Range in which the variable is valid.
+     * @param length length of ...
+     * @param type variable type
      * @throws LocalVariableInfoInconsistentException if the new information conflicts
      *         with already gathered information.
      */
-    public void add(final int slot, final String name, final int startpc, final int length, final Type t) throws LocalVariableInfoInconsistentException{
+    public void add(final int slot, final String name, final int startPc, final int length, final Type type) throws LocalVariableInfoInconsistentException{
         // The add operation on LocalVariableInfo may throw the '...Inconsistent...' exception, we don't throw it explicitely here.
 
         if (slot < 0 || slot >= localVariableInfos.length) {
             throw new AssertionViolatedException("Slot number for local variable information out of range.");
         }
 
-        localVariableInfos[slot].add(name, startpc, length, t);
-        if (t == Type.LONG) {
-            localVariableInfos[slot+1].add(name, startpc, length, LONG_Upper.theInstance());
+        localVariableInfos[slot].add(name, startPc, length, type);
+        if (type == Type.LONG) {
+            localVariableInfos[slot+1].add(name, startPc, length, LONG_Upper.theInstance());
         }
-        if (t == Type.DOUBLE) {
-            localVariableInfos[slot+1].add(name, startpc, length, DOUBLE_Upper.theInstance());
+        if (type == Type.DOUBLE) {
+            localVariableInfos[slot+1].add(name, startPc, length, DOUBLE_Upper.theInstance());
         }
     }
 }
diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java
index c7e52c1..fe79b22 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/Pass2Verifier.java
@@ -1541,13 +1541,17 @@
             cp = jc.getConstantPool();
             (new DescendingVisitor(jc, this)).visit();
         }
+
         /**
          * Returns if the JavaClass this InnerClassDetector is working on
          * has an Inner Class reference in its constant pool.
+         *
+         * @return Whether this InnerClassDetector is working on has an Inner Class reference in its constant pool.
          */
         public boolean innerClassReferenced() {
             return hasInnerClass;
         }
+
         /** This method casually visits ConstantClass references. */
         @Override
         public void visitConstantClass(final ConstantClass obj) {
diff --git a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
index 70ec589..af6f037 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/Pass3aVerifier.java
@@ -126,6 +126,7 @@
      * It's here for performance reasons by do_verify() and its callees.
      */
     private InstructionList instructionList;
+
     /**
      * The one and only Code object used by an instance of this class.
      *  It's here for performance reasons by do_verify() and its callees.
diff --git a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java
index 997bcb7..6081759 100644
--- a/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java
+++ b/src/main/java/org/apache/bcel/verifier/statics/StringRepresentation.java
@@ -88,6 +88,7 @@
     /**
      * Creates a new StringRepresentation object which is the representation of n.
      *
+     * @param n The node to represent.
      * @see #toString()
      */
     public StringRepresentation(final Node n) {
diff --git a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java
index fd3b237..88dac52 100644
--- a/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java
+++ b/src/main/java/org/apache/bcel/verifier/structurals/LocalVariables.java
@@ -26,18 +26,20 @@
 /**
  * This class implements an array of local variables used for symbolic JVM
  * simulation.
- *
  */
 public class LocalVariables implements Cloneable {
+
     /** The Type[] containing the local variable slots. */
     private final Type[] locals;
 
     /**
      * Creates a new LocalVariables object.
+     *
+     * @param localVariableCount local variable count.
      */
-    public LocalVariables(final int maxLocals) {
-        locals = new Type[maxLocals];
-        for (int i=0; i<maxLocals; i++) {
+    public LocalVariables(final int localVariableCount) {
+        locals = new Type[localVariableCount];
+        for (int i=0; i<localVariableCount; i++) {
             locals[i] = Type.UNKNOWN;
         }
     }
@@ -57,23 +59,29 @@
     }
 
     /**
-     * Returns the type of the local variable slot i.
+     * Returns the type of the local variable slot index.
+     *
+     * @param slotIndex Slot to look up.
+     * @return the type of the local variable slot index.
      */
-    public Type get(final int i) {
-        return locals[i];
+    public Type get(final int slotIndex) {
+        return locals[slotIndex];
     }
 
     /**
      * Returns a (correctly typed) clone of this object.
      * This is equivalent to ((LocalVariables) this.clone()).
+     *
+     * @return a (correctly typed) clone of this object.
      */
     public LocalVariables getClone() {
         return (LocalVariables) this.clone();
     }
 
     /**
-     * Returns the number of local variable slots this
-     * LocalVariables instance has.
+     * Returns the number of local variable slots.
+     *
+     * @return the number of local variable slots.
      */
     public int maxLocals() {
         return locals.length;
@@ -81,12 +89,15 @@
 
     /**
      * Sets a new Type for the given local variable slot.
+     *
+     * @param slotIndex Target slot index.
+     * @param type Type to save at the given slot index.
      */
-    public void set(final int i, final Type type) { // TODO could be package-protected?
+    public void set(final int slotIndex, final Type type) { // TODO could be package-protected?
         if (type == Type.BYTE || type == Type.SHORT || type == Type.BOOLEAN || type == Type.CHAR) {
             throw new AssertionViolatedException("LocalVariables do not know about '"+type+"'. Use Type.INT instead.");
         }
-        locals[i] = type;
+        locals[slotIndex] = type;
     }
 
     /** @return a hash code value for the object.
@@ -118,15 +129,17 @@
     /**
      * Merges two local variables sets as described in the Java Virtual Machine Specification,
      * Second Edition, section 4.9.2, page 146.
+     *
+     * @param localVariable other local variable.
      */
-    public void merge(final LocalVariables lv) {
+    public void merge(final LocalVariables localVariable) {
 
-        if (this.locals.length != lv.locals.length) {
+        if (this.locals.length != localVariable.locals.length) {
             throw new AssertionViolatedException("Merging LocalVariables of different size?!? From different methods or what?!?");
         }
 
         for (int i=0; i<locals.length; i++) {
-            merge(lv, i);
+            merge(localVariable, i);
         }
     }
 
@@ -204,13 +217,15 @@
     }
 
     /**
-     * Replaces all occurences of u in this local variables set
+     * Replaces all occurrences of {@code uninitializedObjectType} in this local variables set
      * with an "initialized" ObjectType.
+     *
+     * @param uninitializedObjectType the object to match.
      */
-    public void initializeObject(final UninitializedObjectType u) {
+    public void initializeObject(final UninitializedObjectType uninitializedObjectType) {
         for (int i=0; i<locals.length; i++) {
-            if (locals[i] == u) {
-                locals[i] = u.getInitialized();
+            if (locals[i] == uninitializedObjectType) {
+                locals[i] = uninitializedObjectType.getInitialized();
             }
         }
     }
diff --git a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java
index 5fea235..ea60415 100644
--- a/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java
+++ b/src/main/java/org/apache/bcel/verifier/structurals/Subroutine.java
@@ -17,72 +17,74 @@
  */
 package org.apache.bcel.verifier.structurals;
 
-
 import org.apache.bcel.generic.InstructionHandle;
 
 /**
- * This interface defines properties of JVM bytecode subroutines.
- * Note that it is 'abused' to maintain the top-level code in a
- * consistent fashion, too.
- *
+ * This interface defines properties of JVM bytecode subroutines. Note that it is 'abused' to maintain the top-level
+ * code in a consistent fashion, too.
  */
-public interface Subroutine{
+public interface Subroutine {
+
     /**
-     * Returns all the JsrInstructions that have the
-     * first instruction of this subroutine as their target.
-     * <B>Must not be invoked on the 'top-level subroutine'.</B>
+     * Returns all the JsrInstructions that have the first instruction of this subroutine as their target. <B>Must not
+     * be invoked on the 'top-level subroutine'.</B>
+     *
+     * @return The JsrInstructions that have the first instruction of this subroutine as their target.
      */
     InstructionHandle[] getEnteringJsrInstructions();
 
     /**
-     * Returns the one and only RET that leaves the subroutine.
-     * Note that JustIce has a pretty rigid notion of a subroutine.
-     * <B>Must not be invoked on the 'top-level subroutine'.</B>
+     * Returns the one and only RET that leaves the subroutine. Note that JustIce has a pretty rigid notion of a
+     * subroutine. <B>Must not be invoked on the 'top-level subroutine'.</B>
+     *
+     * @return The one and only RET that leaves the subroutine.
      *
      * @see Subroutines
      */
     InstructionHandle getLeavingRET();
 
     /**
-     * Returns all instructions that together form this subroutine.
-     * Note that an instruction is part of exactly one subroutine
-     * (the top-level code is considered to be a special subroutine) -
-     * else it is not reachable at all (dead code).
+     * Returns all instructions that together form this subroutine. Note that an instruction is part of exactly one
+     * subroutine (the top-level code is considered to be a special subroutine) - else it is not reachable at all (dead
+     * code).
+     *
+     * @return All instructions that together form this subroutine.
      */
     InstructionHandle[] getInstructions();
 
     /**
-     * Returns if the given InstructionHandle refers to an instruction
-     * that is part of this subroutine. This is a convenience method
-     * that saves iteration over the InstructionHandle objects returned
-     * by getInstructions().
+     * Returns if the given InstructionHandle refers to an instruction that is part of this subroutine. This is a
+     * convenience method that saves iteration over the InstructionHandle objects returned by getInstructions().
+     *
+     * @param inst The InstructionHandle to test.
+     * @return Whether the given InstructionHandle refers to an instruction that is part of this subroutine.
      *
      * @see #getInstructions()
      */
     boolean contains(InstructionHandle inst);
 
     /**
-     * Returns an int[] containing the indices of the local variable slots
-     * accessed by this Subroutine (read-accessed, write-accessed or both);
-     * local variables referenced by subroutines of this subroutine are
-     * not included.
+     * Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed,
+     * write-accessed or both); local variables referenced by subroutines of this subroutine are not included.
      *
+     * @return An int[] containing the indices of the local variable slots.
      * @see #getRecursivelyAccessedLocalsIndices()
      */
     int[] getAccessedLocalsIndices();
 
     /**
-     * Returns an int[] containing the indices of the local variable slots
-     * accessed by this Subroutine (read-accessed, write-accessed or both);
-     * local variables referenced by subroutines of this subroutine are
-     * included.
+     * Returns an int[] containing the indices of the local variable slots accessed by this Subroutine (read-accessed,
+     * write-accessed or both); local variables referenced by subroutines of this subroutine are included.
      *
+     * @return An int[] containing the indices of the local variable slots.
      * @see #getAccessedLocalsIndices()
      */
     int[] getRecursivelyAccessedLocalsIndices();
 
     /**
      * Returns the subroutines that are directly called from this subroutine.
+     *
+     * @return The subroutines that are directly called from this subroutine.
      */
     Subroutine[] subSubs();
 }
diff --git a/src/test/java/org/apache/bcel/LocalVariableTypeTableTestCase.java b/src/test/java/org/apache/bcel/LocalVariableTypeTableTestCase.java
index c55d79b..b9569c1 100644
--- a/src/test/java/org/apache/bcel/LocalVariableTypeTableTestCase.java
+++ b/src/test/java/org/apache/bcel/LocalVariableTypeTableTestCase.java
@@ -17,6 +17,10 @@
  */
 package org.apache.bcel;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.LinkedList;
+import java.util.List;
+
 import org.apache.bcel.classfile.JavaClass;
 import org.apache.bcel.classfile.Method;
 import org.apache.bcel.generic.ACONST_NULL;
@@ -31,13 +35,10 @@
 import org.apache.bcel.generic.Type;
 import org.junit.Test;
 
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
-import java.util.LinkedList;
-import java.util.List;
-
 public class LocalVariableTypeTableTestCase extends AbstractTestCase {
+    
     public class TestClassLoader extends ClassLoader {
+        
         public TestClassLoader(final ClassLoader parent) {
             super(parent);
         }
@@ -48,10 +49,10 @@
     }
 
     @Test
-    public void testWithGenericArguement() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, IOException {
+    public void testWithGenericArguement() throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
         final String targetClass = PACKAGE_BASE_NAME + ".data.SimpleClassHasMethodIncludeGenericArgument";
         final TestClassLoader loader = new TestClassLoader(getClass().getClassLoader());
-        final Class cls = loader.findClass(targetClass, getBytesFromClass(targetClass));
+        final Class<?> cls = loader.findClass(targetClass, getBytesFromClass(targetClass));
 
         java.lang.reflect.Method method = cls.getDeclaredMethod("a", String.class, List.class);
         method.invoke(null, "a1", new LinkedList<String>());
@@ -63,7 +64,7 @@
         method.invoke(null, new LinkedList<String>(), "d2");
     }
 
-    private byte[] getBytesFromClass(final String className) throws ClassNotFoundException, IOException {
+    private byte[] getBytesFromClass(final String className) throws ClassNotFoundException {
         final JavaClass clazz = getTestClass(className);
         final ConstantPoolGen cp = new ConstantPoolGen(clazz.getConstantPool());
 
diff --git a/src/test/java/org/apache/bcel/PerformanceTest.java b/src/test/java/org/apache/bcel/PerformanceTest.java
index 66fa8b2..4ae2ace 100644
--- a/src/test/java/org/apache/bcel/PerformanceTest.java
+++ b/src/test/java/org/apache/bcel/PerformanceTest.java
@@ -133,19 +133,15 @@
 
     public void testPerformance() {
         final File javaLib = new File(System.getProperty("java.home"), "lib");
-        javaLib.listFiles(new FileFilter() {
-
-            @Override
-            public boolean accept(final File file) {
-                if(file.getName().endsWith(".jar")) {
-                    try {
-                        test(file);
-                    } catch (final IOException e) {
-                        Assert.fail(e.getMessage());
-                    }
+        javaLib.listFiles((FileFilter) file -> {
+            if(file.getName().endsWith(".jar")) {
+                try {
+                    test(file);
+                } catch (final IOException e) {
+                    Assert.fail(e.getMessage());
                 }
-                return false;
             }
+            return false;
         });
     }
 
diff --git a/src/test/java/org/apache/bcel/classfile/ConstantPoolTestCase.java b/src/test/java/org/apache/bcel/classfile/ConstantPoolTestCase.java
index 028f369..2cc10af 100644
--- a/src/test/java/org/apache/bcel/classfile/ConstantPoolTestCase.java
+++ b/src/test/java/org/apache/bcel/classfile/ConstantPoolTestCase.java
@@ -26,7 +26,7 @@
 import org.junit.Test;
 
 public class ConstantPoolTestCase extends AbstractTestCase {
-    
+
     @Test
     public void testConstantToString() throws ClassNotFoundException {
         final JavaClass clazz = getTestClass(PACKAGE_BASE_NAME + ".data.SimpleClassWithDefaultConstructor");
diff --git a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java
index 9bf530e..b16c8e2 100644
--- a/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java
+++ b/src/test/java/org/apache/bcel/classfile/JDKClassDumpTestCase.java
@@ -40,19 +40,15 @@
     @Test
     public void testPerformance() throws Exception {
         final File javaLib = new File(System.getProperty("java.home") + "/lib");
-        javaLib.listFiles(new FileFilter() {
-
-            @Override
-            public boolean accept(final File file) {
-                if (file.getName().endsWith(".jar")) {
-                    try {
-                        testJar(file);
-                    } catch (final Exception e) {
-                        Assert.fail(e.getMessage());
-                    }
+        javaLib.listFiles((FileFilter) file -> {
+            if (file.getName().endsWith(".jar")) {
+                try {
+                    testJar(file);
+                } catch (final Exception e) {
+                    Assert.fail(e.getMessage());
                 }
-                return false;
             }
+            return false;
         });
     }
 
diff --git a/src/test/java/org/apache/bcel/generic/JdkGenericDumpTestCase.java b/src/test/java/org/apache/bcel/generic/JdkGenericDumpTestCase.java
index fdf1375..d891741 100644
--- a/src/test/java/org/apache/bcel/generic/JdkGenericDumpTestCase.java
+++ b/src/test/java/org/apache/bcel/generic/JdkGenericDumpTestCase.java
@@ -68,7 +68,7 @@
  * <p>
  * For example:
  * </p>
- * 
+ *
  * <pre>
  * mvn test -Dtest=JdkGenericDumpTestCase -DExtraJavaHomes="C:\Program Files\Java\openjdk\jdk-13;C:\Program Files\Java\openjdk\jdk-14"
  * </pre>
@@ -225,22 +225,12 @@
 
     private File[] listJdkJars() throws Exception {
         final File javaLib = new File(javaHome, "lib");
-        return javaLib.listFiles(new FileFilter() {
-            @Override
-            public boolean accept(final File file) {
-                return file.getName().endsWith(".jar");
-            }
-        });
+        return javaLib.listFiles((FileFilter) file -> file.getName().endsWith(".jar"));
     }
 
     private File[] listJdkModules() throws Exception {
         final File javaLib = new File(javaHome, "jmods");
-        return javaLib.listFiles(new FileFilter() {
-            @Override
-            public boolean accept(final File file) {
-                return file.getName().endsWith(".jmod");
-            }
-        });
+        return javaLib.listFiles((FileFilter) file -> file.getName().endsWith(".jmod"));
     }
 
     private void testJar(final File file) throws Exception {
