diff --git a/poi-ooxml/build.gradle b/poi-ooxml/build.gradle
index 5571000..9f67a73 100644
--- a/poi-ooxml/build.gradle
+++ b/poi-ooxml/build.gradle
@@ -49,10 +49,9 @@
             exclude group: 'xml-apis', module: 'xml-apis'
         }
     }
-
     broken
-
     tests
+    javadocs
 }
 
 dependencies {
@@ -87,6 +86,9 @@
     testImplementation 'com.google.guava:guava:30.0-jre'
 
     broken "org.apache.xmlgraphics:batik-script:${batikVersion}"
+
+    javadocs project(':poi')
+    javadocs project(':poi-scratchpad')
 }
 
 final String MODULE_NAME = 'org.apache.poi.ooxml'
@@ -208,11 +210,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-ooxml/src/main/java/org/apache/poi/ooxml/util/XPathHelper.java b/poi-ooxml/src/main/java/org/apache/poi/ooxml/util/XPathHelper.java
index 6677f01..c374c12 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/ooxml/util/XPathHelper.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/ooxml/util/XPathHelper.java
@@ -73,7 +73,7 @@
     /**
      * Internal code - API may change any time!
      * <p>
-     * The {@link #selectProperty(Class, String)} xquery method has some performance penalties,
+     * The XSLFShape.selectProperty(Class, String) xquery method has some performance penalties,
      * which can be workaround by using {@link XmlCursor}. This method also takes into account
      * that {@code AlternateContent} tags can occur anywhere on the given path.
      * <p>
@@ -83,8 +83,7 @@
      *     <li>searching for a AlternateContent.Choice child</li>
      *     <li>searching for a AlternateContent.Fallback child</li>
      * </ul>
-     * Currently POI OOXML is based on the first edition of the ECMA 376 schema, which doesn't
-     * allow AlternateContent tags to show up everywhere. The factory flag is
+     * The factory flag is
      * a workaround to process files based on a later edition. But it comes with the drawback:
      * any change on the returned XmlObject aren't saved back to the underlying document -
      * so it's a non updatable clone. If factory is null, a XmlException is
diff --git a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/PackagePartName.java b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/PackagePartName.java
index d2d38b0..a5270c0 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/PackagePartName.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/PackagePartName.java
@@ -244,7 +244,7 @@
 		String[] segments = partUri.toASCIIString()
 	        .replaceFirst("^"+PackagingURIHelper.FORWARD_SLASH_CHAR,"")
 	        .split(PackagingURIHelper.FORWARD_SLASH_STRING);
-		
+
 		if (segments.length < 1) {
             throw new InvalidFormatException(
 				"A part name shall not have empty segments [M1.3]: " + partUri.getPath());
@@ -306,13 +306,13 @@
             ) {
 			    continue;
 			}
-			
+
 
 			if (c != '%') {
 	            throw new InvalidFormatException(
                     "A segment shall not hold any characters other than pchar characters. [M1.6]");
-			}			    
-			    
+			}
+
 			// We certainly found an encoded character, check for length
 			// now ( '%' HEXDIGIT HEXDIGIT)
 			if ((length - i) < 2 || !isHexDigit(segment.charAt(i+1)) || !isHexDigit(segment.charAt(i+2))) {
@@ -341,7 +341,7 @@
 			}
 		}
 	}
-    
+
 	/**
 	 * Throws an exception if the specified part name doesn't start with a
 	 * forward slash character '/'. [M1.4]
@@ -415,7 +415,7 @@
 
 	/**
 	 * Retrieves the extension of the part name if any. If there is no extension
-	 * returns an empty String. Example : '/document/content.xml' => 'xml'
+	 * returns an empty String. Example : '/document/content.xml' =&gt; 'xml'
 	 *
 	 * @return The extension of the part name.
 	 */
@@ -526,7 +526,7 @@
             // (non-null) > (null)
             return 1;
         }
-        
+
         if (str1.equalsIgnoreCase(str2)) {
             return 0;
         }
@@ -569,7 +569,7 @@
     private static boolean isDigitOrLetter(char c) {
         return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z');
     }
-    
+
     private static boolean isHexDigit(char c) {
         return (c >= '0' && c <= '9') || (c >= 'A' && c <= 'F') || (c >= 'a' && c <= 'f');
     }
diff --git a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/PackagingURIHelper.java b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/PackagingURIHelper.java
index bd1bce1..58231a1 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/PackagingURIHelper.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/PackagingURIHelper.java
@@ -262,8 +262,8 @@
      *         This flag violates [M1.4]: A part name shall start with a forward slash ('/') character, but
      *         allows generating URIs compatible with MS Office and OpenOffice.
      * @return A fully relativize part name URI ('word/media/image1.gif',
-     *         '/word/document.xml' => 'media/image1.gif') else
-     *         <code>null</code>.
+     *         '/word/document.xml' =&gt; 'media/image1.gif') else
+     *         {@code null}.
      */
     public static URI relativizeURI(URI sourceURI, URI targetURI, boolean msCompatible) {
         StringBuilder retVal = new StringBuilder();
@@ -390,8 +390,8 @@
      * @param targetURI
      *            The target part URI.
      * @return A fully relativize part name URI ('word/media/image1.gif',
-     *         '/word/document.xml' => 'media/image1.gif') else
-     *         <code>null</code>.
+     *         '/word/document.xml' =&gt; 'media/image1.gif') else
+     *         {@code null}.
      */
     public static URI relativizeURI(URI sourceURI, URI targetURI) {
         return relativizeURI(sourceURI, targetURI, false);
@@ -620,7 +620,7 @@
 
     /**
      * Build a part name where the relationship should be stored ((ex
-     * /word/document.xml -> /word/_rels/document.xml.rels)
+     * /word/document.xml -&gt; /word/_rels/document.xml.rels)
      *
      * @param partName
      *            Source part URI
@@ -728,10 +728,10 @@
      * percent-encode white spaces and characters above 0x80.
      * <p>
      *   Examples:
-     *   <blockquote><pre>
+     *   <pre>{@code
      *   'Apache POI' --> 'Apache%20POI'
      *   'Apache\u0410POI' --> 'Apache%04%10POI'
-     *   </pre></blockquote>
+     *   }</pre>
      * @param s the string to encode
      * @return  the encoded string
      */
diff --git a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/ContentTypeManager.java b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/ContentTypeManager.java
index 5b35684..f9df88d 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/ContentTypeManager.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/ContentTypeManager.java
@@ -114,7 +114,7 @@
     }
 
     /**
-     * Build association extention-> content type (will be stored in
+     * Build association extension-&gt; content type (will be stored in
      * [Content_Types].xml) for example ContentType="image/png" Extension="png"
      * <p>
      * [M2.8]: When adding a new part to a package, the package implementer
@@ -286,7 +286,7 @@
             throw new IllegalArgumentException("contentType");
         }
 
-        return (this.defaultContentType.containsValue(contentType) || 
+        return (this.defaultContentType.containsValue(contentType) ||
                 (this.overrideContentType != null && this.overrideContentType.containsValue(contentType)));
     }
 
diff --git a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java
index 278bffd..20d30c4 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/openxml4j/opc/internal/unmarshallers/PackagePropertiesUnmarshaller.java
@@ -217,23 +217,22 @@
 	 * <p>
 	 * Rule M4.2: A format consumer shall consider the use of the Markup
 	 * Compatibility namespace to be an error.
-	 * </p><p>
+	 * <p>
 	 * Rule M4.3: Producers shall not create a document element that contains
 	 * refinements to the Dublin Core elements, except for the two specified in
-	 * the schema: <dcterms:created> and <dcterms:modified> Consumers shall
+	 * the schema: &lt;dcterms:created&gt; and &lt;dcterms:modified&gt; Consumers shall
 	 * consider a document element that violates this constraint to be an error.
-	 * </p><p>
+	 * <p>
 	 * Rule M4.4: Producers shall not create a document element that contains
 	 * the xml:lang attribute. Consumers shall consider a document element that
 	 * violates this constraint to be an error.
-	 *  </p><p>
+	 * <p>
 	 * Rule M4.5: Producers shall not create a document element that contains
-	 * the xsi:type attribute, except for a <dcterms:created> or
-	 * <dcterms:modified> element where the xsi:type attribute shall be present
+	 * the xsi:type attribute, except for a &lt;dcterms:created&gt; or
+	 * &lt;dcterms:modified&gt; element where the xsi:type attribute shall be present
 	 * and shall hold the value dcterms:W3CDTF, where dcterms is the namespace
 	 * prefix of the Dublin Core namespace. Consumers shall consider a document
 	 * element that violates this constraint to be an error.
-	 * </p>
 	 */
 	public void checkElementForOPCCompliance(Element el)
 			throws InvalidFormatException {
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java
index bcc30c3..b501cb8 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/eventusermodel/ReadOnlySharedStringsTable.java
@@ -46,37 +46,37 @@
  * <p>Note that each SI entry can have multiple T elements, if the
  *  string is made up of bits with different formatting.
  * <p>Example input:
- * <pre>
-&lt;?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
-&lt;sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="2" uniqueCount="2">
- &lt;si>
-   &lt;r>
-     &lt;rPr>
-       &lt;b />
-       &lt;sz val="11" />
-       &lt;color theme="1" />
-       &lt;rFont val="Calibri" />
-       &lt;family val="2" />
-       &lt;scheme val="minor" />
-     &lt;/rPr>
-     &lt;t>This:&lt;/t>
-   &lt;/r>
-   &lt;r>
-     &lt;rPr>
-       &lt;sz val="11" />
-       &lt;color theme="1" />
-       &lt;rFont val="Calibri" />
-       &lt;family val="2" />
-       &lt;scheme val="minor" />
-     &lt;/rPr>
-     &lt;t xml:space="preserve">Causes Problems&lt;/t>
-   &lt;/r>
- &lt;/si>
- &lt;si>
-   &lt;t>This does not&lt;/t>
- &lt;/si>
-&lt;/sst>
-* </pre>
+ * <pre>{@code
+ * <?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+ *     <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="2" uniqueCount="2">
+ *         <si>
+ *             <r>
+ *                 <rPr>
+ *                     <b />
+ *                     <sz val="11" />
+ *                     <color theme="1" />
+ *                     <rFont val="Calibri" />
+ *                     <family val="2" />
+ *                     <scheme val="minor" />
+ *                 </rPr>
+ *                 <t>This:</t>
+ *             </r>
+ *             <r>
+ *                 <rPr>
+ *                     <sz val="11" />
+ *                     <color theme="1" />
+ *                     <rFont val="Calibri" />
+ *                     <family val="2" />
+ *                     <scheme val="minor" />
+ *                 </rPr>
+ *                 <t xml:space="preserve">Causes Problems</t>
+ *             </r>
+ *         </si>
+ *         <si>
+ *             <t>This does not</t>
+ *         </si>
+ *     </sst>
+ *  }</pre>
  *
  */
 public class ReadOnlySharedStringsTable extends DefaultHandler implements SharedStrings {
@@ -157,7 +157,7 @@
         this.includePhoneticRuns = includePhoneticRuns;
         readFrom(part.getInputStream());
     }
-    
+
     /**
      * Read this shared strings table from an XML file.
      *
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/model/StylesTable.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/model/StylesTable.java
index a007608..767b69e 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/model/StylesTable.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/model/StylesTable.java
@@ -89,8 +89,8 @@
      * Changes the maximum number of data formats that may be in a style table
      *
      * @param num the upper limit on number of data formats in the styles table when adding new data formats
-     * @throws IllegalArgumentException if <code>num</code> < 0
-     * @throws IllegalStateException if <code>num</code> < current number of data formats in the style table.
+     * @throws IllegalArgumentException if {@code num < 0}
+     * @throws IllegalStateException if {@code num < current number of data formats in the style table}.
      * Data formats must be explicitly removed before the limit can be decreased.
      */
     public void setMaxNumberOfDataFormats(int num) {
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFRow.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFRow.java
index 8d6e903..531261e 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFRow.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/streaming/SXSSFRow.java
@@ -113,11 +113,11 @@
      * Use this to create new cells within the row and return it.
      * <p>
      * The cell that is returned is a {@link CellType#BLANK}. The type can be changed
-     * either through calling <code>setCellValue</code> or <code>setCellType</code>.
+     * either through calling {@code setCellValue} or {@code setCellType}.
      *
      * @param column - the column number this cell represents
      * @return Cell a high level representation of the created cell.
-     * @throws IllegalArgumentException if columnIndex < 0 or greater than the maximum number of supported columns
+     * @throws IllegalArgumentException if columnIndex &lt; 0 or greater than the maximum number of supported columns
      * (255 for *.xls, 1048576 for *.xlsx)
      */
     @Override
@@ -134,7 +134,7 @@
      *
      * @param column - the column number this cell represents
      * @return Cell a high level representation of the created cell.
-     * @throws IllegalArgumentException if columnIndex < 0 or greater than a maximum number of supported columns
+     * @throws IllegalArgumentException if columnIndex &lt; 0 or greater than a maximum number of supported columns
      * (255 for *.xls, 1048576 for *.xlsx)
      */
     @Override
@@ -192,7 +192,7 @@
      * Set the row number of this row.
      *
      * @param rowNum  the row number (0-based)
-     * @throws IllegalArgumentException if rowNum < 0
+     * @throws IllegalArgumentException if rowNum &lt; 0
      */
     @Override
     public void setRowNum(int rowNum)
@@ -232,7 +232,7 @@
      * Returns the cell at the given (0 based) index, with the specified {@link org.apache.poi.ss.usermodel.Row.MissingCellPolicy}
      *
      * @return the cell at the given (0 based) index
-     * @throws IllegalArgumentException if cellnum < 0 or the specified MissingCellPolicy is invalid
+     * @throws IllegalArgumentException if cellnum &lt; 0 or the specified MissingCellPolicy is invalid
      */
     @Override
     public SXSSFCell getCell(int cellnum, MissingCellPolicy policy)
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDxfStyleProvider.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDxfStyleProvider.java
index c68f16e..72fe895 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDxfStyleProvider.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFDxfStyleProvider.java
@@ -29,18 +29,18 @@
  * Style based on a dxf record - e.g. table style element or conditional formatting rule
  */
 public class XSSFDxfStyleProvider implements DifferentialStyleProvider {
-    
+
     private final IndexedColorMap colorMap;
     private final BorderFormatting border;
     private final FontFormatting font;
     private final ExcelNumberFormat number;
     private final PatternFormatting fill;
     private final int stripeSize;
-    
+
     /**
      * @param dxf
-     * @param stripeSize 0 for non-stripe styles, > 1 for stripes
-     * @param colorMap 
+     * @param stripeSize 0 for non-stripe styles, &gt; 1 for stripes
+     * @param colorMap
      */
     public XSSFDxfStyleProvider(CTDxf dxf, int stripeSize, IndexedColorMap colorMap) {
         this.stripeSize = stripeSize;
@@ -51,15 +51,15 @@
             number = null;
             fill = null;
         } else {
-            border = dxf.isSetBorder() ? new XSSFBorderFormatting(dxf.getBorder(), colorMap) : null; 
-            font = dxf.isSetFont() ? new XSSFFontFormatting(dxf.getFont(), colorMap) : null; 
+            border = dxf.isSetBorder() ? new XSSFBorderFormatting(dxf.getBorder(), colorMap) : null;
+            font = dxf.isSetFont() ? new XSSFFontFormatting(dxf.getFont(), colorMap) : null;
             if (dxf.isSetNumFmt()) {
                 CTNumFmt numFmt = dxf.getNumFmt();
                 number = new ExcelNumberFormat((int) numFmt.getNumFmtId(), numFmt.getFormatCode());
             } else {
                 number = null;
             }
-            fill = dxf.isSetFill() ? new XSSFPatternFormatting(dxf.getFill(), colorMap) : null; 
+            fill = dxf.isSetFill() ? new XSSFPatternFormatting(dxf.getFill(), colorMap) : null;
         }
     }
 
@@ -78,7 +78,7 @@
     public PatternFormatting getPatternFormatting() {
         return fill;
     }
-    
+
     public int getStripeSize() {
         return stripeSize;
     }
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java
index d71641b..432ee01 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRichTextString.java
@@ -442,7 +442,7 @@
 
     /**
      *
-     * CTRPrElt --> CTFont adapter
+     * CTRPrElt --&gt; CTFont adapter
      */
     protected static CTFont toCTFont(CTRPrElt pr){
         CTFont ctFont =  CTFont.Factory.newInstance();
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRow.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRow.java
index 2e285dc..cfda49b 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRow.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/XSSFRow.java
@@ -190,7 +190,7 @@
      * </p>
      * @param columnIndex - the column number this cell represents
      * @return Cell a high level representation of the created cell.
-     * @throws IllegalArgumentException if columnIndex < 0 or greater than 16384,
+     * @throws IllegalArgumentException if columnIndex &lt; 0 or greater than 16384,
      *   the maximum number of columns supported by the SpreadsheetML format (.xlsx)
      */
     @Override
@@ -204,7 +204,7 @@
      * @param columnIndex - the column number this cell represents
      * @param type - the cell's data type
      * @return XSSFCell a high level representation of the created cell.
-     * @throws IllegalArgumentException if the specified cell type is invalid, columnIndex < 0
+     * @throws IllegalArgumentException if the specified cell type is invalid, columnIndex &lt; 0
      *   or greater than 16384, the maximum number of columns supported by the SpreadsheetML format (.xlsx)
      */
     @Override
@@ -412,7 +412,7 @@
      * Set the row number of this row.
      *
      * @param rowIndex  the row number (0-based)
-     * @throws IllegalArgumentException if rowNum < 0 or greater than 1048575
+     * @throws IllegalArgumentException if rowNum &lt; 0 or greater than 1048575
      */
     @Override
     public void setRowNum(int rowIndex) {
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/extensions/XSSFHeaderFooter.java b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/extensions/XSSFHeaderFooter.java
index 2ab58f6..b404ac4 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/extensions/XSSFHeaderFooter.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xssf/usermodel/extensions/XSSFHeaderFooter.java
@@ -37,84 +37,84 @@
  *</p>
  *
  * This example shows the text "Center Bold Header" on the first line (center
- * section), and the date on the second line (center section). &CCenter
- * &"-,Bold"Bold &"-,Regular"Header_x000A_&D
+ * section), and the date on the second line (center section). &amp;CCenter
+ * &amp;"-,Bold"Bold &amp;"-,Regular"Header_x000A_&amp;D
  *
  * <b>General Rules:</b> There is no required order in which these codes must
  * appear. The first occurrence of the following codes turns the formatting ON,
  * the second occurrence turns it OFF again:
  *
  * <dl>
- * <dt>&L</dt>
+ * <dt>&amp;L</dt>
  * <dd>code for "left section" (there are three header / footer locations,
  * "left", "center", and "right"). When two or more occurrences of this section
  * marker exist, the contents from all markers are concatenated, in the order of
  * appearance, and placed into the left section.</dd>
- * <dt>&P</dt>
+ * <dt>&amp;P</dt>
  * <dd>code for "current page #"</dd>
- * <dt>&N</dt>
+ * <dt>&amp;N</dt>
  * <dd>code for "total pages"</dd>
- * <dt>&font size</dt>
+ * <dt>&amp;font size</dt>
  * <dd>code for "text font size", where font size is a font size in points.</dd>
- * <dt>&K</dt>
+ * <dt>&amp;K</dt>
  * <dd>code for "text font color" RGB Color is specified as RRGGBB Theme Color
  * is specifed as TTSNN where TT is the theme color Id, S is either "+" or "-"
  * of the tint/shade value, NN is the tint/shade value.</dd>
- * <dt>&S</dt>
+ * <dt>&amp;S</dt>
  * <dd>code for "text strikethrough" on / off</dd>
- * <dt>&X</dt>
+ * <dt>&amp;X</dt>
  * <dd>code for "text super script" on / off</dd>
- * <dt>&Y</dt>
+ * <dt>&amp;Y</dt>
  * <dd>code for "text subscript" on / off</dd>
- * <dt>&C</dt>
+ * <dt>&amp;C</dt>
  * <dd>code for "center section". When two or more occurrences of this section
  * marker exist, the contents from all markers are concatenated, in the order of
  * appearance, and placed into the center section. SpreadsheetML Reference
  * Material - Worksheets 1966</dd>
- * <dt>&D</dt>
+ * <dt>&amp;D</dt>
  * <dd>code for "date"</dd>
- * <dt>&T</dt>
+ * <dt>&amp;T</dt>
  * <dd>code for "time"</dd>
- * <dt>&G</dt>
+ * <dt>&amp;G</dt>
  * <dd>code for "picture as background"</dd>
- * <dt>&U</dt>
+ * <dt>&amp;U</dt>
  * <dd>code for "text single underline"</dd>
- * <dt>&E</dt>
+ * <dt>&amp;E</dt>
  * <dd>code for "double underline"</dd>
- * <dt>&R</dt>
+ * <dt>&amp;R</dt>
  * <dd>code for "right section". When two or more occurrences of this section
  * marker exist, the contents from all markers are concatenated, in the order of
  * appearance, and placed into the right section.</dd>
- * <dt>&Z</dt>
+ * <dt>&amp;Z</dt>
  * <dd>code for "this workbook's file path"</dd>
- * <dt>&F</dt>
+ * <dt>&amp;F</dt>
  * <dd>code for "this workbook's file name"</dd>
- * <dt>&A</dt>
+ * <dt>&amp;A</dt>
  * <dd>code for "sheet tab name"</dd>
- * <dt>&+</dt>
+ * <dt>&amp;+</dt>
  * <dd>code for add to page #.</dd>
- * <dt>&-</dt>
+ * <dt>&amp;-</dt>
  * <dd>code for subtract from page #.</dd>
- * <dt>&"font name,font type" - code for "text font name" and "text font type",
+ * <dt>&amp;"font name,font type" - code for "text font name" and "text font type",
  * where font name and font type are strings specifying the name and type of the
  * font, separated by a comma. When a hyphen appears in font name, it means
  * "none specified". Both of font name and font type can be localized
- * values.</dd>
- * <dt>&"-,Bold"</dt>
+ * values.</dt>
+ * <dt>&amp;"-,Bold"</dt>
  * <dd>code for "bold font style"</dd>
- * <dt>&B</dt>
+ * <dt>&amp;B</dt>
  * <dd>also means "bold font style"</dd>
- * <dt>&"-,Regular"</dt>
+ * <dt>&amp;"-,Regular"</dt>
  * <dd>code for "regular font style"</dd>
- * <dt>&"-,Italic"</dt>
+ * <dt>&amp;"-,Italic"</dt>
  * <dd>code for "italic font style"</dd>
- * <dt>&I</dt>
+ * <dt>&amp;I</dt>
  * <dd>also means "italic font style"</dd>
- * <dt>&"-,Bold Italic"</dt>
+ * <dt>&amp;"-,Bold Italic"</dt>
  * <dd>code for "bold italic font style"</dd>
- * <dt>&O</dt>
+ * <dt>&amp;O</dt>
  * <dd>code for "outline style"</dd>
- * <dt>&H</dt>
+ * <dt>&amp;H</dt>
  * <dd>code for "shadow style"</dd>
  * </dl>
  *
@@ -125,7 +125,7 @@
 	private CTHeaderFooter headerFooter;
 
 	private boolean stripFields;
-	
+
 	/**
 	 * Create an instance of XSSFAbstractHeaderFooter from the supplied XML bean
 	 *
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/ICell.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/ICell.java
index c89f939..b6fa330 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/ICell.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/ICell.java
@@ -21,7 +21,7 @@
  * {@link XWPFTableCell}, {@link XWPFSDTCell}
  * <p>
  * Schematically something like this:
- * &lt;tr&gt;&lt;tc/&gt;&lt;tc/&gt;&lt;sdt&gt&lt;tc/&gt;&lt;/sdt&gt;&lt;/tr&gt;
+ * {@code <tr><tc/><tc/><sdt><tc/></sdt></tr>}
  */
 public interface ICell {
 }
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFAbstractFootnoteEndnote.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFAbstractFootnoteEndnote.java
index ff509ec..d1a86f2 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFAbstractFootnoteEndnote.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFAbstractFootnoteEndnote.java
@@ -35,7 +35,7 @@
 
 /**
  * Base class for both bottom-of-the-page footnotes {@link XWPFFootnote} and end
- * notes {@link XWPFEndnote}). 
+ * notes {@link XWPFEndnote}).
  * <p>The only significant difference between footnotes and
  * end notes is which part they go on. Footnotes are managed by the Footnotes part
  * {@link XWPFFootnotes} and end notes are managed by the Endnotes part {@link XWPFEndnotes}.</p>
@@ -43,10 +43,10 @@
  */
 public abstract class XWPFAbstractFootnoteEndnote  implements Iterable<XWPFParagraph>, IBody {
 
-    private List<XWPFParagraph> paragraphs = new ArrayList<>();
-    private List<XWPFTable> tables = new ArrayList<>();
-    private List<XWPFPictureData> pictures = new ArrayList<>();
-    private List<IBodyElement> bodyElements = new ArrayList<>();
+    private final List<XWPFParagraph> paragraphs = new ArrayList<>();
+    private final List<XWPFTable> tables = new ArrayList<>();
+    private final List<XWPFPictureData> pictures = new ArrayList<>();
+    private final List<IBodyElement> bodyElements = new ArrayList<>();
     protected CTFtnEdn ctFtnEdn;
     protected XWPFAbstractFootnotesEndnotes footnotes;
     protected XWPFDocument document;
@@ -98,6 +98,7 @@
      * Get the list of {@link XWPFParagraph}s in the footnote.
      * @return List of paragraphs
      */
+    @Override
     public List<XWPFParagraph> getParagraphs() {
         return paragraphs;
     }
@@ -106,6 +107,7 @@
      * Get an iterator over the {@link XWPFParagraph}s in the footnote.
      * @return Iterator over the paragraph list.
      */
+    @Override
     public Iterator<XWPFParagraph> iterator() {
         return paragraphs.iterator();
     }
@@ -114,6 +116,7 @@
      * Get the list of {@link XWPFTable}s in the footnote.
      * @return List of tables
      */
+    @Override
     public List<XWPFTable> getTables() {
         return tables;
     }
@@ -130,6 +133,7 @@
      * Gets the body elements ({@link IBodyElement}) of the footnote.
      * @return List of body elements.
      */
+    @Override
     public List<IBodyElement> getBodyElements() {
         return bodyElements;
     }
@@ -144,7 +148,7 @@
 
     /**
      * Set the underlying CTFtnEdn for the footnote.
-     * <p>Use {@link XWPFDocument#createFootnote()} to create new footnotes.</p> 
+     * <p>Use {@link XWPFDocument#createFootnote()} to create new footnotes.</p>
      * @param footnote The CTFtnEdn object that will underly the footnote.
      */
     public void setCTFtnEdn(CTFtnEdn footnote) {
@@ -155,8 +159,8 @@
      * Gets the {@link XWPFTable} at the specified position from the footnote's table array.
      * @param pos in table array
      * @return The {@link XWPFTable} at position pos, or null if there is no table at position pos.
-     * @see org.apache.poi.xwpf.usermodel.IBody#getTableArray(int)
      */
+    @Override
     public XWPFTable getTableArray(int pos) {
         if (pos >= 0 && pos < tables.size()) {
             return tables.get(pos);
@@ -165,12 +169,12 @@
     }
 
     /**
-     * Inserts an existing {@link XWPFTable) into the arrays bodyElements and tables.
+     * Inserts an existing XWPFTable into the arrays bodyElements and tables.
      *
      * @param pos Position, in the bodyElements array, to insert the table
-     * @param table {@link XWPFTable) to be inserted
-     * @see org.apache.poi.xwpf.usermodel.IBody#insertTable(int pos, XWPFTable table)
+     * @param table XWPFTable to be inserted
      */
+    @Override
     public void insertTable(int pos, XWPFTable table) {
         bodyElements.add(pos, table);
         int i = 0;
@@ -185,14 +189,12 @@
     }
 
     /**
-     * if there is a corresponding {@link XWPFTable} of the parameter 
+     * if there is a corresponding {@link XWPFTable} of the parameter
      * ctTable in the tableList of this header
-     * the method will return this table, or null if there is no 
+     * the method will return this table, or null if there is no
      * corresponding {@link XWPFTable}.
-     *
-     * @param ctTable
-     * @see org.apache.poi.xwpf.usermodel.IBody#getTable(CTTbl ctTable)
      */
+    @Override
     public XWPFTable getTable(CTTbl ctTable) {
         for (XWPFTable table : tables) {
             if (table == null)
@@ -216,9 +218,8 @@
      * Returns the {@link XWPFParagraph} at position pos in footnote's paragraph array.
      * @param pos Array position of the paragraph to get.
      * @return the {@link XWPFParagraph} at position pos, or null if there is no paragraph at that position.
-     *
-     * @see org.apache.poi.xwpf.usermodel.IBody#getParagraphArray(int pos)
      */
+    @Override
     public XWPFParagraph getParagraphArray(int pos) {
         if(pos >=0 && pos < paragraphs.size()) {
             return paragraphs.get(pos);
@@ -229,10 +230,9 @@
     /**
      * get the {@link XWPFTableCell} that belongs to the CTTc cell.
      *
-     * @param cell
      * @return {@link XWPFTableCell} that corresponds to the CTTc cell, if there is one, otherwise null.
-     * @see org.apache.poi.xwpf.usermodel.IBody#getTableCell(CTTc cell)
      */
+    @Override
     public XWPFTableCell getTableCell(CTTc cell) {
         XmlCursor cursor = cell.newCursor();
         cursor.toParent();
@@ -262,7 +262,6 @@
     /**
      * Verifies that cursor is on the right position.
      *
-     * @param cursor
      * @return true if the cursor is within a CTFtnEdn element.
      */
     private boolean isCursorInFtn(XmlCursor cursor) {
@@ -284,10 +283,9 @@
 
     /**
      * Insert a table constructed from OOXML table markup.
-     * @param cursor
      * @return the inserted {@link XWPFTable}
-     * @see org.apache.poi.xwpf.usermodel.IBody#insertNewTbl(XmlCursor cursor)
      */
+    @Override
     public XWPFTable insertNewTbl(XmlCursor cursor) {
         if (isCursorInFtn(cursor)) {
             String uri = CTTbl.type.getName().getNamespaceURI();
@@ -327,10 +325,9 @@
     /**
      * Add a new {@link XWPFParagraph} at position of the cursor.
      *
-     * @param cursor
      * @return The inserted {@link XWPFParagraph}
-     * @see org.apache.poi.xwpf.usermodel.IBody#insertNewParagraph(XmlCursor cursor)
      */
+    @Override
     public XWPFParagraph insertNewParagraph(final XmlCursor cursor) {
         if (isCursorInFtn(cursor)) {
             String uri = CTP.type.getName().getNamespaceURI();
@@ -398,8 +395,8 @@
 
     /**
      * Get the {@link XWPFDocument} the footnote is part of.
-     * @see org.apache.poi.xwpf.usermodel.IBody#getXWPFDocument()
      */
+    @Override
     public XWPFDocument getXWPFDocument() {
         return document;
     }
@@ -407,9 +404,8 @@
     /**
      * Get the Part to which the footnote belongs, which you need for adding relationships to other parts
      * @return {@link POIXMLDocumentPart} that contains the footnote.
-     *
-     * @see org.apache.poi.xwpf.usermodel.IBody#getPart()
      */
+    @Override
     public POIXMLDocumentPart getPart() {
         return footnotes;
     }
@@ -417,9 +413,8 @@
     /**
      * Get the part type  {@link BodyType} of the footnote.
      * @return The {@link BodyType} value.
-     *
-     * @see org.apache.poi.xwpf.usermodel.IBody#getPartType()
      */
+    @Override
     public BodyType getPartType() {
         return BodyType.FOOTNOTE;
     }
@@ -447,7 +442,7 @@
         paragraphs.add(p);
         bodyElements.add(p);
 
-        // If the paragraph is the first paragraph in the footnote, 
+        // If the paragraph is the first paragraph in the footnote,
         // ensure that it has a footnote reference run.
 
         if (p.equals(getParagraphs().get(0))) {
@@ -459,9 +454,9 @@
     /**
      * Ensure that the specified paragraph has a reference marker for this
      * footnote by adding a footnote reference if one is not found.
-     * <p>This method is for the first paragraph in the footnote, not 
+     * <p>This method is for the first paragraph in the footnote, not
      * paragraphs that will refer to the footnote. For references to
-     * the footnote, use {@link XWPFParagraph#addFootnoteReference(XWPFFootnote)}.
+     * the footnote, use {@link XWPFParagraph#addFootnoteReference(XWPFAbstractFootnoteEndnote)}.
      * </p>
      * <p>The first run of the first paragraph in a footnote should
      * contain a {@link CTFtnEdnRef} object.</p>
@@ -491,7 +486,7 @@
     /**
      * Appends a new {@link XWPFTable} to this footnote
      * @param rows Number of rows to initialize the table with
-     * @param cols Number of columns to initialize the table with 
+     * @param cols Number of columns to initialize the table with
      * @return the new {@link XWPFTable} with the specified number of rows and columns
      * @since 4.0.0
      */
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFEndnote.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFEndnote.java
index f18c1c1..7c24e85 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFEndnote.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFEndnote.java
@@ -26,14 +26,14 @@
  * <p>End notes are collected at the end of a document or section rather than
  * at the bottom of a page.</p>
  * <p>Create a new footnote using {@link XWPFDocument#createEndnote()} or
- * {@link XWPFEndnotes#createFootnote()}.</p>
+ * {@link XWPFEndnotes#createEndnote()}.</p>
  * <p>The first body element of a footnote should (or possibly must) be a paragraph
  * with the first run containing a CTFtnEdnRef object. The {@link XWPFFootnote#createParagraph()}
  * and {@link XWPFFootnote#createTable()} methods do this for you.</p>
  * <p>Footnotes have IDs that are unique across all footnotes in the document. You use
  * the footnote ID to create a reference to a footnote from within a paragraph.</p>
  * <p>To create a reference to a footnote within a paragraph you create a run
- * with a CTFtnEdnRef that specifies the ID of the target paragraph. 
+ * with a CTFtnEdnRef that specifies the ID of the target paragraph.
  * The {@link XWPFParagraph#addFootnoteReference(XWPFAbstractFootnoteEndnote)}
  * method does this for you.</p>
  * @since 4.0.0
@@ -55,9 +55,9 @@
     /**
      * Ensure that the specified paragraph has a reference marker for this
      * end note by adding a footnote reference if one is not found.
-     * <p>This method is for the first paragraph in the footnote, not 
+     * <p>This method is for the first paragraph in the footnote, not
      * paragraphs that will refer to the footnote. For references to
-     * the footnote, use {@link XWPFParagraph#addFootnoteReference(XWPFAbstractFootnoteEndnote))}.
+     * the footnote, use {@link XWPFParagraph#addFootnoteReference(XWPFAbstractFootnoteEndnote)}.
      * </p>
      * <p>The first run of the first paragraph in a footnote should
      * contain a {@link CTFtnEdnRef} object.</p>
@@ -66,7 +66,7 @@
      * @since 4.0.0
        */
     public void ensureFootnoteRef(XWPFParagraph p) {
-        
+
         XWPFRun r = null;
         if (p.getRuns().size() > 0) {
             r = p.getRuns().get(0);
@@ -86,7 +86,7 @@
             ctr.addNewRPr().addNewRStyle().setVal("FootnoteReference");
             ctr.addNewEndnoteRef();
         }
-        
+
     }
 
 }
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFFootnote.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFFootnote.java
index 77459ec..52584c3 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFFootnote.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFFootnote.java
@@ -31,12 +31,12 @@
  * <p>Footnotes have IDs that are unique across all footnotes in the document. You use
  * the footnote ID to create a reference to a footnote from within a paragraph.</p>
  * <p>To create a reference to a footnote within a paragraph you create a run
- * with a CTFtnEdnRef that specifies the ID of the target paragraph. 
+ * with a CTFtnEdnRef that specifies the ID of the target paragraph.
  * The {@link XWPFParagraph#addFootnoteReference(XWPFAbstractFootnoteEndnote)}
  * method does this for you.</p>
  */
 public class XWPFFootnote extends XWPFAbstractFootnoteEndnote {
-    
+
     @Internal
     public XWPFFootnote(CTFtnEdn note, XWPFAbstractFootnotesEndnotes xFootnotes) {
         super(note, xFootnotes);
@@ -46,13 +46,13 @@
     public XWPFFootnote(XWPFDocument document, CTFtnEdn body) {
         super(document, body);
     }
-    
+
     /**
      * Ensure that the specified paragraph has a reference marker for this
      * footnote by adding a footnote reference if one is not found.
-     * <p>This method is for the first paragraph in the footnote, not 
+     * <p>This method is for the first paragraph in the footnote, not
      * paragraphs that will refer to the footnote. For references to
-     * the footnote, use {@link XWPFParagraph#addFootnoteReference(XWPFFootnote)}.
+     * the footnote, use {@link XWPFParagraph#addFootnoteReference(XWPFAbstractFootnoteEndnote)}.
      * </p>
      * <p>The first run of the first paragraph in a footnote should
      * contain a {@link CTFtnEdnRef} object.</p>
@@ -61,7 +61,7 @@
      * @since 4.0.0
        */
     public void ensureFootnoteRef(XWPFParagraph p) {
-        
+
         XWPFRun r = null;
         if (p.getRuns().size() > 0) {
             r = p.getRuns().get(0);
@@ -81,6 +81,6 @@
             ctr.addNewRPr().addNewRStyle().setVal("FootnoteReference");
             ctr.addNewFootnoteRef();
         }
-        
+
     }
 }
diff --git a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
index ee741ba..c917643 100644
--- a/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
+++ b/poi-ooxml/src/main/java/org/apache/poi/xwpf/usermodel/XWPFRun.java
@@ -215,7 +215,7 @@
 
     /**
      * @return The {@link XWPFDocument} instance, this run belongs to, or
-     * <code>null</code> if parent structure (paragraph > document) is not properly set.
+     * {@code null} if parent structure (paragraph &gt; document) is not properly set.
      */
     public XWPFDocument getDocument() {
         if (parent != null) {
@@ -258,7 +258,7 @@
      * Whether the bold property shall be applied to all non-complex script
      * characters in the contents of this run when displayed in a document
      *
-     * @return <code>true</code> if the bold property is applied
+     * @return {@code true} if the bold property is applied
      */
     @Override
     public boolean isBold() {
@@ -275,7 +275,7 @@
      * direct formatting. When used as part of a style definition, setting this
      * property shall toggle the current state of that property as specified up
      * to this point in the hierarchy (i.e. applied to not applied, and vice
-     * versa). Setting it to <code>false</code> (or an equivalent) shall
+     * versa). Setting it to {@code false} (or an equivalent) shall
      * result in the current setting remaining unchanged. However, when used as
      * direct formatting, setting this property to true or false shall set the
      * absolute state of the resulting property.
@@ -287,7 +287,7 @@
      * applied to non-complex script characters.
      * </p>
      *
-     * @param value <code>true</code> if the bold property is applied to
+     * @param value {@code true} if the bold property is applied to
      *              this run
      */
     @Override
@@ -326,7 +326,7 @@
     /**
      * Return the string content of this text run
      *
-     * @return the text of this text run or <code>null</code> if not set
+     * @return the text of this text run or {@code null} if not set
      */
     public String getText(int pos) {
         return run.sizeOfTArray() == 0 ? null : run.getTArray(pos)
@@ -368,7 +368,7 @@
      * Whether the italic property should be applied to all non-complex script
      * characters in the contents of this run when displayed in a document.
      *
-     * @return <code>true</code> if the italic property is applied
+     * @return {@code true} if the italic property is applied
      */
     @Override
     public boolean isItalic() {
@@ -380,25 +380,22 @@
      * Whether the bold property shall be applied to all non-complex script
      * characters in the contents of this run when displayed in a document
      * <p>
-     * <p>
      * This formatting property is a toggle property, which specifies that its
      * behavior differs between its use within a style definition and its use as
      * direct formatting. When used as part of a style definition, setting this
      * property shall toggle the current state of that property as specified up
      * to this point in the hierarchy (i.e. applied to not applied, and vice
-     * versa). Setting it to <code>false</code> (or an equivalent) shall
+     * versa). Setting it to {@code false} (or an equivalent) shall
      * result in the current setting remaining unchanged. However, when used as
      * direct formatting, setting this property to true or false shall set the
      * absolute state of the resulting property.
-     * </p>
      * <p>
      * If this element is not present, the default value is to leave the
      * formatting applied at previous level in the style hierarchy. If this
      * element is never applied in the style hierarchy, then bold shall not be
      * applied to non-complex script characters.
-     * </p>
      *
-     * @param value <code>true</code> if the italic property is applied to
+     * @param value {@code true} if the italic property is applied to
      *              this run
      */
     @Override
@@ -412,7 +409,7 @@
      * Get the underline setting for the run.
      *
      * @return the Underline pattern applied to this run
-     * @see (@link UnderlinePatterns}
+     * @see UnderlinePatterns
      */
     public UnderlinePatterns getUnderline() {
         UnderlinePatterns value = UnderlinePatterns.NONE;
@@ -438,10 +435,11 @@
      *
      * @param value -
      *              underline type
-     * @see {@link UnderlinePatterns} : all possible patterns that could be applied
+     * @see UnderlinePatterns
      */
     public void setUnderline(UnderlinePatterns value) {
         CTUnderline underline = getCTUnderline(true);
+        assert(underline != null);
         underline.setVal(STUnderline.Enum.forInt(value.getValue()));
     }
 
@@ -463,7 +461,8 @@
      */
     public void setUnderlineColor(String color) {
         CTUnderline underline = getCTUnderline(true);
-        SimpleValue svColor = null;
+        assert(underline != null);
+        SimpleValue svColor;
         if (color.equals("auto")) {
             STHexColorAuto hexColor = STHexColorAuto.Factory.newInstance();
             hexColor.setEnumValue(STHexColorAuto.Enum.forString(color));
@@ -484,6 +483,7 @@
      */
     public void setUnderlineThemeColor(String themeColor) {
         CTUnderline underline = getCTUnderline(true);
+        assert(underline != null);
         STThemeColor.Enum val = STThemeColor.Enum.forString(themeColor);
         if (val != null) {
             underline.setThemeColor(val);
@@ -513,6 +513,7 @@
      */
     public String getUnderlineColor() {
         CTUnderline underline = getCTUnderline(true);
+        assert(underline != null);
         String colorName = "auto";
         Object rawValue = underline.getColor();
         if (rawValue != null) {
@@ -530,7 +531,7 @@
      * Specifies that the contents of this run shall be displayed with a single
      * horizontal line through the center of the line.
      *
-     * @return <code>true</code> if the strike property is applied
+     * @return {@code true} if the strike property is applied
      */
     @Override
     public boolean isStrikeThrough() {
@@ -559,7 +560,7 @@
      * not be applied to the contents of this run.
      * </p>
      *
-     * @param value <code>true</code> if the strike property is applied to
+     * @param value {@code true} if the strike property is applied to
      *              this run
      */
     @Override
@@ -583,7 +584,7 @@
      * Specifies that the contents of this run shall be displayed with a double
      * horizontal line through the center of the line.
      *
-     * @return <code>true</code> if the double strike property is applied
+     * @return {@code true} if the double strike property is applied
      */
     @Override
     public boolean isDoubleStrikeThrough() {
@@ -714,10 +715,7 @@
             return false;
         }
         STHighlightColor.Enum val = pr.getHighlightArray(0).getVal();
-        if (val == null || val == STHighlightColor.NONE) {
-            return false;
-        }
-        return true;
+        return val != null && val != STHighlightColor.NONE;
     }
     // TODO Provide a wrapper round STHighlightColor, then expose getter/setter
     //  for the highlight colour. Ideally also then add to CharacterRun interface
@@ -1178,13 +1176,10 @@
      * this method add chart template into document
      *
      * @param chartRelId relation id of chart in document relation file
-     * @throws InvalidFormatException
-     * @throws IOException
      * @since POI 4.0.0
      */
     @Internal
-    public CTInline addChart(String chartRelId)
-            throws InvalidFormatException, IOException {
+    public CTInline addChart(String chartRelId) throws InvalidFormatException, IOException {
         try {
             CTInline inline = run.addNewDrawing().addNewInline();
 
@@ -1422,7 +1417,7 @@
     /**
      * @see <a href="http://msdn.microsoft.com/en-us/library/ff533743(v=office.12).aspx">[MS-OI29500] Run Fonts</a>
      */
-    public static enum FontCharRange {
+    public enum FontCharRange {
         ascii /* char 0-127 */,
         cs /* complex symbol */,
         eastAsia /* east asia */,
@@ -1461,7 +1456,7 @@
     /**
      * Set the highlight color for the run. Silently does nothing of colorName is not a recognized value.
      *
-     * @param colorName The name of the color as defined in the ST_HighlightColor simple type ({@link STHightlightColor})
+     * @param colorName The name of the color as defined in the ST_HighlightColor simple type ({@link STHighlightColor})
      * @since 4.0.0
      */
     public void setTextHighlightColor(String colorName) {
diff --git a/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/types/CHPAbstractType.java b/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/types/CHPAbstractType.java
index e18a3e7..4e9c83f 100644
--- a/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/types/CHPAbstractType.java
+++ b/poi-scratchpad/src/main/java/org/apache/poi/hwpf/model/types/CHPAbstractType.java
@@ -924,12 +924,7 @@
     /**
      * Emphasis mark.
      *
-     * @return One of
-     * <li>{@link #KCD_NON}
-     * <li>{@link #KCD_DOT}
-     * <li>{@link #KCD_COMMA}
-     * <li>{@link #KCD_CIRCLE}
-     * <li>{@link #KCD_UNDER_DOT}
+     * @return One of {@link #KCD_NON},{@link #KCD_DOT},{@link #KCD_COMMA},{@link #KCD_CIRCLE},{@link #KCD_UNDER_DOT}
      */
     @Internal
     public byte getKcd()
@@ -940,13 +935,7 @@
     /**
      * Emphasis mark.
      *
-     * @param field_13_kcd
-     *        One of
-     * <li>{@link #KCD_NON}
-     * <li>{@link #KCD_DOT}
-     * <li>{@link #KCD_COMMA}
-     * <li>{@link #KCD_CIRCLE}
-     * <li>{@link #KCD_UNDER_DOT}
+     * @param field_13_kcd One of {@link #KCD_NON}, {@link #KCD_DOT}, {@link #KCD_COMMA}, {@link #KCD_CIRCLE}, {@link #KCD_UNDER_DOT}
      */
     @Internal
     public void setKcd( byte field_13_kcd )
@@ -975,10 +964,7 @@
     /**
      * Superscript/subscript indices.
      *
-     * @return One of
-     * <li>{@link #ISS_NONE}
-     * <li>{@link #ISS_SUPERSCRIPTED}
-     * <li>{@link #ISS_SUBSCRIPTED}
+     * @return One of {@link #ISS_NONE},{@link #ISS_SUPERSCRIPTED},{@link #ISS_SUBSCRIPTED}
      */
     @Internal
     public byte getIss()
@@ -989,11 +975,7 @@
     /**
      * Superscript/subscript indices.
      *
-     * @param field_15_iss
-     *        One of
-     * <li>{@link #ISS_NONE}
-     * <li>{@link #ISS_SUPERSCRIPTED}
-     * <li>{@link #ISS_SUBSCRIPTED}
+     * @param field_15_iss One of {@link #ISS_NONE},{@link #ISS_SUPERSCRIPTED},{@link #ISS_SUBSCRIPTED}
      */
     @Internal
     public void setIss( byte field_15_iss )
@@ -1058,27 +1040,11 @@
     /**
      * Underline code.
      *
-     * @return One of
-     * <li>{@link #KUL_NONE}
-     * <li>{@link #KUL_SINGLE}
-     * <li>{@link #KUL_BY_WORD}
-     * <li>{@link #KUL_DOUBLE}
-     * <li>{@link #KUL_DOTTED}
-     * <li>{@link #KUL_HIDDEN}
-     * <li>{@link #KUL_THICK}
-     * <li>{@link #KUL_DASH}
-     * <li>{@link #KUL_DOT}
-     * <li>{@link #KUL_DOT_DASH}
-     * <li>{@link #KUL_DOT_DOT_DASH}
-     * <li>{@link #KUL_WAVE}
-     * <li>{@link #KUL_DOTTED_HEAVY}
-     * <li>{@link #KUL_DASHED_HEAVY}
-     * <li>{@link #KUL_DOT_DASH_HEAVY}
-     * <li>{@link #KUL_DOT_DOT_DASH_HEAVY}
-     * <li>{@link #KUL_WAVE_HEAVY}
-     * <li>{@link #KUL_DASH_LONG}
-     * <li>{@link #KUL_WAVE_DOUBLE}
-     * <li>{@link #KUL_DASH_LONG_HEAVY}
+     * @return One of {@link #KUL_NONE},{@link #KUL_SINGLE},{@link #KUL_BY_WORD},{@link #KUL_DOUBLE},
+     *      {@link #KUL_DOTTED},{@link #KUL_HIDDEN},{@link #KUL_THICK},{@link #KUL_DASH},{@link #KUL_DOT},
+     *      {@link #KUL_DOT_DASH},{@link #KUL_DOT_DOT_DASH},{@link #KUL_WAVE},{@link #KUL_DOTTED_HEAVY},
+     *      {@link #KUL_DASHED_HEAVY},{@link #KUL_DOT_DASH_HEAVY},{@link #KUL_DOT_DOT_DASH_HEAVY},
+     *      {@link #KUL_WAVE_HEAVY},{@link #KUL_DASH_LONG},{@link #KUL_WAVE_DOUBLE},{@link #KUL_DASH_LONG_HEAVY}
      */
     @Internal
     public byte getKul()
@@ -1089,28 +1055,11 @@
     /**
      * Underline code.
      *
-     * @param field_19_kul
-     *        One of
-     * <li>{@link #KUL_NONE}
-     * <li>{@link #KUL_SINGLE}
-     * <li>{@link #KUL_BY_WORD}
-     * <li>{@link #KUL_DOUBLE}
-     * <li>{@link #KUL_DOTTED}
-     * <li>{@link #KUL_HIDDEN}
-     * <li>{@link #KUL_THICK}
-     * <li>{@link #KUL_DASH}
-     * <li>{@link #KUL_DOT}
-     * <li>{@link #KUL_DOT_DASH}
-     * <li>{@link #KUL_DOT_DOT_DASH}
-     * <li>{@link #KUL_WAVE}
-     * <li>{@link #KUL_DOTTED_HEAVY}
-     * <li>{@link #KUL_DASHED_HEAVY}
-     * <li>{@link #KUL_DOT_DASH_HEAVY}
-     * <li>{@link #KUL_DOT_DOT_DASH_HEAVY}
-     * <li>{@link #KUL_WAVE_HEAVY}
-     * <li>{@link #KUL_DASH_LONG}
-     * <li>{@link #KUL_WAVE_DOUBLE}
-     * <li>{@link #KUL_DASH_LONG_HEAVY}
+     * @param field_19_kul One of,{@link #KUL_NONE},{@link #KUL_SINGLE},{@link #KUL_BY_WORD},{@link #KUL_DOUBLE},
+     *      {@link #KUL_DOTTED},{@link #KUL_HIDDEN},{@link #KUL_THICK},{@link #KUL_DASH},{@link #KUL_DOT},
+     *      {@link #KUL_DOT_DASH},{@link #KUL_DOT_DOT_DASH},{@link #KUL_WAVE},{@link #KUL_DOTTED_HEAVY},
+     *      {@link #KUL_DASHED_HEAVY},{@link #KUL_DOT_DASH_HEAVY},{@link #KUL_DOT_DOT_DASH_HEAVY},
+     *      {@link #KUL_WAVE_HEAVY},{@link #KUL_DASH_LONG},{@link #KUL_WAVE_DOUBLE},{@link #KUL_DASH_LONG_HEAVY}
      */
     @Internal
     public void setKul( byte field_19_kul )
@@ -1229,14 +1178,9 @@
     /**
      * Text animation.
      *
-     * @return One of
-     * <li>{@link #SFXTTEXT_NO}
-     * <li>{@link #SFXTTEXT_LAS_VEGAS_LIGHTS}
-     * <li>{@link #SFXTTEXT_BACKGROUND_BLINK}
-     * <li>{@link #SFXTTEXT_SPARKLE_TEXT}
-     * <li>{@link #SFXTTEXT_MARCHING_ANTS}
-     * <li>{@link #SFXTTEXT_MARCHING_RED_ANTS}
-     * <li>{@link #SFXTTEXT_SHIMMER}
+     * @return One of {@link #SFXTTEXT_NO},{@link #SFXTTEXT_LAS_VEGAS_LIGHTS},{@link #SFXTTEXT_BACKGROUND_BLINK},
+     *      {@link #SFXTTEXT_SPARKLE_TEXT},{@link #SFXTTEXT_MARCHING_ANTS},{@link #SFXTTEXT_MARCHING_RED_ANTS},
+     *      {@link #SFXTTEXT_SHIMMER}
      */
     @Internal
     public byte getSfxtText()
@@ -1247,15 +1191,7 @@
     /**
      * Text animation.
      *
-     * @param field_26_sfxtText
-     *        One of
-     * <li>{@link #SFXTTEXT_NO}
-     * <li>{@link #SFXTTEXT_LAS_VEGAS_LIGHTS}
-     * <li>{@link #SFXTTEXT_BACKGROUND_BLINK}
-     * <li>{@link #SFXTTEXT_SPARKLE_TEXT}
-     * <li>{@link #SFXTTEXT_MARCHING_ANTS}
-     * <li>{@link #SFXTTEXT_MARCHING_RED_ANTS}
-     * <li>{@link #SFXTTEXT_SHIMMER}
+     * @param field_26_sfxtText One of {@link #SFXTTEXT_NO},{@link #SFXTTEXT_LAS_VEGAS_LIGHTS},{@link #SFXTTEXT_BACKGROUND_BLINK},{@link #SFXTTEXT_SPARKLE_TEXT},{@link #SFXTTEXT_MARCHING_ANTS},{@link #SFXTTEXT_MARCHING_RED_ANTS},{@link #SFXTTEXT_SHIMMER}
      */
     @Internal
     public void setSfxtText( byte field_26_sfxtText )
@@ -1932,11 +1868,7 @@
     /**
      * Line BReak code for xchCRJ.
      *
-     * @return One of
-     * <li>{@link #LBRCRJ_NONE}
-     * <li>{@link #LBRCRJ_LEFT}
-     * <li>{@link #LBRCRJ_RIGHT}
-     * <li>{@link #LBRCRJ_BOTH}
+     * @return One of {@link #LBRCRJ_NONE},{@link #LBRCRJ_LEFT},{@link #LBRCRJ_RIGHT},{@link #LBRCRJ_BOTH}
      */
     @Internal
     public byte getLbrCRJ()
@@ -1947,12 +1879,7 @@
     /**
      * Line BReak code for xchCRJ.
      *
-     * @param field_64_lbrCRJ
-     *        One of
-     * <li>{@link #LBRCRJ_NONE}
-     * <li>{@link #LBRCRJ_LEFT}
-     * <li>{@link #LBRCRJ_RIGHT}
-     * <li>{@link #LBRCRJ_BOTH}
+     * @param field_64_lbrCRJ One of {@link #LBRCRJ_NONE},{@link #LBRCRJ_LEFT},{@link #LBRCRJ_RIGHT},{@link #LBRCRJ_BOTH}
      */
     @Internal
     public void setLbrCRJ( byte field_64_lbrCRJ )
