diff --git a/poi/build.gradle b/poi/build.gradle
index 4ff4342..e6ee6bd 100644
--- a/poi/build.gradle
+++ b/poi/build.gradle
@@ -31,6 +31,7 @@
 
 configurations {
     tests
+    javadocs
 }
 
 sourceSets {
@@ -59,6 +60,9 @@
 
     testImplementation "org.junit.jupiter:junit-jupiter-api:${junitVersion}"
     testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:${junitVersion}"
+
+    javadocs project(':poi-ooxml')
+    javadocs project(':poi-scratchpad')
 }
 
 final String MODULE_NAME = 'org.apache.poi.poi'
@@ -201,11 +205,20 @@
 }
 
 javadoc {
-//    fails currently, need to fix the sources
-    failOnError = false
-//    if(JavaVersion.current().isJava9Compatible()) {
-//        options.addBooleanOption('html5', true)
-//    }
+    failOnError = true
+    doFirst {
+        options {
+            if (JavaVersion.current().isJava9Compatible()) {
+                addBooleanOption('html5', true)
+            }
+            links 'https://poi.apache.org/apidocs/dev/'
+            links 'https://docs.oracle.com/javase/8/docs/api/'
+            use = true
+            splitIndex = true
+            source = "1.8"
+            classpath += configurations.javadocs.files
+        }
+    }
 }
 
 artifacts {
diff --git a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFDataFormat.java b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFDataFormat.java
index 09284dc..e9a68aa 100644
--- a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFDataFormat.java
+++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFDataFormat.java
@@ -34,10 +34,8 @@
  * <b>International Formats</b><br>
  * Since version 2003 Excel has supported international formats.  These are denoted
  * with a prefix "[$-xxx]" (where xxx is a 1-7 digit hexadecimal number).
- * See the Microsoft article
- * <a href="http://office.microsoft.com/assistance/hfws.aspx?AssetID=HA010346351033&CTT=6&Origin=EC010272491033">
- *   Creating international number formats
- * </a> for more details on these codes.
+ *
+ * @see <a href="https://support.microsoft.com/en-us/office/review-guidelines-for-customizing-a-number-format-c0a1d1fa-d3f4-4018-96b7-9c9354dd99f5">Review guidelines for customizing a number format</a>
  */
 public final class HSSFDataFormat implements DataFormat {
 	private static final String[] _builtinFormats = BuiltinFormats.getAll();
@@ -107,7 +105,7 @@
 			}
 			_movedBuiltins = true;
 		}
-		
+
 		// See if we can find it
 		for(int i=0; i<_formats.size(); i++) {
 		   if(format.equals(_formats.get(i))) {
@@ -168,7 +166,7 @@
 	public static int getNumberOfBuiltinBuiltinFormats() {
 		return _builtinFormats.length;
 	}
-	
+
 	/**
 	 * Ensures that the formats list can hold entries
 	 *  up to and including the entry with this index
diff --git a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFRow.java b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFRow.java
index 0ecc946..eb1be9c 100644
--- a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFRow.java
+++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFRow.java
@@ -106,7 +106,7 @@
      * @param column - the column number this cell represents
      *
      * @return HSSFCell a high level representation of the created cell.
-     * @throws IllegalArgumentException if columnIndex < 0 or greater than 255,
+     * @throws IllegalArgumentException if columnIndex &lt; 0 or greater than 255,
      *   the maximum number of columns supported by the Excel binary format (.xls)
      */
     @Override
@@ -126,7 +126,7 @@
      * @param columnIndex - the column number this cell represents
      *
      * @return HSSFCell a high level representation of the created cell.
-     * @throws IllegalArgumentException if columnIndex < 0 or greater than 255,
+     * @throws IllegalArgumentException if columnIndex &lt; 0 or greater than 255,
      *   the maximum number of columns supported by the Excel binary format (.xls)
      */
     @Override
diff --git a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
index 9754190..b37f546 100644
--- a/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
+++ b/poi/src/main/java/org/apache/poi/hssf/usermodel/HSSFSheet.java
@@ -1748,7 +1748,7 @@
 
     /**
      * Shifts columns in range [startColumn, endColumn] for n places to the right.
-     * For n < 0, it will shift columns left.
+     * For n &lt; 0, it will shift columns left.
      * Additionally adjusts formulas.
      * Probably should also process other features (hyperlinks, comments...) in the way analog to shiftRows method
      * @param startColumn   the column to start shifting
diff --git a/poi/src/main/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java b/poi/src/main/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java
index 1db851e..9fdd4e8 100644
--- a/poi/src/main/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java
+++ b/poi/src/main/java/org/apache/poi/poifs/filesystem/POIFSDocumentPath.java
@@ -54,9 +54,10 @@
      * @param components the Strings making up the path to a document.
      *      The Strings must be ordered as they appear in the directory hierarchy of the the document.
      *      The first string must be the name of a directory in the root of the POIFSFileSystem, and
-     *      every Nth (for N > 1) string thereafter must be the name of a directory in the directory
-     *      identified by the (N-1)th string. <p> If the components parameter is null or has zero length,
-     *      the POIFSDocumentPath is appropriate for a document that is in the root of a POIFSFileSystem
+     *      every Nth (for N &gt; 1) string thereafter must be the name of a directory in the directory
+     *      identified by the (N-1)th string.<p>
+     *      If the components parameter is null or has zero length, the POIFSDocumentPath is appropriate
+     *      for a document that is in the root of a POIFSFileSystem
      *
      * @exception IllegalArgumentException
      *      if any of the elements in the components parameter are null or have zero length
@@ -133,7 +134,7 @@
      *
      * @return the nth component;
      *
-     * @exception ArrayIndexOutOfBoundsException if n &lt; 0 or n >= length()
+     * @exception ArrayIndexOutOfBoundsException if n &lt; 0 or n &gt;= length()
      */
     public String getComponent(int n) throws ArrayIndexOutOfBoundsException {
         return components[ n ];
diff --git a/poi/src/main/java/org/apache/poi/poifs/property/DirectoryProperty.java b/poi/src/main/java/org/apache/poi/poifs/property/DirectoryProperty.java
index 0784673..badb306 100644
--- a/poi/src/main/java/org/apache/poi/poifs/property/DirectoryProperty.java
+++ b/poi/src/main/java/org/apache/poi/poifs/property/DirectoryProperty.java
@@ -33,10 +33,10 @@
 public class DirectoryProperty extends Property implements Parent, Iterable<Property> {
 
     /** List of Property instances */
-    private List<Property> _children;
+    private final List<Property> _children = new ArrayList<>();
 
     /** set of children's names */
-    private Set<String>  _children_names;
+    private final Set<String>  _children_names = new HashSet<>();
 
     /**
      * Default constructor
@@ -46,8 +46,6 @@
     public DirectoryProperty(String name)
     {
         super();
-        _children       = new ArrayList<>();
-        _children_names = new HashSet<>();
         setName(name);
         setSize(0);
         setPropertyType(PropertyConstants.DIRECTORY_TYPE);
@@ -66,8 +64,6 @@
                                 final int offset)
     {
         super(index, array, offset);
-        _children       = new ArrayList<>();
-        _children_names = new HashSet<>();
     }
 
     /**
@@ -121,7 +117,7 @@
     }
 
     public static class PropertyComparator implements Comparator<Property>, Serializable {
-        
+
         /**
          * compare method. Assumes both parameters are non-null
          * instances of Property. One property is less than another if
@@ -133,9 +129,9 @@
          * @param o1 first object to compare, better be a Property
          * @param o2 second object to compare, better be a Property
          *
-         * @return negative value if o1 <  o2,
+         * @return negative value if o1 &lt;  o2,
          *         zero           if o1 == o2,
-         *         positive value if o1 >  o2.
+         *         positive value if o1 &gt;  o2.
          */
         public int compare(Property o1, Property o2)
         {
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/PathCommand.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/PathCommand.java
index 76a53e7..99406c7 100644
--- a/poi/src/main/java/org/apache/poi/sl/draw/geom/PathCommand.java
+++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/PathCommand.java
@@ -26,11 +26,11 @@
  *
  *<ul>
  *     <li>arcTo</li>
- *      <li>moveTo/li>
- *      <li>lineTo/li>
- *      <li>cubicBezTo/li>
- *      <li>quadBezTo/li>
- *      <li>close/li>
+ *      <li>moveTo</li>
+ *      <li>lineTo</li>
+ *      <li>cubicBezTo</li>
+ *      <li>quadBezTo</li>
+ *      <li>close</li>
  * </ul>
  */
 public interface PathCommand {
diff --git a/poi/src/main/java/org/apache/poi/sl/draw/geom/XYAdjustHandle.java b/poi/src/main/java/org/apache/poi/sl/draw/geom/XYAdjustHandle.java
index 46975da..0c1ff04 100644
--- a/poi/src/main/java/org/apache/poi/sl/draw/geom/XYAdjustHandle.java
+++ b/poi/src/main/java/org/apache/poi/sl/draw/geom/XYAdjustHandle.java
@@ -67,11 +67,6 @@
 
     /**
      * Gets the value of the pos property.
-     *
-     * @return
-     *     possible object is
-     *     {@link CTAdjPoint2D }
-     *
      */
     public AdjustPoint getPos() {
         return pos;
@@ -79,11 +74,6 @@
 
     /**
      * Sets the value of the pos property.
-     *
-     * @param value
-     *     allowed object is
-     *     {@link CTAdjPoint2D }
-     *
      */
     public void setPos(AdjustPoint value) {
         this.pos = value;
diff --git a/poi/src/main/java/org/apache/poi/sl/usermodel/SlideShowFactory.java b/poi/src/main/java/org/apache/poi/sl/usermodel/SlideShowFactory.java
index a32123a..5a5facb 100644
--- a/poi/src/main/java/org/apache/poi/sl/usermodel/SlideShowFactory.java
+++ b/poi/src/main/java/org/apache/poi/sl/usermodel/SlideShowFactory.java
@@ -151,7 +151,7 @@
      *  @return The created SlideShow
      *
      *  @throws IOException if an error occurs while reading the data
-     *  @throws EncryptedDocumentException If the SlideShow<?,?> given is password protected
+     *  @throws EncryptedDocumentException If the SlideShow given is password protected
      */
     public static SlideShow<?,?> create(InputStream inp) throws IOException, EncryptedDocumentException {
         return create(inp, null);
diff --git a/poi/src/main/java/org/apache/poi/sl/usermodel/TextParagraph.java b/poi/src/main/java/org/apache/poi/sl/usermodel/TextParagraph.java
index 354b357..a6c4394 100644
--- a/poi/src/main/java/org/apache/poi/sl/usermodel/TextParagraph.java
+++ b/poi/src/main/java/org/apache/poi/sl/usermodel/TextParagraph.java
@@ -31,7 +31,7 @@
     /**
      * Specifies a list of text alignment types
      */
-    public enum TextAlign {
+    enum TextAlign {
         /**
          * For horizontal text, left aligned.
          * For vertical text, top aligned.
@@ -54,22 +54,22 @@
          * Align text so that it is justified across the whole line. It
          * is smart in the sense that it will not justify sentences
          * which are short
-         * 
+         *
          * For horizontal text, flush left and right.
          * For vertical text, flush top and bottom.
          */
         JUSTIFY,
-        
+
         /**
          * Kashida justify low.
-         */    
+         */
         JUSTIFY_LOW,
 
         /**
          * Distribute space between characters.
          */
         DIST,
-        
+
         /**
          * Thai distribution justification.
          */
@@ -77,28 +77,28 @@
     }
 
     /**
-     * 
+     *
      */
-    public enum FontAlign {
+    enum FontAlign {
         AUTO,
-        
+
         /**
          * Characters hang from top of line height.
          * Also known as "Hanging"
          */
         TOP,
-        
+
         /**
          * Characters centered within line height.
          */
         CENTER,
-        
+
         /**
          * Place characters on font baseline.
-         * Also known as "Roman" 
+         * Also known as "Roman"
          */
         BASELINE,
-        
+
         /**
          * Characters are anchored to the very bottom of a single line.
          * This is different than BASELINE because of letters such as "g", "q", and "y".
@@ -106,15 +106,15 @@
          */
         BOTTOM
     }
-    
-    public interface BulletStyle {
+
+    interface BulletStyle {
         String getBulletCharacter();
         String getBulletFont();
-        
+
         /**
          * The bullet point font size
-         * If bulletFontSize >= 0, then space is a percentage of normal line height.
-         * If bulletFontSize < 0, the absolute value in points
+         * If bulletFontSize &gt;= 0, then space is a percentage of normal line height.
+         * If bulletFontSize &lt; 0, the absolute value in points
          *
          * @return the bullet point font size
          */
@@ -124,7 +124,7 @@
          * Convenience function to set a solid color
          */
         void setBulletFontColor(Color color);
-        
+
         void setBulletFontColor(PaintStyle color);
 
         /**
@@ -133,7 +133,7 @@
          * A {@code null} value means to use the text font color.
          */
         PaintStyle getBulletFontColor();
-        
+
         AutoNumberingScheme getAutoNumberingScheme();
         /**
          * Index (1-based) of the first auto number value, or null if auto numbering scheme
@@ -173,8 +173,8 @@
      *
      * @param spaceBefore the vertical white space before the paragraph, null to unset
      */
-    void setSpaceBefore(Double spaceBefore);    
-    
+    void setSpaceBefore(Double spaceBefore);
+
     /**
      * The amount of vertical white space after the paragraph
      * This may be specified in two different ways, percentage spacing and font point spacing:
@@ -185,7 +185,7 @@
      *
      * @return the vertical white space after the paragraph or null, if unset
      */
-    Double getSpaceAfter();    
+    Double getSpaceAfter();
 
     /**
      * Set the amount of vertical white space that will be present after the paragraph.
@@ -206,8 +206,8 @@
      *
      * @param spaceAfter the vertical white space after the paragraph, null to unset
      */
-    public void setSpaceAfter(Double spaceAfter);
-    
+    void setSpaceAfter(Double spaceAfter);
+
     /**
      * @return the left margin (in points) of the paragraph or null, if unset
      */
@@ -217,19 +217,19 @@
      * Specifies the left margin of the paragraph. This is specified in addition to the text body
      * inset and applies only to this text paragraph. That is the text body Inset and the LeftMargin
      * attributes are additive with respect to the text position.
-     * 
+     *
      * @param leftMargin the left margin (in points) or null to unset
      */
     void setLeftMargin(Double leftMargin);
-    
-    
+
+
     /**
      * Specifies the right margin of the paragraph. This is specified in addition to the text body
      * inset and applies only to this text paragraph. That is the text body Inset and the RightMargin
      * attributes are additive with respect to the text position.
-     * 
+     *
      * The right margin is not support and therefore ignored by the HSLF implementation.
-     * 
+     *
      * @return the right margin (in points) of the paragraph or null, if unset
      */
     Double getRightMargin();
@@ -238,16 +238,16 @@
      * @param rightMargin the right margin (in points) of the paragraph
      */
     void setRightMargin(Double rightMargin);
-    
+
     /**
      * @return the indent (in points) applied to the first line of text in the paragraph.
      *  or null, if unset
      */
     Double getIndent();
-    
+
     /**
-     * Specifies the indent size that will be applied to the first line of text in the paragraph.   
-     * 
+     * Specifies the indent size that will be applied to the first line of text in the paragraph.
+     *
      * @param indent the indent (in points) applied to the first line of text in the paragraph
      */
     void setIndent(Double indent);
@@ -255,7 +255,7 @@
 
     /**
      * @return the text level of this paragraph (0-based). Default is 0.
-     */    
+     */
     int getIndentLevel();
 
     /**
@@ -266,19 +266,19 @@
      * @param level the level (0 ... 4)
      */
     void setIndentLevel(int level);
-    
+
     /**
      * Returns the vertical line spacing that is to be used within a paragraph.
      * This may be specified in two different ways, percentage spacing and font point spacing:
      * <p>
-     * If linespacing >= 0, then linespacing is a percentage of normal line height.
-     * If linespacing < 0, the absolute value of linespacing is the spacing in points
+     * If linespacing &gt;= 0, then linespacing is a percentage of normal line height.
+     * If linespacing &lt; 0, the absolute value of linespacing is the spacing in points
      * </p>
      *
      * @return the vertical line spacing or null, if unset
      */
     Double getLineSpacing();
-    
+
     /**
      * This element specifies the vertical line spacing that is to be used within a paragraph.
      * This may be specified in two different ways, percentage spacing and font point spacing:
@@ -297,18 +297,18 @@
      *      // spacing will be 48 points
      *      paragraph.setLineSpacing(-48.0);
      * </code></pre>
-     * 
+     *
      * @param lineSpacing the vertical line spacing
      */
     void setLineSpacing(Double lineSpacing);
 
     String getDefaultFontFamily();
-    
+
     /**
      * @return the default font size, in case its not set in the textrun or null, if unset
      */
     Double getDefaultFontSize();
-    
+
     /**
      * Returns the alignment that is applied to the paragraph.
      *
@@ -325,21 +325,21 @@
      * see {@link org.apache.poi.sl.usermodel.TextParagraph.TextAlign}.
      *
      * @param align text align
-     */    
+     */
     void setTextAlign(TextAlign align);
-    
+
     /**
      * Returns the font alignment that is applied to the paragraph.
      *
      * If this attribute is omitted, then null is return,
      * user code can imply the a value of {@link FontAlign#AUTO}
-     * 
+     *
      * @return alignment that is applied to the paragraph
      */
     FontAlign getFontAlign();
-    
+
     /**
-     * @return the bullet style of the paragraph, if {@code null} then no bullets are used 
+     * @return the bullet style of the paragraph, if {@code null} then no bullets are used
      */
     BulletStyle getBulletStyle();
 
@@ -347,19 +347,17 @@
      * Sets the bullet styles. If no styles are given, the bullets are omitted.
      * Possible attributes are integer/double (bullet size), Color (bullet color),
      * character (bullet character), string (bullet font), AutoNumberingScheme
-     *
-     * @param styles
      */
     void setBulletStyle(Object... styles);
-    
+
     /**
      * @return the default size for a tab character within this paragraph in points, null if unset
      */
     Double getDefaultTabSize();
 
-    
+
     TextShape<S,P> getParentShape();
-    
+
     /**
      * Fetch the text runs that are contained within this block of text
      */
@@ -368,14 +366,14 @@
     /**
      * Convenience method to determine if this text paragraph is part of
      * the slide header or footer
-     * 
+     *
      * @return true if this paragraph is part of a header or footer placeholder
-     * 
+     *
      * @since POI 3.15-beta2
      */
     boolean isHeaderOrFooter();
-    
-    
+
+
     /**
      * Get the {@link TabStop TabStops} - the list can't be and it's entries shouldn't be modified.
      * Opposed to other properties, this method is not cascading to the master sheet,
@@ -383,7 +381,7 @@
      * different levels aren't merged.
      *
      * @return the tabstop collection or {@code null} if no tabstops are defined
-     * 
+     *
      * @since POI 4.0.0
      */
     List<? extends TabStop> getTabStops();
@@ -391,8 +389,6 @@
     /**
      * Set the {@link TabStop} collection
      *
-     * @param tabStops the {@link TabStop} collection
-     * 
      * @since POI 4.0.0
      */
     void addTabStops(double positionInPoints, TabStop.TabStopType tabStopType);
@@ -400,7 +396,7 @@
     /**
      * Removes the tabstops of this paragraphs.
      * This doesn't affect inherited tabstops, e.g. inherited by the slide master
-     * 
+     *
      * @since POI 4.0.0
      */
     void clearTabStops();
diff --git a/poi/src/main/java/org/apache/poi/ss/format/CellFormatCondition.java b/poi/src/main/java/org/apache/poi/ss/format/CellFormatCondition.java
index 96e9c5f..d44e18f 100644
--- a/poi/src/main/java/org/apache/poi/ss/format/CellFormatCondition.java
+++ b/poi/src/main/java/org/apache/poi/ss/format/CellFormatCondition.java
@@ -49,11 +49,11 @@
     /**
      * Returns an instance of a condition object.
      *
-     * @param opString The operator as a string.  One of <tt>"&lt;"</tt>,
-     *                 <tt>"&lt;="</tt>, <tt>">"</tt>, <tt>">="</tt>,
-     *                 <tt>"="</tt>, <tt>"=="</tt>, <tt>"!="</tt>, or
-     *                 <tt>"&lt;>"</tt>.
-     * @param constStr The constant (such as <tt>"12"</tt>).
+     * @param opString The operator as a string.  One of {@code <},
+     *                 {@code <=}, {@code >}, {@code >=},
+     *                 {@code =}, {@code ==}, {@code !=} or
+     *                 {@code <>}.
+     * @param constStr The constant (such as {@code 12}).
      *
      * @return A condition object for the given condition.
      */
diff --git a/poi/src/main/java/org/apache/poi/ss/format/CellFormatPart.java b/poi/src/main/java/org/apache/poi/ss/format/CellFormatPart.java
index c03dbc5..51f67df 100644
--- a/poi/src/main/java/org/apache/poi/ss/format/CellFormatPart.java
+++ b/poi/src/main/java/org/apache/poi/ss/format/CellFormatPart.java
@@ -38,15 +38,13 @@
  * values.
  * <p>
  * Each format part can contain a color, a condition, and will always contain a
- * format specification.  For example <tt>"[Red][>=10]#"</tt> has a color
- * (<tt>[Red]</tt>), a condition (<tt>>=10</tt>) and a format specification
- * (<tt>#</tt>).
+ * format specification.  For example {@code "[Red][>=10]#"} has a color
+ * ({@code [Red]}), a condition ({@code >=10}) and a format specification
+ * ({@code #}).
  * <p>
  * This class also contains patterns for matching the subparts of format
  * specification.  These are used internally, but are made public in case other
  * code has use for them.
- *
- * @author Ken Arnold, Industrious Media LLC
  */
 public class CellFormatPart {
     private static final Logger LOG = Logger.getLogger(CellFormat.class.getName());
diff --git a/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java b/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
index dec5a27..e56430c 100644
--- a/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
+++ b/poi/src/main/java/org/apache/poi/ss/format/SimpleFraction.java
@@ -26,7 +26,7 @@
     private final int numerator;
     /**
      * Create a fraction given a double value and a denominator.
-     * 
+     *
      * @param val double value of fraction
      * @param exactDenom the exact denominator
      * @return a SimpleFraction with the given values set.
@@ -35,17 +35,17 @@
         int num =  (int)Math.round(val*exactDenom);
         return new SimpleFraction(num,exactDenom);
     }
-    
+
     /**
      * Create a fraction given the double value and either the maximum error
      * allowed or the maximum number of denominator digits.
      *
      * @param value the double value to convert to a fraction.
      * @param maxDenominator maximum denominator value allowed.
-     * 
+     *
      * @throws RuntimeException if the continued fraction failed to
      *      converge.
-     * @throws IllegalArgumentException if value > Integer.MAX_VALUE
+     * @throws IllegalArgumentException if value &gt; Integer.MAX_VALUE
      */
     public static SimpleFraction buildFractionMaxDenominator(double value, int maxDenominator){
         return buildFractionMaxDenominator(value, 0, maxDenominator, 100);
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/eval/EvaluationException.java b/poi/src/main/java/org/apache/poi/ss/formula/eval/EvaluationException.java
index e094df4..b0071a7 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/eval/EvaluationException.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/eval/EvaluationException.java
@@ -21,9 +21,9 @@
  * This class is used to simplify error handling logic <i>within</i> operator and function
  * implementations.   Note - <tt>OperationEval.evaluate()</tt> and <tt>Function.evaluate()</tt>
  * method signatures do not throw this exception so it cannot propagate outside.<p>
- * 
+ *
  * Here is an example coded without <tt>EvaluationException</tt>, to show how it can help:
- * <pre>
+ * <pre>{@code
  * public Eval evaluate(Eval[] args, int srcRow, short srcCol) {
  *	// ...
  *	Eval arg0 = args[0];
@@ -47,14 +47,14 @@
  *		temp += ((NumericValueEval)ve).getNumberValue();
  *	}
  *	// ...
- * }	 
- * </pre>
- * In this example, if any error is encountered while processing the arguments, an error is 
+ * }
+ * }</pre>
+ * In this example, if any error is encountered while processing the arguments, an error is
  * returned immediately. This code is difficult to refactor due to all the points where errors
  * are returned.<br>
  * Using <tt>EvaluationException</tt> allows the error returning code to be consolidated to one
  * place.<p>
- * <pre>
+ * <pre>{@code
  * public Eval evaluate(Eval[] args, int srcRow, short srcCol) {
  *	try {
  *		// ...
@@ -90,21 +90,21 @@
  *	}
  *	return temp;
  *}
- * </pre>   
+ * }</pre>
  * It is not mandatory to use EvaluationException, doing so might give the following advantages:<br>
  *  - Methods can more easily be extracted, allowing for re-use.<br>
  *  - Type management (typecasting etc) is simpler because error conditions have been separated from
  * intermediate calculation values.<br>
  *  - Fewer local variables are required. Local variables can have stronger types.<br>
- *  - It is easier to mimic common Excel error handling behaviour (exit upon encountering first 
- *  error), because exceptions conveniently propagate up the call stack regardless of execution 
+ *  - It is easier to mimic common Excel error handling behaviour (exit upon encountering first
+ *  error), because exceptions conveniently propagate up the call stack regardless of execution
  *  points or the number of levels of nested calls.<p>
- *  
+ *
  * <b>Note</b> - Only standard evaluation errors are represented by <tt>EvaluationException</tt> (
  * i.e. conditions expected to be encountered when evaluating arbitrary Excel formulas). Conditions
  * that could never occur in an Excel spreadsheet should result in runtime exceptions. Care should
- * be taken to not translate any POI internal error into an Excel evaluation error code.   
- * 
+ * be taken to not translate any POI internal error into an Excel evaluation error code.
+ *
  * @author Josh Micich
  */
 public final class EvaluationException extends Exception {
@@ -127,7 +127,7 @@
 	public static EvaluationException numberError() {
 		return new EvaluationException(ErrorEval.NUM_ERROR);
 	}
-	
+
 	public ErrorEval getErrorEval() {
 		return _errorEval;
 	}
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java b/poi/src/main/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java
index 2a9f2e3..a9684c9 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/eval/RelationalOperationEval.java
@@ -54,7 +54,7 @@
 	 *
 	 * Blank &gt; Negative numbers
 	 * Blank == 0
-	 * Blank < Positive numbers
+	 * Blank &lt; Positive numbers
 	 * </pre>
 	 */
 
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Countifs.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/Countifs.java
index 0ac5063..42c1586 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Countifs.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Countifs.java
@@ -32,10 +32,11 @@
     public static final FreeRefFunction instance = new Countifs();
 
     /**
-     * https://support.office.com/en-us/article/COUNTIFS-function-dda3dc6e-f74e-4aee-88bc-aa8c2a866842?ui=en-US&rs=en-US&ad=US
      * COUNTIFS(criteria_range1, criteria1, [criteria_range2, criteria2]...)
      * need at least 2 arguments and need to have an even number of arguments (criteria_range1, criteria1 plus x*(criteria_range, criteria))
+     *
      * @see org.apache.poi.ss.formula.functions.Baseifs#hasInitialRange()
+     * @see <a href="https://support.microsoft.com/en-us/office/countifs-function-dda3dc6e-f74e-4aee-88bc-aa8c2a866842">COUNTIFS function</a>
      */
     protected boolean hasInitialRange() {
         return false;
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Dec2Bin.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/Dec2Bin.java
index cbac6b2..2ec9ea3 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Dec2Bin.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Dec2Bin.java
@@ -24,7 +24,7 @@
 import org.apache.poi.ss.formula.eval.ValueEval;
 
 /**
- * Implementation for Excel Bin2Dec() function.<p>
+ * Implementation for Excel Bin2Dec() function.
  * <p>
  * <b>Syntax</b>:<br> <b>Bin2Dec  </b>(<b>number</b>,<b>[places]</b> )<br>
  * <p>
@@ -38,7 +38,7 @@
  * <p>
  * Remarks
  * <ul>
- * <li>If number < -512 or if number > 511, DEC2BIN returns the #NUM! error value.</li>
+ * <li>If number &lt; -512 or if number &gt; 511, DEC2BIN returns the #NUM! error value.</li>
  * <li>If number is nonnumeric, DEC2BIN returns the #VALUE! error value.</li>
  * <li>If DEC2BIN requires more than places characters, it returns the #NUM! error value.</li>
  * <li>If places is not an integer, it is truncated.</li>
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Dec2Hex.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/Dec2Hex.java
index 299068d..6af3db0 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Dec2Hex.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Dec2Hex.java
@@ -23,7 +23,7 @@
 import org.apache.poi.ss.formula.eval.*;
 
 /**
- * Implementation for Excel DELTA() function.<p>
+ * Implementation for Excel DELTA() function.
  * <p>
  * <b>Syntax</b>:<br> <b>DEC2HEX  </b>(<b>number</b>,<b>places</b> )<br>
  * <p>
@@ -35,11 +35,11 @@
  * Negative numbers are represented using two's-complement notation.
  *
  * <ul>
- * <li>If number < -549,755,813,888 or if number > 549,755,813,887, this function returns the #NUM! error value.</li>
+ * <li>If number &lt; -549,755,813,888 or if number &gt; 549,755,813,887, this function returns the #NUM! error value.</li>
  * <li>If number is nonnumeric, this function returns the #VALUE! error value.</li>
  * </ul>
  *
- * <h2>places</h2>
+ * Places<P>
  *
  * The number of characters to use. The places argument is useful for padding the
  * return value with leading 0s (zeros).
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/FinanceLib.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/FinanceLib.java
index dc4917f..9f7aeae 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/FinanceLib.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/FinanceLib.java
@@ -33,13 +33,16 @@
  * </ul>
  * For more info on the terms/abbreviations please use the references below
  * (hyperlinks are subject to change):
- * </br>Online References:
+ * <p>
+ * Online References:
  * <ol>
  * <li>GNU Emacs Calc 2.02 Manual: http://theory.uwinnipeg.ca/gnu/calc/calc_203.html</li>
  * <li>Yahoo Financial Glossary: http://biz.yahoo.com/f/g/nn.html#y</li>
  * <li>MS Excel function reference: http://office.microsoft.com/en-us/assistance/CH062528251033.aspx</li>
  * </ol>
- * <h3>Implementation Notes:</h3>
+ *
+ * Implementation Notes:<p>
+ *
  * Symbols used in the formulae that follow:<br>
  * <ul>
  * <li>p: present value</li>
@@ -66,7 +69,7 @@
      * Future value of an amount given the number of payments, rate, amount
      * of individual payment, present value and boolean value indicating whether
      * payments are due at the beginning of period
-     * (false => payments are due at end of period)
+     * (false =&gt; payments are due at end of period)
      * @param r rate
      * @param n num of periods
      * @param y pmt per period
@@ -88,7 +91,7 @@
      * Present value of an amount given the number of future payments, rate, amount
      * of individual payment, future value and boolean value indicating whether
      * payments are due at the beginning of period
-     * (false => payments are due at end of period)
+     * (false =&gt; payments are due at end of period)
      * @param r rate
      * @param n num of periods
      * @param y pmt per period
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Function0Arg.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/Function0Arg.java
index 749053e..1c50103 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Function0Arg.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Function0Arg.java
@@ -18,12 +18,15 @@
 package org.apache.poi.ss.formula.functions;
 
 import org.apache.poi.ss.formula.eval.ValueEval;
+import org.apache.poi.util.Removal;
 
 /**
  * Implemented by all functions that can be called with zero arguments
  *
- * @author Josh Micich
+ * @deprecated replaced by lambda expressions in 5.0.1
  */
+@Deprecated
+@Removal(version = "6.0.0")
 public interface Function0Arg extends Function {
 	/**
 	 * see {@link Function#evaluate(ValueEval[], int, int)}
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Irr.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/Irr.java
index 7430335..16af525 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Irr.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Irr.java
@@ -73,7 +73,7 @@
      * <p>
      * Starting with the guess, the method cycles through the calculation until the result
      * is accurate within 0.00001 percent. If IRR can't find a result that works
-     * after 20 tries, the Double.NaN<> is returned.
+     * after 20 tries, the {@code Double.NaN} is returned.
      * </p>
      * <p>
      *   The implementation is inspired by the NewtonSolver from the Apache Commons-Math library,
@@ -82,7 +82,7 @@
      *
      * @param values        the income values.
      * @param guess         the initial guess of irr.
-     * @return the irr value. The method returns <code>Double.NaN</code>
+     * @return the irr value. The method returns {@code Double.NaN}
      *  if the maximum iteration count is exceeded
      *
      * @see <a href="http://en.wikipedia.org/wiki/Internal_rate_of_return#Numerical_solution">
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Lookup.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/Lookup.java
index 0b20ab3..f9f46c9 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Lookup.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Lookup.java
@@ -32,17 +32,15 @@
  * <b>VLOOKUP</b>(<b>lookup_value</b>, <b>lookup_vector</b>, result_vector)<p>
  *
  * <b>lookup_value</b>  The value to be found in the lookup vector.<br>
- * <b>lookup_vector</> An area reference for the lookup data. <br>
+ * <b>lookup_vector</b> An area reference for the lookup data. <br>
  * <b>result_vector</b> Single row or single column area reference from which the result value is chosen.<br>
- *
- * @author Josh Micich
  */
 public final class Lookup extends Var2or3ArgFunction {
 
 	@Override
 	public ValueEval evaluate(int srcRowIndex, int srcColumnIndex, ValueEval arg0, ValueEval arg1) {
 		// complex rules to choose lookupVector and resultVector from the single area ref
-		
+
 		try {
 			/*
 			The array form of LOOKUP is very similar to the HLOOKUP and VLOOKUP functions. The difference is that HLOOKUP searches for the value of lookup_value in the first row, VLOOKUP searches in the first column, and LOOKUP searches according to the dimensions of array.
@@ -54,7 +52,7 @@
 			TwoDEval lookupArray = LookupUtils.resolveTableArrayArg(arg1);
 			ValueVector lookupVector;
 			ValueVector resultVector;
-	
+
 			if (lookupArray.getWidth() > lookupArray.getHeight()) {
 				// If array covers an area that is wider than it is tall (more columns than rows), LOOKUP searches for the value of lookup_value in the first row.
 				lookupVector = createVector(lookupArray.getRow(0));
@@ -66,7 +64,7 @@
 			}
 			// if a rectangular area reference was passed in as arg1, lookupVector and resultVector should be the same size
 			assert (lookupVector.getSize() == resultVector.getSize());
-			
+
 			int index = LookupUtils.lookupIndexOfValue(lookupValue, lookupVector, true);
 			return resultVector.getItem(index);
 		} catch (final EvaluationException e) {
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/NumericFunction.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/NumericFunction.java
index 39adf4c..b0e85d9 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/NumericFunction.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/NumericFunction.java
@@ -41,7 +41,7 @@
 	}
 
 	/**
-	 * @throws EvaluationException (#NUM!) if <tt>result</tt> is <tt>NaN</> or <tt>Infinity</tt>
+	 * @throws EvaluationException (#NUM!) if <tt>result</tt> is <tt>NaN</tt> or <tt>Infinity</tt>
 	 */
 	public static void checkValue(double result) throws EvaluationException {
 		if (Double.isNaN(result) || Double.isInfinite(result)) {
@@ -392,7 +392,7 @@
     public static final Function POISSON = new Fixed3ArgFunction() {
 
         private static final double DEFAULT_RETURN_RESULT =1;
-        
+
         /**
          * This checks is x = 0 and the mean = 0.
          * Excel currently returns the value 1 where as the
@@ -417,7 +417,7 @@
             if (aDouble < 0) {
                 throw new EvaluationException(ErrorEval.NUM_ERROR);
             }
-            
+
             return true;
         }
 
@@ -466,7 +466,7 @@
                 // check for default result : excel implementation for 0,0
                 // is different to Math Common.
                 if (isDefaultResult(x,mean)) {
-                    return new NumberEval(DEFAULT_RETURN_RESULT); 
+                    return new NumberEval(DEFAULT_RETURN_RESULT);
                 }
                 // check the arguments : as per excel function def
                 checkArgument(x);
@@ -485,7 +485,7 @@
 			} catch (EvaluationException e) {
 				return e.getErrorEval();
 			}
-            
+
             return new NumberEval(result);
 
         }
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/functions/Sumifs.java b/poi/src/main/java/org/apache/poi/ss/formula/functions/Sumifs.java
index 862930d..c23a05c 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/functions/Sumifs.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/functions/Sumifs.java
@@ -22,9 +22,9 @@
 /**
  * Implementation for the Excel function SUMIFS<p>
  *
- * Syntax : <br>
- *  SUMIFS ( <b>sum_range</b>, <b>criteria_range1</b>, <b>criteria1</>,
- *  [<b>criteria_range2</b>,  <b>criteria2</b>], ...) <br>
+ * Syntax : <p>
+ *  SUMIFS ( <b>sum_range</b>, <b>criteria_range1</b>, <b>criteria1</b>,
+ *  [<b>criteria_range2</b>,  <b>criteria2</b>], ...)
  *    <ul>
  *      <li><b>sum_range</b> Required. One or more cells to sum, including numbers or names, ranges,
  *      or cell references that contain numbers. Blank and text values are ignored.</li>
@@ -36,8 +36,6 @@
  *      <li><b> criteria_range2, criteria2, ...</b>    Optional. Additional ranges and their associated criteria.
  *      Up to 127 range/criteria pairs are allowed.
  *    </ul>
- * </p>
- *
  */
 public final class Sumifs extends Baseifs {
     /**
@@ -49,7 +47,6 @@
      * https://support.office.com/en-us/article/SUMIFS-function-c9e748f5-7ea7-455d-9406-611cebce642b
      * COUNTIFS(sum_range, criteria_range1, criteria1, [criteria_range2, criteria2], ...
      * need at least 3 arguments and need to have an odd number of arguments (sum-range plus x*(criteria_range, criteria))
-     * @see org.apache.poi.ss.formula.functions.Baseifs#hasInitialRange()
      */
     @Override
     protected boolean hasInitialRange() {
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java b/poi/src/main/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java
index a58e6e2..04ac7fb 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/ptg/GreaterThanPtg.java
@@ -19,7 +19,7 @@
 
 
 /**
- * Greater than operator PTG ">"
+ * Greater than operator PTG "&gt;"
  */
 public final class GreaterThanPtg extends ValueOperatorPtg {
     public static final byte sid  = 0x0D;
diff --git a/poi/src/main/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java b/poi/src/main/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java
index 5e57316..c2a31f8 100644
--- a/poi/src/main/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java
+++ b/poi/src/main/java/org/apache/poi/ss/formula/ptg/LessThanPtg.java
@@ -18,7 +18,7 @@
 package org.apache.poi.ss.formula.ptg;
 
 /**
- * Less than operator PTG "<". The SID is taken from the
+ * Less than operator PTG "&lt;". The SID is taken from the
  * Openoffice.orgs Documentation of the Excel File Format,
  * Table 3.5.7
  */
diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/DifferentialStyleProvider.java b/poi/src/main/java/org/apache/poi/ss/usermodel/DifferentialStyleProvider.java
index ce6ad53..3c4f6ed 100644
--- a/poi/src/main/java/org/apache/poi/ss/usermodel/DifferentialStyleProvider.java
+++ b/poi/src/main/java/org/apache/poi/ss/usermodel/DifferentialStyleProvider.java
@@ -20,18 +20,18 @@
 /**
  * Interface for classes providing differential style definitions, such as conditional format rules
  * and table/pivot table styles.
- * 
+ *
  * @since 3.17 beta 1
  */
 public interface DifferentialStyleProvider {
 
     /**
-     * @return - border formatting object  if defined,  <code>null</code> otherwise
+     * @return - border formatting object  if defined,  {@code null} otherwise
      */
     BorderFormatting getBorderFormatting();
 
     /**
-     * @return - font formatting object  if defined,  <code>null</code> otherwise
+     * @return - font formatting object  if defined,  {@code null} otherwise
      */
     FontFormatting getFontFormatting();
 
@@ -42,15 +42,15 @@
     ExcelNumberFormat getNumberFormat();
 
     /**
-     * @return - pattern formatting object if defined, <code>null</code> otherwise
+     * @return - pattern formatting object if defined, {@code null} otherwise
      */
     PatternFormatting getPatternFormatting();
 
     /**
      * This is the number of rows or columns in a band or stripe.
-     * For styles that represent stripes, it must be > 1, for all others it is 0.
+     * For styles that represent stripes, it must be &gt; 1, for all others it is 0.
      * Not the greatest overloading by the OOXML spec.
-     * @return number of rows/columns in a stripe for stripe styles, 0 for all others 
+     * @return number of rows/columns in a stripe for stripe styles, 0 for all others
      */
     int getStripeSize();
 }
diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/FontScheme.java b/poi/src/main/java/org/apache/poi/ss/usermodel/FontScheme.java
index e1b7712..1bf2318 100644
--- a/poi/src/main/java/org/apache/poi/ss/usermodel/FontScheme.java
+++ b/poi/src/main/java/org/apache/poi/ss/usermodel/FontScheme.java
@@ -23,7 +23,7 @@
  * When a font definition is part of a theme definition, then the font is categorized as either a major or minor font scheme component.
  * When a new theme is chosen, every font that is part of a theme definition is updated to use the new major or minor font definition for that
  * theme.
- * Usually major fonts are used for styles like headings, and minor fonts are used for body & paragraph text.
+ * Usually major fonts are used for styles like headings, and minor fonts are used for body &amp; paragraph text.
  *
  * @author Gisella Bronzetti
  */
@@ -34,9 +34,9 @@
     MAJOR(2),
     MINOR(3);
 
-    private int value;
+    private final int value;
 
-    private FontScheme(int val) {
+    FontScheme(int val) {
         value = val;
     }
 
@@ -44,12 +44,9 @@
         return value;
     }
 
-    private static FontScheme[] _table = new FontScheme[4];
-    static {
-        for (FontScheme c : values()) {
-            _table[c.getValue()] = c;
-        }
-    }
+    private static final FontScheme[] _table = {
+        null, NONE, MAJOR, MINOR
+    };
 
     public static FontScheme valueOf(int value){
         return _table[value];
diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/FormulaError.java b/poi/src/main/java/org/apache/poi/ss/usermodel/FormulaError.java
index 996861e..744f4af 100644
--- a/poi/src/main/java/org/apache/poi/ss/usermodel/FormulaError.java
+++ b/poi/src/main/java/org/apache/poi/ss/usermodel/FormulaError.java
@@ -24,13 +24,13 @@
 
 /**
  * Enumerates error values in SpreadsheetML formula calculations.
- * 
+ *
  * See also OOO's excelfileformat.pdf (2.5.6)
  */
 public enum FormulaError {
     @Internal
     _NO_ERROR(-1, "(no error)"),
-    
+
     /**
      * Intended to indicate when two areas are required to intersect, but do not.
      * <p>Example:
@@ -68,10 +68,12 @@
     /**
      * Intended to indicate when what looks like a name is used, but no such name has been defined.
      * <p>Example:
-     * XYZ/3, where XYZ is not a defined name. Total is & A10,
-     * where neither Total nor is is a defined name. Presumably, "Total is " & A10
-     * was intended. SUM(A1C10), where the range A1:C10 was intended.
-     * </p>
+     * <ul>
+     * <li>XYZ/3, where XYZ is not a defined name.</li>
+     * <li>{@code Total is &amp; A10}, where neither {@code Total} nor {@code is} is a defined name.
+     *      Presumably, {@code "Total is " &amp; A10} was intended.</li>
+     * <li>SUM(A1C10), where the range A1:C10 was intended.</li>
+     * </ul>
      */
     NAME(0x1D, "#NAME?"),
 
@@ -100,12 +102,12 @@
      * This error value can be produced by calling the function NA
      */
     NA(0x2A, "#N/A"),
-    
+
     // These are POI-specific error codes
     // It is desirable to make these (arbitrary) strings look clearly different from any other
     // value expression that might appear in a formula.  In addition these error strings should
     // look unlike the standard Excel errors.  Hence tilde ('~') was used.
-    
+
     /**
      * POI specific code to indicate that there is a circular reference
      *  in the formula
@@ -157,7 +159,7 @@
             smap.put(error.getString(), error);
         }
     }
-    
+
     public static boolean isValidCode(int errorCode) {
         for (FormulaError error : values()) {
             if (error.getCode() == errorCode) return true;
diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/Name.java b/poi/src/main/java/org/apache/poi/ss/usermodel/Name.java
index 03e13a8..65ca8e3 100644
--- a/poi/src/main/java/org/apache/poi/ss/usermodel/Name.java
+++ b/poi/src/main/java/org/apache/poi/ss/usermodel/Name.java
@@ -24,7 +24,7 @@
  * cell reference, constant or a formula.
  * </p>
  * Examples:
- * <pre><blockquote>
+ * <pre>{@code
  *  Sheet sheet = workbook.createSheet("Loan Calculator");
  *  Name name;
  *
@@ -46,9 +46,9 @@
  *
  *  name = wb.createName();
  *  name.setNameName("Values_Entered");
- *  name.setRefersToFormula("IF(Loan_Amount*Interest_Rate>0,1,0)");
+ *  name.setRefersToFormula("IF(Loan_Amount*Interest_Rate > 0,1,0)");
  *
- * </blockquote></pre>
+ * }</pre>
  */
 public interface Name {
 
diff --git a/poi/src/main/java/org/apache/poi/ss/usermodel/Table.java b/poi/src/main/java/org/apache/poi/ss/usermodel/Table.java
index ef7fe33..049218a 100644
--- a/poi/src/main/java/org/apache/poi/ss/usermodel/Table.java
+++ b/poi/src/main/java/org/apache/poi/ss/usermodel/Table.java
@@ -34,7 +34,7 @@
      *      </a>
      */
     Pattern isStructuredReference = Pattern.compile("[a-zA-Z_\\\\][a-zA-Z0-9._]*\\[.*\\]");
-    
+
     /**
      *  Get the top-left column index relative to the sheet
      * @return table start column index on sheet
@@ -60,16 +60,16 @@
      * @return table name
      */
     String getName();
-    
+
     /**
      * @return name of the table style, if there is one.  May be a built-in name or user-defined.
      * @since 3.17 beta 1
      */
     String getStyleName();
-    
+
     /**
      * Returns the index of a given named column in the table (names are case insensitive in XSSF).
-     * Note this list is lazily loaded and cached for performance. 
+     * Note this list is lazily loaded and cached for performance.
      * Changes to the underlying table structure are not reflected in later calls
      * unless <code>XSSFTable.updateHeaders()</code> is called to reset the cache.
      * @param columnHeader the column header name to get the table column index of
@@ -85,34 +85,34 @@
     /**
      * Note: This is misleading.  The OOXML spec indicates this is true if the totals row
      * has <b><i>ever</i></b> been shown, not whether or not it is currently displayed.
-     * Use {@link #getTotalsRowCount()} > 0 to decide whether or not the totals row is visible.
+     * Use {@link #getTotalsRowCount()} &gt; 0 to decide whether or not the totals row is visible.
      * @return true if a totals row has ever been shown for this table
      * @since 3.15 beta 2
      * @see #getTotalsRowCount()
      */
     boolean isHasTotalsRow();
-    
+
     /**
      * @return 0 for no totals rows, 1 for totals row shown.
-     * Values > 1 are not currently used by Excel up through 2016, and the OOXML spec
+     * Values &gt; 1 are not currently used by Excel up through 2016, and the OOXML spec
      * doesn't define how they would be implemented.
      * @since 3.17 beta 1
      */
     int getTotalsRowCount();
-    
+
     /**
      * @return 0 for no header rows, 1 for table headers shown.
-     * Values > 1 might be used by Excel for pivot tables?
+     * Values &gt; 1 might be used by Excel for pivot tables?
      * @since 3.17 beta 1
      */
     int getHeaderRowCount();
-    
+
     /**
      * @return TableStyleInfo for this instance
      * @since 3.17 beta 1
      */
     TableStyleInfo getStyle();
-    
+
     /**
      * checks if the given cell is part of the table.  Includes checking that they are on the same sheet.
      * @param cell
@@ -124,7 +124,7 @@
         if (cell == null) return false;
         return contains(new CellReference(cell.getSheet().getSheetName(), cell.getRowIndex(), cell.getColumnIndex(), true, true));
     }
-    
+
     /**
      * checks if the given cell is part of the table.  Includes checking that they are on the same sheet.
      * @param cell reference to a possibly undefined cell location
diff --git a/poi/src/main/java/org/apache/poi/ss/util/CellRangeUtil.java b/poi/src/main/java/org/apache/poi/ss/util/CellRangeUtil.java
index 3b8b525..c3a7afa 100644
--- a/poi/src/main/java/org/apache/poi/ss/util/CellRangeUtil.java
+++ b/poi/src/main/java/org/apache/poi/ss/util/CellRangeUtil.java
@@ -23,7 +23,7 @@
 
 /**
  * Utility class that builds on {@link CellRangeAddress}
- * 
+ *
  * Portions of this class may be moved to {@link CellRangeAddressBase}
  */
 public final class CellRangeUtil {
@@ -40,12 +40,12 @@
 
     /**
      * Get the type of intersection between two cell ranges
-     * 
+     *
      * @param crB - the specified range
      * @return code which reflects how the specified range is related to this range.<br>
      * Possible return codes are:
      * <ul>
-     *     <li>{@link #NO_INTERSECTION} - the specified range is outside of this range;</li> 
+     *     <li>{@link #NO_INTERSECTION} - the specified range is outside of this range;</li>
      *     <li>{@link #OVERLAP} - both ranges partially overlap</li>
      *     <li>{@link #INSIDE} - the specified range is inside of this one</li>
      *     <li>{@link #ENCLOSES} - the specified range encloses (possibly exactly the same as) this range</li>
@@ -60,9 +60,9 @@
         int firstCol = crB.getFirstColumn();
         int lastCol  = crB.getLastColumn();
 
-        if ( 
+        if (
             gt(crA.getFirstRow(),    lastRow) || lt(crA.getLastRow(),    firstRow) ||
-            gt(crA.getFirstColumn(), lastCol) || lt(crA.getLastColumn(), firstCol) 
+            gt(crA.getFirstColumn(), lastCol) || lt(crA.getLastColumn(), firstCol)
         )
         {
             return NO_INTERSECTION;
@@ -145,12 +145,12 @@
         int x = intersect(range1, range2);
         switch(x)
         {
-            case CellRangeUtil.NO_INTERSECTION: 
-                // nothing in common: at most they could be adjacent to each other and thus form a single bigger area  
+            case CellRangeUtil.NO_INTERSECTION:
+                // nothing in common: at most they could be adjacent to each other and thus form a single bigger area
                 if(hasExactSharedBorder(range1, range2)) {
                     return new CellRangeAddress[] { createEnclosingCellRange(range1, range2), };
                 }
-                // else - No intersection and no shared border: do nothing 
+                // else - No intersection and no shared border: do nothing
                 return null;
             case CellRangeUtil.OVERLAP:
                 // commented out the cells overlap implementation, it caused endless loops, see Bug 55380
@@ -179,10 +179,10 @@
     }
 
     /**
-     * Check if cell range A contains cell range B (B <= A)
-     * 
+     * Check if cell range A contains cell range B (B &lt;= A)
+     *
      * TODO: move this into {@link CellRangeAddressBase}
-     * 
+     *
      * @param crA cell range A
      * @param crB cell range B
      * @return true if cell range A contains cell range B
@@ -197,7 +197,7 @@
 
     /**
      * Check if the two cell ranges have a shared border.
-     * 
+     *
      * @return <code>true</code> if the ranges have a complete shared border (i.e.
      * the two ranges together make a simple rectangular region.
      */
@@ -207,7 +207,7 @@
         int oFirstCol = crB.getFirstColumn();
         int oLastCol  = crB.getLastColumn();
 
-        if (crA.getFirstRow() > 0 && crA.getFirstRow()-1 == oLastRow || 
+        if (crA.getFirstRow() > 0 && crA.getFirstRow()-1 == oLastRow ||
                 oFirstRow > 0 && oFirstRow-1 == crA.getLastRow()) {
             // ranges have a horizontal border in common
             // make sure columns are identical:
@@ -225,14 +225,14 @@
 
     /**
      * Create an enclosing CellRange for the two cell ranges.
-     * 
+     *
      * @return enclosing CellRange
      */
     public static CellRangeAddress createEnclosingCellRange(CellRangeAddress crA, CellRangeAddress crB) {
         if( crB == null) {
             return crA.copy();
         }
-        
+
         int minRow = lt(crB.getFirstRow(),   crA.getFirstRow())   ?crB.getFirstRow()   :crA.getFirstRow();
         int maxRow = gt(crB.getLastRow(),    crA.getLastRow())    ?crB.getLastRow()    :crA.getLastRow();
         int minCol = lt(crB.getFirstColumn(),crA.getFirstColumn())?crB.getFirstColumn():crA.getFirstColumn();
diff --git a/poi/src/main/java/org/apache/poi/util/IOUtils.java b/poi/src/main/java/org/apache/poi/util/IOUtils.java
index 974efdf..115e057 100644
--- a/poi/src/main/java/org/apache/poi/util/IOUtils.java
+++ b/poi/src/main/java/org/apache/poi/util/IOUtils.java
@@ -58,7 +58,7 @@
     }
 
     /**
-     * If this value is set to > 0, {@link #safelyAllocate(long, int)} will ignore the
+     * If this value is set to &gt; 0, {@link #safelyAllocate(long, int)} will ignore the
      * maximum record length parameter.
      *
      * This is designed to allow users to bypass the hard-coded maximum record lengths
diff --git a/poi/src/main/java/org/apache/poi/util/IntList.java b/poi/src/main/java/org/apache/poi/util/IntList.java
index f536e08..4bfe8ca 100644
--- a/poi/src/main/java/org/apache/poi/util/IntList.java
+++ b/poi/src/main/java/org/apache/poi/util/IntList.java
@@ -85,7 +85,7 @@
      * @param value the new value
      *
      * @exception IndexOutOfBoundsException if the index is out of
-     *            range (index < 0 || index > size()).
+     *            range (index &lt; 0 || index &gt; size()).
      */
 
     public void add(final int index, final int value)
@@ -179,7 +179,7 @@
      * @return true if this list changed as a result of the call.
      *
      * @exception IndexOutOfBoundsException if the index is out of
-     *            range (index < 0 || index > size())
+     *            range (index &lt; 0 || index &gt; size())
      */
 
     public boolean addAll(final int index, final IntList c)
@@ -312,7 +312,7 @@
      * @return the element at the specified position in this list.
      *
      * @exception IndexOutOfBoundsException if the index is out of
-     *            range (index < 0 || index >= size()).
+     *            range (index &lt; 0 || index &gt;= size()).
      */
 
     public int get(final int index)
@@ -425,7 +425,7 @@
      * @return the element previously at the specified position.
      *
      * @exception IndexOutOfBoundsException if the index is out of
-     *            range (index < 0 || index >= size()).
+     *            range (index &lt; 0 || index &gt;= size()).
      */
 
     public int remove(final int index)
@@ -534,7 +534,7 @@
      * @return the element previously at the specified position.
      *
      * @exception IndexOutOfBoundsException if the index is out of
-     *            range (index < 0 || index >= size()).
+     *            range (index &lt; 0 || index &gt;= size()).
      */
 
     public int set(final int index, final int element)
