diff --git a/src/api.xsd b/src/api.xsd
index bb2368f..de8a301 100755
--- a/src/api.xsd
+++ b/src/api.xsd
@@ -52,6 +52,7 @@
 
 <xsd:complexType name="constructorType">
   <xsd:sequence>
+    <xsd:element name="parameter" type="paramsType" minOccurs='0' maxOccurs='unbounded'/>
     <xsd:element name="exception" type="exceptionType" minOccurs='0' maxOccurs='unbounded'/>
     <xsd:element name="doc" type="xsd:string" minOccurs='0' maxOccurs='1'/>
   </xsd:sequence>
@@ -76,7 +77,7 @@
 
 <xsd:complexType name="methodType">
   <xsd:sequence>
-    <xsd:element name="param" type="paramsType" minOccurs='0' maxOccurs='unbounded'/>
+    <xsd:element name="parameter" type="paramsType" minOccurs='0' maxOccurs='unbounded'/>
     <xsd:element name="exception" type="exceptionType" minOccurs='0' maxOccurs='unbounded'/>
     <xsd:element name="doc" type="xsd:string" minOccurs='0' maxOccurs='1'/>
   </xsd:sequence>
diff --git a/src/jdiff/API.java b/src/jdiff/API.java
index 800e752..b5cb8e2 100755
--- a/src/jdiff/API.java
+++ b/src/jdiff/API.java
@@ -4,23 +4,23 @@
 import java.util.*;
 
 /**
- * The internal representation of an API. 
- * 
- * RootDoc could have been used for representing this, but 
+ * The internal representation of an API.
+ *
+ * RootDoc could have been used for representing this, but
  * you cannot serialize a RootDoc object - see
- *  http://developer.java.sun.com/developer/bugParade/bugs/4125581.html
- * You might be able use Javadoc.Main() to create another RootDoc, but the 
+ *  https://developer.java.sun.com/developer/bugParade/bugs/4125581.html
+ * You might be able use Javadoc.Main() to create another RootDoc, but the
  * methods are package private. You can run javadoc in J2SE1.4, see:
- *  http://java.sun.com/j2se/1.4/docs/tooldocs/javadoc/standard-doclet.html#runningprogrammatically
+ *  https://java.sun.com/j2se/1.4/docs/tooldocs/javadoc/standard-doclet.html#runningprogrammatically
  * but you still can't get the RootDoc object.
  *
  * The advantage of writing out an XML representation of each API is that
  * later runs of JDiff don't have to have Javadoc scan all the files again,
- * a possibly lengthy process. XML also permits other source code in 
+ * a possibly lengthy process. XML also permits other source code in
  * languages other than Java to be scanned to produce XML, and then versions
  * of JDiff can be used to create documents describing the difference in those
  * APIs.
- * 
+ *
  * See the file LICENSE.txt for copyright details.
  * @author Matthew Doar, mdoar@pobox.com
  */
diff --git a/src/jdiff/APIComparator.java b/src/jdiff/APIComparator.java
index c877785..b79c829 100755
--- a/src/jdiff/APIComparator.java
+++ b/src/jdiff/APIComparator.java
@@ -862,17 +862,17 @@
         return linkToClass(m.inheritedFrom_, m.name_, null, useNew);
     }
 
-    /** 
+    /**
      * Given the name of the class, generate a link to a relevant page.
-     * This was originally for inheritance changes, so the JDiff page could 
-     * be a class changes page, or a section in a removed or added classes 
+     * This was originally for inheritance changes, so the JDiff page could
+     * be a class changes page, or a section in a removed or added classes.
      * table. Since there was no easy way to tell which type the link
      * should be, it is now just a link to the relevant Javadoc page.
      */
     public static String linkToClass(String className, String memberName, 
                                      String memberType, boolean useNew) {
         if (!useNew && HTMLReportGenerator.oldDocPrefix == null) {
-            return "<tt>" + className + "</tt>"; // No link possible
+            return "<code>" + className + "</code>"; // No link possible
         }
         API api = oldAPI_;
         String prefix = HTMLReportGenerator.oldDocPrefix;
@@ -886,7 +886,7 @@
                 System.out.println("Warning: class " + className + " not found in the new API when creating Javadoc link");
             else
                 System.out.println("Warning: class " + className + " not found in the old API when creating Javadoc link");
-            return "<tt>" + className + "</tt>";
+            return "<code>" + className + "</code>";
         }
         int clsIdx = className.indexOf(cls.name_);
         if (clsIdx != -1) {
@@ -895,13 +895,13 @@
             String res = "<a href=\"" + prefix + pkgRef + cls.name_ + ".html#" + memberName;
             if (memberType != null)
                 res += "(" + memberType + ")";
-            res += "\" target=\"_top\">" + "<tt>" + cls.name_ + "</tt></a>";
+            res += "\" target=\"_top\">" + "<code>" + cls.name_ + "</code></a>";
             return res;
         }
-        return "<tt>" + className + "</tt>";
-    }    
+        return "<code>" + className + "</code>";
+    }
 
-    /** 
+    /**
      * Return the number of methods which are locally defined.
      */
     public int numLocalMethods(List methods) {
diff --git a/src/jdiff/Comments.java b/src/jdiff/Comments.java
index b732596..0ead7ee 100755
--- a/src/jdiff/Comments.java
+++ b/src/jdiff/Comments.java
@@ -73,9 +73,9 @@
             }
 
             if (XMLToAPI.validateXML) {
-                parser.setFeature("http://xml.org/sax/features/namespaces", true);
-                parser.setFeature("http://xml.org/sax/features/validation", true);
-                parser.setFeature("http://apache.org/xml/features/validation/schema", true);
+                parser.setFeature("https://xml.org/sax/features/namespaces", true);
+                parser.setFeature("https://xml.org/sax/features/validation", true);
+                parser.setFeature("https://apache.org/xml/features/validation/schema", true);
             }
             parser.setContentHandler(handler);
             parser.setErrorHandler(handler);
@@ -125,7 +125,7 @@
             PrintWriter xsdFile = new PrintWriter(fos);
             // The contents of the comments.xsd file
             xsdFile.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"no\"?>");
-            xsdFile.println("<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">");
+            xsdFile.println("<xsd:schema xmlns:xsd=\"https://www.w3.org/2001/XMLSchema\">");
             xsdFile.println();
             xsdFile.println("<xsd:annotation>");
             xsdFile.println("  <xsd:documentation>");
diff --git a/src/jdiff/CommentsHandler.java b/src/jdiff/CommentsHandler.java
index 8061fbe..9872cb7 100755
--- a/src/jdiff/CommentsHandler.java
+++ b/src/jdiff/CommentsHandler.java
@@ -17,8 +17,8 @@
  * use tags such as &lt;p/&gt; rather than just &lt;p&gt;, since the XML
  * parser used requires that or matching end elements.
  *
- * From http://www.w3.org/TR/2000/REC-xhtml1-20000126:
- * "Empty elements must either have an end tag or the start tag must end with /&lt;". 
+ * From https://www.w3.org/TR/2000/REC-xhtml1-20000126:
+ * "Empty elements must either have an end tag or the start tag must end with /&lt;".
  *
  * See the file LICENSE.txt for copyright details.
  * @author Matthew Doar, mdoar@pobox.com
diff --git a/src/jdiff/ConstructorAPI.java b/src/jdiff/ConstructorAPI.java
index 8fc7159..65467ef 100755
--- a/src/jdiff/ConstructorAPI.java
+++ b/src/jdiff/ConstructorAPI.java
@@ -81,9 +81,10 @@
      * Tests two constructors, using just the name and type, used by indexOf().
      */
     public boolean equals(Object o) {
+
         ConstructorAPI constructorAPI = (ConstructorAPI)o;
         if (compareNullIsLeast(name_, constructorAPI.name_) == 0 &&
-                compareNullIsLeast(type_, constructorAPI.type_) == 0)
+                compareNullIsLeast(getSignature(), constructorAPI.getSignature()) == 0)
             return true;
         return false;
     }
@@ -119,4 +120,4 @@
         signature_ = res;
         return res;
     }
-}
+}
\ No newline at end of file
diff --git a/src/jdiff/Diff.java b/src/jdiff/Diff.java
index a9c9776..8cba311 100755
--- a/src/jdiff/Diff.java
+++ b/src/jdiff/Diff.java
@@ -324,7 +324,7 @@
                     diffFile.println("</TITLE>");
                     diffFile.println("</HEAD>");
                     diffFile.println("<BODY>");
-                                        
+
                     // Write the navigation bar
                     diffFile.println("<!-- Start of nav bar -->");
                     diffFile.println("<TABLE summary=\"Navigation bar\" BORDER=\"0\" WIDTH=\"100%\" CELLPADDING=\"1\" CELLSPACING=\"0\">");
@@ -336,7 +336,7 @@
                     String pkgRef = currPkgName;
                     pkgRef = pkgRef.replace('.', '/');
                     pkgRef = HTMLReportGenerator.newDocPrefix + pkgRef + "/package-summary";
-                    diffFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + pkgRef + ".html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><tt>" + APIDiff.newAPIName_ + "</tt></B></FONT></A>&nbsp;</TD>");
+                    diffFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + pkgRef + ".html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><code>" + APIDiff.newAPIName_ + "</code></B></FONT></A>&nbsp;</TD>");
                     diffFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + HTMLReportGenerator.reportFileName + "-summary" + HTMLReportGenerator.reportFileExt + "\"><FONT CLASS=\"NavBarFont1\"><B>Overview</B></FONT></A>&nbsp;</TD>");
                     diffFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Package</FONT>&nbsp;</TD>");
                     diffFile.println("      <TD BGCOLOR=\"#FFFFFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Class</FONT>&nbsp;</TD>");
@@ -468,7 +468,7 @@
             diffFile.println("  <TABLE summary=\"Navigation bar\" BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"3\">");
             diffFile.println("    <TR ALIGN=\"center\" VALIGN=\"top\">");
             // Always have a link to the Javadoc files
-            diffFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + HTMLReportGenerator.newDocPrefix + "index.html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><tt>" + APIDiff.newAPIName_ + "</tt></B></FONT></A>&nbsp;</TD>");
+            diffFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + HTMLReportGenerator.newDocPrefix + "index.html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><code>" + APIDiff.newAPIName_ + "</code></B></FONT></A>&nbsp;</TD>");
             diffFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + HTMLReportGenerator.reportFileName + "-summary" + HTMLReportGenerator.reportFileExt + "\"><FONT CLASS=\"NavBarFont1\"><B>Overview</B></FONT></A>&nbsp;</TD>");
             diffFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Package</FONT>&nbsp;</TD>");
             diffFile.println("      <TD BGCOLOR=\"#FFFFFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Class</FONT>&nbsp;</TD>");
@@ -632,23 +632,23 @@
      */
     public static int insertEffect = 1;
 
-    /** 
+    /**
      * For each package and class, the first DiffOutput is added to
      * this hash table. Used when generating navigation bars.
      */
     public static Hashtable firstDiffOutput = new Hashtable();
 
-    /** 
+    /**
      * If set, then show changes in implementation-related modifiers such as
-     * native and synchronized. For more information, see 
-     * http://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/javadoc.html#generatedapideclarations
+     * native and synchronized. For more information, see
+     * https://java.sun.com/j2se/1.4.1/docs/tooldocs/solaris/javadoc.html#generatedapideclarations
      */
     public static boolean showAllChanges = false;
 
     /** The list of documentation differences. */
     private static List docDiffs = new ArrayList(); // DiffOutput[]
-        
+
     /** Set to enable increased logging verbosity for debugging. */
     private static boolean trace = false;
-        
-}  
+
+}
diff --git a/src/jdiff/HTMLFiles.java b/src/jdiff/HTMLFiles.java
index a141e6c..3b3cf14 100755
--- a/src/jdiff/HTMLFiles.java
+++ b/src/jdiff/HTMLFiles.java
@@ -43,31 +43,31 @@
                 h_.writeHTMLTitle(h_.windowTitle);
             // Note that the stylesheet is in the same directory
             h_.writeStyleSheetRef(true);
-            h_.writeText("</HEAD>");
+            h_.writeText("</head>");
             // Note that the top-level frame file doesn't have the BODY tag
-            h_.writeText("<FRAMESET COLS=\"20%,80%\">");
-            h_.writeText("<frameset rows=\"196,**\">");
+            h_.writeText("<frameset cols=\"242,**\" framespacing=\"1\" frameborder=\"yes\" border=\"1\" bordercolor=\"#e9e9e9\"> ");
+            h_.writeText("<frameset rows=\"174,**\" framespacing=\"1\" frameborder=\"yes\"  border=\"1\" bordercolor=\"#e9e9e9\">");
 
             // Convert filenames to web links
             String tlfLink = h_.reportFileName + "/jdiff_topleftframe" + h_.reportFileExt;
             String allDiffsLink = h_.reportFileName + "/alldiffs_index_all" + h_.reportFileExt;
             String csnLink = h_.reportFileName + "/" + h_.reportFileName + "-summary" + h_.reportFileExt;
 
-            h_.writeText("    <FRAME SRC=\"" + tlfLink + "\" SCROLLING=\"no\" NAME=\"topleftframe\">");
-            h_.writeText("    <FRAME SRC=\"" + allDiffsLink + "\" SCROLLING=\"auto\" NAME=\"bottomleftframe\">");
-            h_.writeText("  </FRAMESET>");
-            h_.writeText("  <FRAME SRC=\"" + csnLink + "\" SCROLLING=\"auto\" NAME=\"rightframe\">");
-            h_.writeText("</FRAMESET>");
-            h_.writeText("<NOFRAMES>");
-            h_.writeText("<H2>");
+            h_.writeText("    <frame src=\"" + tlfLink + "\" scrolling=\"no\" name=\"topleftframe\" frameborder=\"1\">");
+            h_.writeText("    <frame src=\"" + allDiffsLink + "\" scrolling=\"auto\" name=\"bottomleftframe\" frameborder=\"1\">");
+            h_.writeText("  </frameset>");
+            h_.writeText("  <frame src=\"" + csnLink + "\" scrolling=\"auto\" name=\"rightframe\" frameborder=\"1\">");
+            h_.writeText("</frameset>");
+            h_.writeText("<noframes>");
+            h_.writeText("<h2>");
             h_.writeText("Frame Alert");
-            h_.writeText("</H2>\n");
-            h_.writeText("<P>");
+            h_.writeText("</h2>\n");
+            h_.writeText("<p>");
             h_.writeText("This document is designed to be viewed using the frames feature. If you see this message, you are using a non-frame-capable web client.");
-            h_.writeText("<BR>");
-            h_.writeText("Link to <A HREF=\"" + csnLink + "\" target=\"_top\">Non-frame version.</A>");
-            h_.writeText("</NOFRAMES>");
-            h_.writeText("</HTML>");
+            h_.writeText("<br>");
+            h_.writeText("Link to <a href=\"" + csnLink + "\" target=\"_top\">Non-frame version.</A>");
+            h_.writeText("</noframes>");
+            h_.writeText("</html>");
             h_.reportFile.close();
         } catch(IOException e) {
             System.out.println("IO Error while attempting to create " + tln);
@@ -76,39 +76,39 @@
         }
     }
 
-    /** Emit a top left frame with all the links to the index files. */
+    /** Emit a frame with all the links to the index files. */
     public void emitTopLeftFile(String tlf) {
         try {
             FileOutputStream fos = new FileOutputStream(tlf);
             h_.reportFile = new PrintWriter(fos);
             h_.writeStartHTMLHeader();
-            h_.writeHTMLTitle("Android Diffs Index");
+            h_.writeHTMLTitle("Android API Version Differences");
             h_.writeStyleSheetRef();
             h_.writeText("</HEAD>");
-            h_.writeText("<BODY>");
+            h_.writeText("<BODY class=\"gc-documentation\" style=\"padding:12px;\">");
 
-            h_.writeText("<table summary=\"Links to all index files\" BORDER=\"0\" WIDTH=\"100%\" cellspacing=\"0\" cellpadding=\"0\">");
+            h_.writeText("<table class=\"jdiffIndex\" summary=\"Links to diff index files\" BORDER=\"0\" WIDTH=\"100%\" cellspacing=\"0\" cellpadding=\"0\" style=\"margin:0\">");
             h_.writeText("<TR>");
             h_.writeText("  <th class=\"indexHeader\" nowrap>");
             h_.writeText("  Select a Diffs Index:</th>");
             h_.writeText("</TR>");
             h_.writeText("<TR>");
-            h_.writeText("  <TD><FONT CLASS=\"indexText\" size=\"-1\"><A HREF=\"alldiffs_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">All Differences</A></FONT><br></TD>");
+            h_.writeText("  <TD><FONT CLASS=\"indexText\" size=\"-2\"><A HREF=\"alldiffs_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">All Differences</A></FONT><br></TD>");
             h_.writeText("</TR>");
             h_.writeText("<TR>");
-            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-1\"><A HREF=\"packages_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Package</A></FONT><br></TD>");
+            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-2\"><A HREF=\"packages_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Package</A></FONT><br></TD>");
             h_.writeText("</TR>");
             h_.writeText("<TR>");
-            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-1\"><A HREF=\"classes_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Class</A></FONT><br></TD>");
+            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-2\"><A HREF=\"classes_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Class</A></FONT><br></TD>");
             h_.writeText("</TR>");
             h_.writeText("<TR>");
-            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-1\"><A HREF=\"constructors_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Constructor</A></FONT><br></TD>");
+            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-2\"><A HREF=\"constructors_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Constructor</A></FONT><br></TD>");
             h_.writeText("</TR>");
             h_.writeText("<TR>");
-            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-1\"><A HREF=\"methods_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Method</A></FONT><br></TD>");
+            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-2\"><A HREF=\"methods_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Method</A></FONT><br></TD>");
             h_.writeText("</TR>");
             h_.writeText("<TR>");
-            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-1\"><A HREF=\"fields_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Field</A></FONT><br></TD>");
+            h_.writeText("  <TD NOWRAP><FONT CLASS=\"indexText\" size=\"-2\"><A HREF=\"fields_index_all" + h_.reportFileExt + "\" TARGET=\"bottomleftframe\">By Field</A></FONT><br></TD>");
             h_.writeText("</TR>");
             h_.writeText("</TABLE>");
 
@@ -140,7 +140,7 @@
             h_.writeText("  <TABLE summary=\"Navigation bar\" BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"3\">");
             h_.writeText("    <TR ALIGN=\"center\" VALIGN=\"top\">");
             // Always have a link to the Javadoc files
-            h_.writeText("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + h_.newDocPrefix + "index.html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><tt>" + apiDiff.newAPIName_ + "</tt></B></FONT></A>&nbsp;</TD>");
+            h_.writeText("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + h_.newDocPrefix + "index.html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><code>" + apiDiff.newAPIName_ + "</code></B></FONT></A>&nbsp;</TD>");
             h_.writeText("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + h_.reportFileName + "-summary" + h_.reportFileExt + "\"><FONT CLASS=\"NavBarFont1\"><B>Overview</B></FONT></A>&nbsp;</TD>");
             h_.writeText("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Package</FONT>&nbsp;</TD>");
             h_.writeText("      <TD BGCOLOR=\"#FFFFFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Class</FONT>&nbsp;</TD>");
@@ -167,17 +167,17 @@
             h_.writeText("  <A HREF=\"" + "../" + h_.reportFileName + h_.reportFileExt + "\" TARGET=\"_top\"><B>FRAMES</B></A>  &nbsp;");
             h_.writeText("  &nbsp;<A HREF=\"jdiff_help" + h_.reportFileExt + "\" TARGET=\"_top\"><B>NO FRAMES</B></A></FONT></TD>");
             h_.writeText("</TR>");
-            
+
             h_.writeText("</TABLE>");
             h_.writeText("<HR>");
             h_.writeText ("<!-- End of nav bar -->");
 
-            h_.writeText("<center>");        
+            h_.writeText("<center>");
             h_.writeText("<H1>JDiff Documentation</H1>");
-            h_.writeText("</center>");        
+            h_.writeText("</center>");
 
             h_.writeText("<BLOCKQUOTE>");
-            h_.writeText("JDiff is a <a href=\"http://java.sun.com/j2se/javadoc/\" target=\"_top\">Javadoc</a> doclet which generates a report of the API differences between two versions of a product. It does not report changes in Javadoc comments, or changes in what a class or method does. ");
+            h_.writeText("JDiff is a <a href=\"https://java.sun.com/j2se/javadoc/\" target=\"_top\">Javadoc</a> doclet which generates a report of the API differences between two versions of a product. It does not report changes in Javadoc comments, or changes in what a class or method does. ");
             h_.writeText("This help page describes the different parts of the output from JDiff.");
             h_.writeText("</BLOCKQUOTE>");
 
@@ -197,23 +197,23 @@
 
             h_.writeText("<BLOCKQUOTE>");
             h_.writeText("You can always tell when you are reading a JDiff page, rather than a Javadoc page, by the color of the index bar and the color of the background. ");
-            h_.writeText("Links which take you to a Javadoc page are always in a <tt>typewriter</tt> font. ");
+            h_.writeText("Links which take you to a Javadoc page are always in a <code>typewriter</code> font. ");
             h_.writeText("Just like Javadoc, all interface names are in <i>italic</i>, and class names are not italicized. Where there are multiple entries in an index with the same name, the heading for them is also in italics, but is not a link.");
             h_.writeText("</BLOCKQUOTE>");
 
             h_.writeText("<BLOCKQUOTE>");
-            h_.writeText("<H3><b><tt>Javadoc</tt></b></H3>");
+            h_.writeText("<H3><b><code>Javadoc</code></b></H3>");
             h_.writeText("This is a link to the <a href=\"" + h_.newDocPrefix + "index.html\" target=\"_top\">top-level</a> Javadoc page for the new version of the product.");
             h_.writeText("</BLOCKQUOTE>");
-            
+
             h_.writeText("<BLOCKQUOTE>");
-            h_.writeText("<H3>Overview</H3>");        
-            h_.writeText("The <a href=\"" + h_.reportFileName + "-summary" + 
-                      h_.reportFileExt + "\">overview</a> is the top-level summary of what was removed, added and changed between versions.");        
+            h_.writeText("<H3>Overview</H3>");
+            h_.writeText("The <a href=\"" + h_.reportFileName + "-summary" +
+            h_.reportFileExt + "\">overview</a> is the top-level summary of what was removed, added and changed between versions.");        
             h_.writeText("</BLOCKQUOTE>");
-            
+
             h_.writeText("<BLOCKQUOTE>");
-            h_.writeText("<H3>Package</H3>");        
+            h_.writeText("<H3>Package</H3>");
             h_.writeText("This is a link to the package containing the current changed class or interface.");        
             h_.writeText("</BLOCKQUOTE>");
             
@@ -265,7 +265,7 @@
         }
     }
 
-    /** Emit the CSS external stylesheet file. */
+    /** Emit the external stylesheet file. */
     public void emitStylesheet() {
         String stylesheetFileName = "stylesheet-jdiff.css";
         if (h_.outputDir != null)
@@ -277,56 +277,10 @@
             h_.writeText("/* (" + JDiff.jDiffLocation + ") */");
             //h_.writeText("/* on " + new Date() + " */");
             h_.writeText();
-            //h_.writeText("/* Define colors, fonts and other style attributes here to override the defaults  */");
-            //h_.writeText();
-            //h_.writeText("/* Page background color */");
-            //h_.writeText("body { background-color: " + h_.bgcolor + "; font-family: arial; }");
-            //First argument after backgroun: is for older Netscape browsers
-            //For more information, see http://css.nu/pointers/bugs.html and 
-            //http://www.richinstyle.com/bugs/netscape4.html
-            //h_.writeText("body { background: #CCFFFF url(background.gif); font-family: arial; }");
-            //h_.writeText();
-            //h_.writeText("/* Table colors */");
-            //h_.writeText(".TableHeadingColor     { background: #CCCCFF } /* Dark mauve */");
-            //h_.writeText(".TableSubHeadingColor  { background: #EEEEFF } /* Light mauve */");
-            //h_.writeText(".TableRowColor         { background: #FFFFFF } /* White */");
-            //h_.writeText();
-            //h_.writeText("/* Font used in left-hand frame lists */");
-            //h_.writeText(".FrameTitleFont   { font-size: normal; font-family: normal }");
-            //h_.writeText(".FrameHeadingFont { font-size: normal; font-family: normal }");
-            //h_.writeText(".FrameItemFont    { font-size: normal; font-family: normal }");
-            //h_.writeText();
-            //h_.writeText("/* Example of smaller, sans-serif font in frames */");
-            //h_.writeText("/* .FrameItemFont  { font-size: 10pt; font-family: Helvetica, Arial, sans-serif } */");
-            //h_.writeText();
-            //h_.writeText("/* Navigation bar fonts and colors */");
-            //h_.writeText(".NavBarCell1    { background-color:#FFFFCC;} /* Changed to yellowish to make difference from Javadoc clear */");
-            //h_.writeText(".NavBarCell1Rev { background-color:#00008B;}/* Dark Blue */");
-            //h_.writeText(".NavBarFont1    { font-family: Arial, Helvetica, sans-serif; color:#000000;}");
-            //h_.writeText(".NavBarFont1Rev { font-family: Arial, Helvetica, sans-serif; color:#FFFFFF;}");
-            //h_.writeText();
-            //h_.writeText(".NavBarCell2    { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}");
-            //h_.writeText(".NavBarCell3    { font-family: Arial, Helvetica, sans-serif; background-color:#FFFFFF;}");
-            //h_.writeText();
-            h_.writeText("/* ");
-            h_.writeText(" Links which become blue when hovered upon and show that they have been ");
-            h_.writeText(" visited. ");
-            h_.writeText("*/");
-	    h_.writeText(".hiddenlink {text-decoration:none;}");
-            h_.writeText("a.hiddenlink:link      {color: black; text-decoration: none}");
-            h_.writeText("a.hiddenlink:visited   {color: purple; text-decoration: none}");
-            h_.writeText("a.hiddenlink:hover     {color: blue; text-decoration: underline;}");
-            h_.writeText();
-            h_.writeText("/* ");
-            h_.writeText(" Links which become blue when hovered upon but do not show that they have ");
-            h_.writeText(" been visited. ");
-            h_.writeText("*/");
-            h_.writeText("a.staysblack:link     {color: black; text-decoration: none}");
-            h_.writeText("a.staysblack:visited  {color: black; text-decoration: none}");
-            h_.writeText("a.staysblack:hover    {color: blue; text-decoration: underline;}");
-            h_.writeText("");
+
             h_.writeText("div.and-diff-id {border: 1px solid #eee;position:relative;float:right;clear:both;padding:0px;}");
             h_.writeText("table.diffspectable {border:1px;padding:0px;margin:0px;}");
+            h_.writeText(".diffspechead {background-color:#eee;}");
             h_.writeText(".diffspectable tr {border:0px;padding:0px;}");
             h_.writeText(".diffspectable td  {background-color:eee;border:0px;font-size:90%;font-weight:normal;padding:0px;padding-left:1px;padding-right:1px;text-align:center;color:777;}");
             h_.writeText("td.diffvalueold {color:orange;background-color:white;border:0px;font-size:80%;font-style:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;}");
@@ -334,28 +288,46 @@
             h_.writeText("td.diffvalue {color:444;background-color:white;border:0px;font-size:80%;font-weight:normal;text-align:left;padding:0px;padding-left:1px;padding-right:1px;line-height:.95em;}");
             h_.writeText("td.diffspec {background-color:white;border:0px;font-size:80%;font-weight:normal;padding:1px;color:444;text-align:right;padding-right:.5em;line-height:.95em;}");
             h_.writeText("tt {font-size:11pt;font-family:monospace;}");
-            h_.writeText("code {font-size:11pt;font-family:monospace;}");
-            h_.writeText(".indexHeader {font-size:11pt;line-height:.8em;}");
-            h_.writeText(".indexText {font-size:9pt;line-height:.8em;padding-left:1em;}");
+            h_.writeText(".indexHeader {");
+            h_.writeText("  font-size:96%;");
+            h_.writeText("  line-height:.8em;}");
 
-            h_.writeText(".pagecontenth1 {");
-            h_.writeText("  line-height: 130%;");
-            h_.writeText("  font-size: 170%;");
-            h_.writeText("  xmargin: 0 0 0 -10px;");
-            h_.writeText("  padding: .8em 0 0;");
-            h_.writeText("  border: none;");
-            h_.writeText("  background: none;");
-            h_.writeText("}");
-            h_.writeText("");
-            h_.writeText(".pagecontenth2 {");
-            h_.writeText("  font-size: 130%;");
-            h_.writeText("  font-weight: bold;");
-            h_.writeText("  margin: 2em 0 0 -10px; ");
-            h_.writeText("  padding: 1px 3px;");
-            h_.writeText("  position: relative;");
-            h_.writeText("  border-top: 1px solid #3366CC;");
-            h_.writeText("  background-color: #e5ecf9;");
-            h_.writeText("}");
+            h_.writeText(".jdiffIndex td {");
+            h_.writeText("  font-size:96%;");
+            h_.writeText("  xline-height:.8em;");
+            h_.writeText("  padding:2px;");
+            h_.writeText("  padding-left:1em;}");
+
+            h_.writeText(".indexText {");
+            h_.writeText("  font-size:100%;");
+            h_.writeText("  padding-left:1em;}");
+
+            h_.writeText("#indexTableCaption {");
+            h_.writeText("  font-size:96%;");
+            h_.writeText("  margin-top:.25em;");
+            h_.writeText("  margin-bottom:0;");
+            h_.writeText("  }");
+
+            h_.writeText(".hiddenlink {");
+            h_.writeText("  font-size:96%;");
+            h_.writeText("  line-height:.8em;");
+            h_.writeText("  text-decoration:none;}");
+
+            h_.writeText("a {");
+            h_.writeText("  text-decoration:none;}");
+
+            h_.writeText("a:hover {");
+            h_.writeText("  text-decoration:underline;}");
+
+            h_.writeText(".indexBox {");
+            h_.writeText("  border: 1px solid red;");
+            h_.writeText("  margin:1em 0 0 0;}");
+
+            h_.writeText(".letterIndexHead {");
+            h_.writeText("  font-size: 1.5em;font-weight:9;");
+            h_.writeText("  margin:0 0 0em 0;");
+            h_.writeText("  border: 1px solid red;}");
+
             h_.reportFile.close();
 
         } catch(IOException e) {
diff --git a/src/jdiff/HTMLIndexes.java b/src/jdiff/HTMLIndexes.java
index 9e65d96..5cd90a1 100755
--- a/src/jdiff/HTMLIndexes.java
+++ b/src/jdiff/HTMLIndexes.java
@@ -84,15 +84,15 @@
                 filename += "_all" + h_.reportFileExt;
                 title = programElementType + " Differences Index";
             }
-                
+
             FileOutputStream fos = new FileOutputStream(filename);
             h_.reportFile = new PrintWriter(fos);
             h_.writeStartHTMLHeader();
             h_.writeHTMLTitle(title);
             h_.writeStyleSheetRef();
             h_.writeText("</HEAD>");
-            h_.writeText("<BODY>");
-            
+            h_.writeText("<BODY class=\"gc-documentation\" style=\"padding:12px;\">");
+
             if (programElementType.compareTo("Package") == 0) {
                 emitPackagesIndex(apiDiff, indexType);
             } else if (programElementType.compareTo("Class") == 0) {
@@ -145,7 +145,7 @@
                 // Don't emit a reference to the current letter
                 if (Character.toUpperCase(sw) != Character.toUpperCase(currChar)) {
                     if (swu == '_') {
-                        h_.writeText("<a href=\"#" + swu + "\"><font size=\"" + size + "\">" + "underscore" + "</font></a> ");
+                        h_.writeText("<a href=\"#" + swu + "\"><font size=\"" + size + "\">" + "_" + "</font></a> ");
                     } else {
                         h_.writeText("<a href=\"#" + swu + "\"><font size=\"" + size + "\">" + swu + "</font></a> ");
                     }
@@ -162,7 +162,7 @@
      * added and changes sub-indexes. 
      */
     private void emitIndexHeader(String indexName, int indexType,
-                                 boolean hasRemovals, 
+                                 boolean hasRemovals,
                                  boolean hasAdditions, boolean hasChanges) {
         String linkIndexName = indexName.toLowerCase();
         boolean isAllDiffs = false;
@@ -171,71 +171,66 @@
             isAllDiffs = true;
         }
         h_.writeText("<a NAME=\"topheader\"></a>"); // Named anchor
-        h_.writeText("<table summary=\"Index for " +  indexName + "\" width=\"100%\" class=\"index\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">");
+        h_.writeText("<table summary=\"Index for " +  indexName + "\" width=\"100%\" class=\"jdiffIndex\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\" style=\"padding-bottom:0;margin-bottom:0;\">");
         h_.writeText("  <tr>");
         h_.writeText("  <th class=\"indexHeader\">");
         h_.writeText("    Filter the Index:");
         h_.writeText("  </th>");
         h_.writeText("  </tr>");
         h_.writeText("  <tr>");
-        h_.writeText("  <td class=\"indexText\" style=\"line-height:1.5em;padding-left:2em;\">");
-//        h_.writeText("  <div style=\"line-height:1.25em;padding-left:1em;>\">");
-//        h_.writeText("  <FONT SIZE=\"-1\">");
-        // The index name is also a hidden link to the *index_all page
+        h_.writeText("  <td class=\"indexText\" style=\"line-height:1.3em;padding-left:2em;\">");
+
         if (indexType == 3) {
              h_.writeText("<b>" + indexName + "</b>"); }
         else if (isAllDiffs) {
-            h_.writeText("<a href=\"" + linkIndexName + "_index_all" + h_.reportFileExt + "\" class=\"hiddenlink\">" + indexName + "</a>");
+            h_.writeText("<a href=\"" + linkIndexName + "_index_all" + h_.reportFileExt + "\" xclass=\"hiddenlink\">" + indexName + "</a>");
         }
         else {
             h_.writeText("<a href=\"" + linkIndexName + "_index_all" + h_.reportFileExt + "\" class=\"staysblack\">All " + indexName + "</a>");
         }
-//        h_.writeText("  </FONT>");
 
         h_.writeText("  <br>");
-//        h_.writeText("  <FONT SIZE=\"-1\">");
+
         if (hasRemovals) {
           if (indexType == 0) {
             h_.writeText("<b>Removals</b>");
           } else {
-            h_.writeText("<A HREF=\"" + linkIndexName + "_index_removals" + h_.reportFileExt + "\" class=\"hiddenlink\">Removals</A>");
+            h_.writeText("<A HREF=\"" + linkIndexName + "_index_removals" + h_.reportFileExt + "\" xclass=\"hiddenlink\">Removals</A>");
           }
         } else {
             h_.writeText("<font color=\"#999999\">Removals</font>");
         }
-//        h_.writeText("  </FONT>");
 
         h_.writeText("  <br>");
-//      h_.writeText("  <FONT SIZE=\"-1\">");
+
         if (hasAdditions) {
           if (indexType == 1) {
             h_.writeText("<b>Additions</b>");
           } else {
-            h_.writeText("<A HREF=\"" + linkIndexName + "_index_additions" + h_.reportFileExt + "\"class=\"hiddenlink\">Additions</A>");
+            h_.writeText("<A HREF=\"" + linkIndexName + "_index_additions" + h_.reportFileExt + "\"xclass=\"hiddenlink\">Additions</A>");
           }
         } else {
             h_.writeText("<font color=\"#999999\">Additions</font>");
         }
-//        h_.writeText("  </FONT>");
 
         h_.writeText("  <br>");
-//         h_.writeText("  <FONT SIZE=\"-1\">");
+
         if (hasChanges) {
           if (indexType == 2) {
             h_.writeText("<b>Changes</b>");
           } else {
-            h_.writeText("<A HREF=\"" + linkIndexName + "_index_changes" + h_.reportFileExt + "\"class=\"hiddenlink\">Changes</A>");
+            h_.writeText("<A HREF=\"" + linkIndexName + "_index_changes" + h_.reportFileExt + "\"xclass=\"hiddenlink\">Changes</A>");
           }
         } else {
             h_.writeText("<font color=\"#999999\">Changes</font>");
         }
-//        h_.writeText("  </FONT>");
-//        h_.writeText("  </div>");
+
         h_.writeText("  </td>");
         h_.writeText("  </tr>");
         h_.writeText("</table>");
-        h_.writeText("<font size=\"-2\"><strong>Bold</strong>&nbsp;indicates&nbsp;New;&nbsp;<strike>Strike</strike>&nbsp;indicates&nbsp;deleted</font>");
-        h_.writeText("  </br>");
+        h_.writeText("<div id=\"indexTableCaption\" style=\"background-color:#eee;padding:0 4px 0 4px;font-size:11px;margin-bottom:1em;\">");
+        h_.writeText("Listed as: <span style=\"color:#069\"><strong>Added</strong></span>,  <span style=\"color:#069\"><strike>Removed</strike></span>,  <span style=\"color:#069\">Changed</span></font>");
+        h_.writeText("</div>");
 
     }
 
@@ -281,14 +276,15 @@
         // Package names are unique, so no need to check for duplicates.
         iter = packageNames.iterator();
         char oldsw = '\0';
+        h_.writeText("<div id=\"indexTableEntries\">");
         while (iter.hasNext()) {
             Index pkg = (Index)(iter.next());
             oldsw = emitPackageIndexEntry(pkg, oldsw);
         }
     }
 
-    /** 
-     * Emit an index entry for a package. 
+    /**
+     * Emit an index entry for a package.
      * Package names are unique, so no need to check for duplicates.
      */
     public char emitPackageIndexEntry(Index pkg, char oldsw) {
@@ -497,7 +493,7 @@
             // Add the named anchor for this new letter
             h_.writeText("<A NAME=\"" + Character.toUpperCase(res) + "\"></A>");
             if (sw == '_')
-                h_.writeText("<br><b>underscore</b>&nbsp;");
+                h_.writeText("<br><b>_</b>&nbsp;");
             else
                 h_.writeText("<br><font size=\"+2\">" + Character.toUpperCase(sw) + "</font>&nbsp;");
             generateLetterIndex(classNames, sw, false);
@@ -600,7 +596,7 @@
             // Add the named anchor for this new letter
             h_.writeText("<A NAME=\"" + Character.toUpperCase(res) + "\"></A>");
             if (sw == '_')
-                h_.writeText("<br><b>underscore</b>&nbsp;");
+                h_.writeText("<br><b>_</b>&nbsp;");
             else
                 h_.writeText("<br><font size=\"+2\">" + Character.toUpperCase(sw) + "</font>&nbsp;");
             generateLetterIndex(ctorNames, sw, false);
@@ -700,7 +696,7 @@
             // Add the named anchor for this new letter
             h_.writeText("<A NAME=\"" + Character.toUpperCase(res) + "\"></A>");
             if (sw == '_')
-                h_.writeText("<br><b>underscore</b>&nbsp;");
+                h_.writeText("<br><b>_</b>&nbsp;");
             else
                 h_.writeText("<br><font size=\"+2\">" + Character.toUpperCase(sw) + "</font>&nbsp;");
             generateLetterIndex(methNames, sw, false);
@@ -816,7 +812,7 @@
             // Add the named anchor for this new letter
             h_.writeText("<A NAME=\"" + Character.toUpperCase(res) + "\"></A>");
             if (sw == '_')
-                h_.writeText("<br><b>underscore</b>&nbsp;");
+                h_.writeText("<br><b>_</b>&nbsp;");
             else
                 h_.writeText("<br><font size=\"+2\">" + Character.toUpperCase(sw) + "</font>&nbsp;");
             generateLetterIndex(fieldNames, sw, false);
@@ -826,42 +822,41 @@
             h_.writeText("<i>" + fld.name_ + "</i><br>");
         }
         if (multipleMarker != 0) {
-// More context than this is helpful here: h_.indent(INDENT_SIZE);
-            h_.writeText("&nbsp;in&nbsp;");
+            h_.writeText("<nobr>&nbsp;in&nbsp;");
         }
         // Deal with each type of difference
         if (fld.changeType_ == 0) {
-            String commentID = className + "." + fld.name_;                    
-            if (multipleMarker == 0) {            
+            String commentID = className + "." + fld.name_;
+            if (multipleMarker == 0) {
                 h_.writeText("<nobr><A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\"><strike>" + fld.name_ + "</strike></A>");
                 h_.writeText("</nobr><br>");
             } else {
-                h_.writeText("<nobr><A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\"><strike>" + className + "</strike></A>");
+                h_.writeText("<A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\"><strike>" + className + "</strike></A>");
                 h_.writeText("</nobr><br>");
             }
         } else if (fld.changeType_ == 1) {
-            String commentID = className + "." + fld.name_;                    
-            if (multipleMarker == 0) {            
+            String commentID = className + "." + fld.name_;
+            if (multipleMarker == 0) {
                 h_.writeText("<nobr><A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\">" + fld.name_ + "</A>");
                 h_.writeText("</nobr><br>");
             } else {
-                h_.writeText("<nobr><A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\">" + className + "</A>");
+                h_.writeText("<A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\">" + className + "</A>");
                 h_.writeText("</nobr><br>");
             }
         } else if (fld.changeType_ == 2) {
-            String commentID = className + "." + fld.name_;                    
-            if (multipleMarker == 0) {            
+            String commentID = className + "." + fld.name_;
+            if (multipleMarker == 0) {
                 h_.writeText("<nobr><A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\">" + fld.name_ + "</A>");
                 h_.writeText("</nobr><br>");
             } else {
-                h_.writeText("<nobr><A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\">" + className + "</A>");
+                h_.writeText("<A HREF=\"" + memberRef + h_.reportFileExt + "#" + commentID + "\" class=\"hiddenlink\" target=\"rightframe\">" + className + "</A>");
                 h_.writeText("</nobr><br>");
             }
         }
         return res;
     }
 
-    /** 
+    /**
      * Emit the index of all changes, which appears in the bottom left frame.
      * Has to be run after all the other indexes have been written, since it
      * uses data from when they are generated.
diff --git a/src/jdiff/HTMLReportGenerator.java b/src/jdiff/HTMLReportGenerator.java
index c896525..5ba10a6 100755
--- a/src/jdiff/HTMLReportGenerator.java
+++ b/src/jdiff/HTMLReportGenerator.java
@@ -87,42 +87,38 @@
 
            // writeText("<div class=\"g-section g-tpl-180\">");
            // Add the nav bar for the summary page
-            writeNavigationBar(reportFileName + "-summary", null, null, 
+            writeNavigationBar(reportFileName + "-summary", null, null,
                                null, 0, true,
-                               apiDiff.packagesRemoved.size() != 0, 
+                               apiDiff.packagesRemoved.size() != 0,
                                apiDiff.packagesAdded.size() != 0,
                                apiDiff.packagesChanged.size() != 0);
-            
+
+            writeText("    <div id=\"docTitleContainer\">");
             // Write the title in the body with some formatting
             if (docTitle == null) {
-	                //writeText("<center>");        
-                writeText("  <div id=\"titleAligner\" style=\"vertical-align:top;padding:1em;margin-left:0;text-align:left;\">");
-                writeText("    <H1 class=\"pagecontenth1\">API&nbsp;Differences&nbsp;Report</H1>");
-                writeText("  </div>");
+	                //writeText("<center>");
+                writeText("<h1>Android&nbsp;API&nbsp;Differences&nbsp;Report</h1>");
             } else {
-                writeText("  <div id=\"titleAligner\" style=\"vertical-align:top;padding:1em;margin-left:0;text-align:left;\">");
-                writeText("    <H1 class=\"pagecontenth1\">" + docTitle + "</H1>");
-                writeText("  </div>");
+                writeText("    <h1>" + docTitle + "</h1>");
             }
 
-            writeText("<p>This document details the changes in the Android framework API. It shows ");
-            writeText("additions, modifications, and removals for packages, classes, methods, and "); 
-            writeText("fields. Each reference to an API change includes a brief description of the ");
-            writeText("API and an explanation of the change and suggested workaround, where available.</p>");
+            writeText("<p>This report details the changes in the core Android framework API between two <a ");  writeText("href=\"https://developer.android.com/guide/appendix/api-levels.html\" target=\"_top\">API Level</a> ");
+            writeText("specifications. It shows additions, modifications, and removals for packages, classes, methods, and fields. ");
+            writeText("The report also includes general statistics that characterize the extent and type of the differences.</p>");
 
-            writeText("<p>The differences described in this report are based a comparison of the APIs ");
-            writeText("whose versions are specified in the upper-right corner of this page. It compares a ");
-            writeText("newer \"to\" API to an older \"from\" version, noting any changes relative to the ");
-            writeText("older API. So, for example, indicated API removals are no longer present in the \"to\" ");
-            writeText("API.</p>");
+            writeText("<p>This report is based a comparison of the Android API specifications ");
+            writeText("whose API Level identifiers are given in the upper-right corner of this page. It compares a ");
+            writeText("newer \"to\" API to an older \"from\" API, noting all changes relative to the ");
+            writeText("older API. So, for example, API elements marked as removed are no longer present in the \"to\" ");
+            writeText("API specification.</p>");
 
             writeText("<p>To navigate the report, use the \"Select a Diffs Index\" and \"Filter the Index\" ");
             writeText("controls on the left. The report uses text formatting to indicate <em>interface names</em>, ");
-            writeText("<a href= ><tt>links to reference documentation</tt></a>, and <a href= >links to change ");
-            writeText("description</a>. </p>");
+            writeText("<a href= ><code>links to reference documentation</code></a>, and <a href= >links to change ");
+            writeText("description</a>. The statistics are accessible from the \"Statistics\" link in the upper-right corner.</p>");
 
             writeText("<p>For more information about the Android framework API and SDK, ");
-            writeText("see the <a href=\"http://code.google.com/android/index.html\" target=\"_top\">Android product site</a>.</p>");
+            writeText("see the <a href=\"https://developer.android.com/index.html\" target=\"_top\">Android Developers site</a>.</p>");
 
             // Write the contents and the other files as well
             writeReport(apiDiff);
@@ -236,29 +232,29 @@
                 reportChangedPackage(pkgDiffs, i);
             }
         }
-            writeText("</div><!-- end pagecontent -->");
-            writeText("</div><!-- end codesitecontent -->");
-            writeText("<div style=\"padding-left: 10px; padding-right: 10px; margin-top: 0; padding-bottom: 15px;\">");
-            writeText("  <table style=\"width: 100%; border: none;\"><tr>");
-            writeText("    <td style=\"text-align:center;font-size: 10pt; border: none; color: ccc;\"> ");
-            writeText("      <span>&copy;2008 Google - ");
-            writeText("            <a href=\"http://code.google.com\">Code Home</a> - ");
-            writeText("            <a href=\"http://www.google.com/accounts/TOS\">Site Terms of Service</a> - "); 
-            writeText("            <a href=\"http://www.google.com/privacy.html\">Privacy Policy</a> ");
-            writeText("      </span>");
-            writeText("      <div style=\"position:relative;margin-top:-2em;" );
-            writeText("        font-size:8pt;color:aaa;text-align:right;\">");
-            writeText("        <em>Generated by <a href=\"http://www.jdiff.org/\">JDiff</a></em><br><img ");
-            writeText("        align=\"right\" src=\"../../../assets/jdiff_logo.gif\">");
-            writeText("      </span>");
-            writeText("    </td>");
-            writeText(" </tr></table>");
-            writeText("</div>");
-            writeText("</div><!-- end gc-containter -->");
-}
-    
-    /** 
-     * Write out the details of a changed package in a separate file. 
+            writeText("      </div>	");
+            writeText("      <div id=\"footer\">");
+            writeText("        <div id=\"copyright\">");
+            writeText("        Except as noted, this content is licensed under ");
+            writeText("        <a href=\"https://creativecommons.org/licenses/by/2.5/\"> Creative Commons Attribution 2.5</a>.");
+            writeText("        For details and restrictions, see the <a href=\"https://developer.android.com/license.html\">Content License</a>.");
+            writeText("        </div>");
+            writeText("      <div id=\"footerlinks\">");
+            writeText("      <p>");
+            writeText("        <a href=\"https://www.android.com/terms.html\">Site Terms of Service</a> -");
+            writeText("        <a href=\"https://www.android.com/privacy.html\">Privacy Policy</a> -");
+            writeText("        <a href=\"https://www.android.com/branding.html\">Brand Guidelines</a>");
+            writeText("      </p>");
+            writeText("    </div>");
+            writeText("    </div> <!-- end footer -->");
+            writeText("    </div><!-- end doc-content -->");
+            writeText("    </div> <!-- end body-content --> ");
+    }
+
+
+
+    /**
+     * Write out the details of a changed package in a separate file.
      */
     public void reportChangedPackage(PackageDiff[] pkgDiffs, int pkgIndex) {
         PackageDiff pkgDiff = pkgDiffs[pkgIndex];
@@ -290,7 +286,7 @@
         pkgRef = pkgRef.replace('.', '/');
         pkgRef = newDocPrefix + pkgRef + "/package-summary";
         // A link to the package in the new API
-        String linkedPkgName = "<A HREF=\"" + pkgRef + ".html\" target=\"_top\"><font size=\"+1\"><tt>" + pkgName + "</tt></font></A>";
+        String linkedPkgName = "<A HREF=\"" + pkgRef + ".html\" target=\"_top\"><font size=\"+1\"><code>" + pkgName + "</code></font></A>";
         String prevPkgRef = null;
         if (pkgIndex != 0) {
             prevPkgRef = "pkg_" + pkgDiffs[pkgIndex-1].name_ + reportFileExt;
@@ -300,7 +296,7 @@
         if (pkgIndex < pkgDiffs.length - 1) {
             nextPkgRef = "pkg_" + pkgDiffs[pkgIndex+1].name_ + reportFileExt;
         }
-        
+
         writeSectionHeader("Package " + linkedPkgName, pkgName, 
                            prevPkgRef, nextPkgRef,
                            null, 1,
@@ -316,16 +312,16 @@
             String newPkgRef = pkgDocRef;
             if (oldDocPrefix != null)
                 oldPkgRef = oldDocPrefix + oldPkgRef;
-            else 
+            else
                 oldPkgRef = null;
             newPkgRef = newDocPrefix + newPkgRef;
-            if (oldPkgRef != null) 
+            if (oldPkgRef != null)
                 pkgDiff.documentationChange_ += "<A HREF=\"" + oldPkgRef +
-                    ".html#package_description\" target=\"_self\"><font size=\"+1\"><tt>old</tt></font></A> to ";
+                    ".html#package_description\" target=\"_self\"><code>old</code></A> to ";
             else
-                pkgDiff.documentationChange_ += "<font size=\"+1\"><tt>old</tt></font> to ";
-            pkgDiff.documentationChange_ += "<A HREF=\"" + newPkgRef + 
-                ".html#package_description\" target=\"_self\"><font size=\"+1\"><tt>new</tt></font></A>. ";
+                pkgDiff.documentationChange_ += "<font size=\"+1\"><code>old</code></font> to ";
+            pkgDiff.documentationChange_ += "<A HREF=\"" + newPkgRef +
+                ".html#package_description\" target=\"_self\"><code>new</code></A>. ";
             writeText(pkgDiff.documentationChange_);
         }
 
@@ -469,7 +465,7 @@
             classRef = newDocPrefix + classRef;
         }
         // A link to the class in the new API
-        String linkedClassName = "<A HREF=\"" + classRef + ".html\" target=\"_top\"><font size=\"+1\"><tt>" + className + "</tt></font></A>";
+        String linkedClassName = "<A HREF=\"" + classRef + ".html\" target=\"_top\"><font size=\"+2\"><code>" + className + "</code></font></A>";
         String lcn = pkgName + "." + linkedClassName;
         //Links to the previous and next classes
         String prevClassRef = null;
@@ -516,13 +512,13 @@
                     oldClassRef = oldDocPrefix + oldClassRef;
                 }
             }
-            if (oldDocPrefix != null) 
+            if (oldDocPrefix != null)
                 classDiff.documentationChange_ += "<A HREF=\"" + oldClassRef +
-                    ".html\" target=\"_self\"><font size=\"+1\"><tt>old</tt></font></A> to ";
+                    ".html\" target=\"_self\"><code>old</code></A> to ";
             else
-                classDiff.documentationChange_ += "<font size=\"+1\"><tt>old</tt></font> to ";
-            classDiff.documentationChange_ += "<A HREF=\"" + classRef + 
-                ".html\" target=\"_self\"><font size=\"+1\"><tt>new</tt></font></A>. ";
+                classDiff.documentationChange_ += "<font size=\"+1\"><code>old</code></font> to ";
+            classDiff.documentationChange_ += "<A HREF=\"" + classRef +
+                ".html\" target=\"_self\"><code>new</code></A>. ";
             writeText(classDiff.documentationChange_);
         }
 
@@ -704,8 +700,8 @@
 
     /** Write the start of the HTML header. */
     public void writeStartHTMLHeader(boolean addDate) {
-        writeText("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Frameset//EN\"\"" + RootDocToXML.baseURI + "/TR/REC-html40/frameset.dtd\">");
-        writeText("<HTML>");
+        writeText("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01//EN\" \"https://www.w3.org/TR/html4/strict.dtd\">");
+        writeText("<HTML style=\"overflow:auto;\">");
         writeText("<HEAD>");
         writeText("<meta name=\"generator\" content=\"JDiff v" + JDiff.version + "\">");
         writeText("<!-- Generated by the JDiff Javadoc doclet -->");
@@ -730,61 +726,72 @@
         writeStyleSheetRef(false);
     }
 
-    /** 
+    /**
      * Write the HTML style sheet reference. If inSameDir is set, don't add
      * "../" to the location.
      */
 
     public void writeStyleSheetRef(boolean inSameDir) {
         if (inSameDir) {
-            writeText("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../assets/codesite/codesite.css\" />");
-            writeText("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../assets/codesite/codesearch.css\" />");
-            writeText("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../assets/codesite/semantic_headers.css\" />");
-            writeText("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../assets/style.css\" />");
-            writeText("<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\"stylesheet-jdiff.css\" TITLE=\"Style\">");
-	}
-        else {
-            writeText("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../assets/codesite/codesite.css\" />");
-            writeText("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../assets/codesite/codesearch.css\" />");
-            writeText("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../assets/codesite/semantic_headers.css\" />");
-            writeText("<link rel=\"stylesheet\" type=\"text/css\" href=\"../../../assets/style.css\" />");
-            writeText("<LINK REL=\"stylesheet\" TYPE=\"text/css\" HREF=\"../stylesheet-jdiff.css\" TITLE=\"Style\">");
-	}
-// This doesn't work in non-windows browsers, so have to change the stylesheet
-//        writeText("<!-- Override the color choice for the navigation bar -->");
-//        writeText("<STYLE>");
-//        //writeText(".NavBarCell1     { background-color:#FFFF99;} /* palegoldenrod */");
-//        writeText(".NavBarCell1     { background-color:#FFFFCC;} /*  */");
-//        writeText("</STYLE>");
+            writeText("<link href=\"../../../assets/android-developer-docs.css\" rel=\"stylesheet\" type=\"text/css\" />");
+            writeText("<link href=\"stylesheet-jdiff.css\" rel=\"stylesheet\" type=\"text/css\" />");
+            writeText("<noscript>");
+            writeText("<style type=\"text/css\">");
+            writeText("body{overflow:auto;}");
+            writeText("#body-content{position:relative; top:0;}");
+            writeText("#doc-content{overflow:visible;border-left:3px solid #666;}");
+            writeText("#side-nav{padding:0;}");
+            writeText("#side-nav .toggle-list ul {display:block;}");
+            writeText("#resize-packages-nav{border-bottom:3px solid #666;}");
+            writeText("</style>");
+            writeText("</noscript>");
+            writeText("<style type=\"text/css\">");
+            writeText("</style>");
+	    } else {
+            writeText("<link href=\"../../../../assets/android-developer-docs.css\" rel=\"stylesheet\" type=\"text/css\" />");
+            writeText("<link href=\"../stylesheet-jdiff.css\" rel=\"stylesheet\" type=\"text/css\" />");
+            writeText("<noscript>");
+            writeText("<style type=\"text/css\">");
+            writeText("body{overflow:auto;}");
+            writeText("#body-content{position:relative; top:0;}");
+            writeText("#doc-content{overflow:visible;border-left:3px solid #666;}");
+            writeText("#side-nav{padding:0;}");
+            writeText("#side-nav .toggle-list ul {display:block;}");
+            writeText("#resize-packages-nav{border-bottom:3px solid #666;}");
+            writeText("</style>");
+            writeText("</noscript>");
+            writeText("<style type=\"text/css\">");
+            writeText("</style>");
+	    }
     }
 
     /** Write the HTML footer. */
     public void writeHTMLFooter() {
-    writeText("<script src=\"http://www.google-analytics.com/ga.js\" type=\"text/javascript\">");
-    writeText("</script>");
-    writeText("<script type=\"text/javascript\">");
-    writeText("  try {");
-    writeText("    var pageTracker = _gat._getTracker(\"UA-18071-1\");");
-    writeText("    pageTracker._setAllowAnchor(true);");
-    writeText("    pageTracker._initData();");
-    writeText("    pageTracker._trackPageview();");
-    writeText("  } catch(e) {}");
-    writeText("</script>");
-    writeText("</BODY>");
-    writeText("</HTML>");
+        writeText("<script src=\"https://www.google-analytics.com/ga.js\" type=\"text/javascript\">");
+        writeText("</script>");
+        writeText("<script type=\"text/javascript\">");
+        writeText("  try {");
+        writeText("    var pageTracker = _gat._getTracker(\"UA-5831155-1\");");
+        writeText("    pageTracker._setAllowAnchor(true);");
+        writeText("    pageTracker._initData();");
+        writeText("    pageTracker._trackPageview();");
+        writeText("  } catch(e) {}");
+        writeText("</script>");
+        writeText("</BODY>");
+        writeText("</HTML>");
     }
 
-    /** 
-     * Write a section header, which includes a navigation bar. 
-     * 
+    /**
+     * Write a section header, which includes a navigation bar.
+     *
      * @param title Title of the header. Contains any links necessary.
-     * @param packageName The name of the current package, with no slashes or 
+     * @param packageName The name of the current package, with no slashes or
      *                    links in it. May be null
-     * @param prevElemLink An HTML link to the previous element (a package or 
+     * @param prevElemLink An HTML link to the previous element (a package or
      *                     class). May be null.
-     * @param nextElemLink An HTML link to the next element (a package or 
+     * @param nextElemLink An HTML link to the next element (a package or
      *                     class). May be null.
-     * @param className The name of the current class, with no slashes or 
+     * @param className The name of the current class, with no slashes or
      *                  links in it. May be null.
      * @param level 0 = overview, 1 = package, 2 = class/interface
      */
@@ -817,45 +824,39 @@
      *                  links in it. May be null
      * @param level 0 = overview, 1 = package, 2 = class/interface
      */
-    public void writeSectionFooter(String packageName, 
+    public void writeSectionFooter(String packageName,
                                    String prevElemLink, String nextElemLink,
                                    String className, int level) {
-            writeText("</div><!-- end codesitecontent -->");
-            writeText("<div style=\"padding-left: 10px; padding-right: 10px; margin-top: 0; padding-bottom: 15px;\">");
-            writeText("  <table style=\"width: 100%; border: none;\"><tr>");
-            writeText("    <td style=\"text-align:center;font-size: 10pt; border: none; color: ccc;\"> ");
-            writeText("      <span>&copy;2008 Google - ");
-            writeText("            <a href=\"http://code.google.com\">Code Home</a> - ");
-            writeText("            <a href=\"http://www.google.com/accounts/TOS\">Site Terms of Service</a> - "); 
-            writeText("            <a href=\"http://www.google.com/privacy.html\">Privacy Policy</a> ");
-            writeText("      </span>");
-            writeText("      <div style=\"xborder:1px solid red;position:relative;margin-top:-2em;" );
-            writeText("        font-size:8pt;color:aaa;text-align:right;\">");
-            writeText("        <em>Generated by <a href=\"http://www.jdiff.org/\">JDiff</a></em><br><img ");
-            writeText("        align=\"right\" src=\"../../../assets/jdiff_logo.gif\">");
-            writeText("      </span>");
-            writeText("    </td>");
-            writeText(" </tr></table>");
-            writeText("</div>");
-            writeText("</div><!-- end gc-containter -->");
-/*
-        reportFile.println("<HR>");
-        writeNavigationBar(packageName, prevElemLink, nextElemLink, 
-                           className, level, false,
-                           false, false, false);
-*/
+        writeText("      </div>	");
+        writeText("      <div id=\"footer\">");
+        writeText("        <div id=\"copyright\">");
+        writeText("        Except as noted, this content is licensed under ");
+        writeText("        <a href=\"https://creativecommons.org/licenses/by/2.5/\"> Creative Commons Attribution 2.5</a>.");
+        writeText("        For details and restrictions, see the <a href=\"https://developer.android.com/license.html\">Content License</a>.");
+        writeText("        </div>");
+        writeText("      <div id=\"footerlinks\">");
+        writeText("      <p>");
+        writeText("        <a href=\"https://www.android.com/terms.html\">Site Terms of Service</a> -");
+        writeText("        <a href=\"https://www.android.com/privacy.html\">Privacy Policy</a> -");
+        writeText("        <a href=\"https://www.android.com/branding.html\">Brand Guidelines</a>");
+        writeText("      </p>");
+        writeText("    </div>");
+        writeText("    </div> <!-- end footer -->");
+        writeText("    </div><!-- end doc-content -->");
+        writeText("    </div> <!-- end body-content --> ");
+
     }
-   
-    /** 
-     * Write a navigation bar section header. 
-     * 
-     * @param pkgName The name of the current package, with no slashes or 
+
+    /**
+     * Write a navigation bar section header.
+     *
+     * @param pkgName The name of the current package, with no slashes or
      *                links in it.
-     * @param prevElemLink An HTML link to the previous element (a package or 
+     * @param prevElemLink An HTML link to the previous element (a package or
      *                     class). May be null.
-     * @param nextElemLink An HTML link to the next element (a package or 
+     * @param nextElemLink An HTML link to the next element (a package or
      *                     class). May be null.
-     * @param className The name of the current class, with no slashes or 
+     * @param className The name of the current class, with no slashes or
      *                links in it. May be null.
      * @param level 0 = overview, 1 = package, 2 = class/interface
      */
@@ -864,250 +865,70 @@
                                    String prevElemLink, String nextElemLink,
                                    String className, int level,
                                    boolean upperNavigationBar,
-                                   boolean hasRemovals, boolean hasAdditions, 
+                                   boolean hasRemovals, boolean hasAdditions,
                                    boolean hasChanges) {
 
-            String oldAPIName = "Old API";
-            if (apiDiff.oldAPIName_ != null)
-                oldAPIName = apiDiff.oldAPIName_;
-            String newAPIName = "New API";
-            if (apiDiff.newAPIName_ != null)
-                newAPIName = apiDiff.newAPIName_;
+        String oldAPIName = "Old API";
+        if (apiDiff.oldAPIName_ != null)
+            oldAPIName = apiDiff.oldAPIName_;
+        String newAPIName = "New API";
+        if (apiDiff.newAPIName_ != null)
+            newAPIName = apiDiff.newAPIName_;
 
-            SimpleDateFormat formatter
-              = new SimpleDateFormat ("yyyy.MM.dd HH:mm");
-            Date day = new Date();
+        SimpleDateFormat formatter
+          = new SimpleDateFormat ("yyyy.MM.dd HH:mm");
+        Date day = new Date();
 
 	    reportFile.println("<!-- Start of nav bar -->");
 
-	    reportFile.println("<div id=\"gc-container\" style=\"padding-left:1em;padding-right:1em;\" id=\"pagecontent\">");
 	    reportFile.println("<a name=\"top\"></a>");
-	    reportFile.println("<div id=\"gc-header\">");
-	    reportFile.println("  <div id=\"logo\"  style=\"padding-left:1em;\">");
-	    reportFile.println("    <a href=\"../../../documentation.html\" target=\"_top\"><img style=\"border: 0;\" src=\"../../../assets-google/android-logo-sm.gif\" \"/></a>");
-	    reportFile.println("  </div> <!-- End logo -->");
-	    reportFile.println("  <div class=\"and-diff-id\">");
-            reportFile.println("    <table class=\"diffspectable\">");
+	    reportFile.println("<div id=\"header\" style=\"margin-bottom:0;padding-bottom:0;\">");
+	    reportFile.println("<div id=\"headerLeft\">");
+	    reportFile.println("<a href=\"../../../../index.html\" tabindex=\"-1\" target=\"_top\"><img src=\"../../../../assets/images/bg_logo.png\" alt=\"Android Developers\" /></a>");
+	    reportFile.println("</div>");
+	    reportFile.println("  <div id=\"headerRight\">");
+	    reportFile.println("  <div id=\"headerLinks\">");
+        reportFile.println("<!-- <img src=\"/assets/images/icon_world.jpg\" alt=\"\" /> -->");
+	    reportFile.println("<span class=\"text\">");
+	    reportFile.println("<!-- &nbsp;<a href=\"#\">English</a> | -->");
+	    reportFile.println("<nobr><a href=\"https://developer.android.com\" target=\"_top\">Android Developers</a> | <a href=\"https://www.android.com\" target=\"_top\">Android.com</a></nobr>");
+	    reportFile.println("</span>");
+	    reportFile.println("</div>");
+	    reportFile.println("  <div class=\"and-diff-id\" style=\"margin-top:6px;margin-right:8px;\">");
+        reportFile.println("    <table class=\"diffspectable\">");
 	    reportFile.println("      <tr>");
 	    reportFile.println("        <td colspan=\"2\" class=\"diffspechead\">API Diff Specification</td>");
 	    reportFile.println("      </tr>");
 	    reportFile.println("      <tr>");
-	    reportFile.println("        <td class=\"diffspec\" style=\"padding-top:.25em\">To Version:</td>");
+	    reportFile.println("        <td class=\"diffspec\" style=\"padding-top:.25em\">To Level:</td>");
 	    reportFile.println("        <td class=\"diffvaluenew\" style=\"padding-top:.25em\">" + newAPIName + "</td>");
 	    reportFile.println("      </tr>");
 	    reportFile.println("      <tr>");
-	    reportFile.println("        <td class=\"diffspec\">From Version:</td>");
+	    reportFile.println("        <td class=\"diffspec\">From Level:</td>");
 	    reportFile.println("        <td class=\"diffvalueold\">" + oldAPIName + "</td>");
 	    reportFile.println("      </tr>");
-//	    reportFile.println("      <tr>");
-//	    reportFile.println("        <td class=\"diffspec\">Product Type:</td>");
-//	    reportFile.println("        <td class=\"diffvalue\">Generic</td>");
-//	    reportFile.println("      </tr>");
 	    reportFile.println("      <tr>");
 	    reportFile.println("        <td class=\"diffspec\">Generated</td>");
 	    reportFile.println("        <td class=\"diffvalue\">" + formatter.format( day ) + "</td>");
 	    reportFile.println("      </tr>");
  	    reportFile.println("    </table>");
-	    reportFile.println("  </div> <!-- End and-diff-id -->");
-
-            if (doStats) {
-	    	reportFile.println("  <div class=\"and-diff-id\">");
+ 	    reportFile.println("    </div><!-- End and-diff-id -->");
+        if (doStats) {
+	    	reportFile.println("  <div class=\"and-diff-id\" style=\"margin-right:8px;\">");
 	    	reportFile.println("    <table class=\"diffspectable\">");
 	    	reportFile.println("      <tr>");
-	    	reportFile.println("        <td class=\"diffspec\" colspan=\"2\"><a href=\"jdiff_statistics.html\">Statistics</a></div>");
+	    	reportFile.println("        <td class=\"diffspec\" colspan=\"2\"><a href=\"jdiff_statistics.html\">Statistics</a>");
 	    	reportFile.println("      </tr>");
  	    	reportFile.println("    </table>");
 	    	reportFile.println("  </div> <!-- End and-diff-id -->");
 	    }
-
-	    reportFile.println("</div> <!-- End gc-header -->");
-	    reportFile.println("<div id=\"codesiteContent\" style=\"margin-top: 70px;margin-bottom:80px;\">");
-
-/*
-	reportFile.println("<TABLE summary=\"Navigation bar\" BORDER=\"0\" WIDTH=\"100%\" CELLPADDING=\"1\" CELLSPACING=\"0\">");
-        reportFile.println("  <TR>");
-        reportFile.println("    <TD COLSPAN=2 BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\">");
-        reportFile.println("    <TABLE summary=\"Navigation bar\" BORDER=\"0\" CELLPADDING=\"0\" CELLSPACING=\"3\">");
-        reportFile.println("    <TR ALIGN=\"center\" VALIGN=\"top\">");
-        boolean atOverview = (level == 0);
-        boolean atPackage = (level == 1);
-        boolean atClass = (level == 2);
-
-        // Always have a link to the Javadoc files
-        if (atOverview) {
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + newDocPrefix + "index.html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><font size=\"+1\"><tt>" + apiDiff.newAPIName_ + "</tt></font></B></FONT></A>&nbsp;</TD>");
-        } else if (atPackage) {
-            String pkgRef = pkgName;
-            pkgRef = pkgRef.replace('.', '/');
-            pkgRef = newDocPrefix + pkgRef + "/package-summary";
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + pkgRef + ".html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><font size=\"+1\"><tt>" + apiDiff.newAPIName_ + "</tt></font></B></FONT></A>&nbsp;</TD>");
-        } else if (atClass) {
-            String classRef = pkgName + "." + className;
-            classRef = classRef.replace('.', '/');
-            if (className.indexOf('.') != -1) {
-                classRef = pkgName + ".";
-                classRef = classRef.replace('.', '/');
-                classRef = newDocPrefix + classRef + className;
-            } else {
-                classRef = newDocPrefix + classRef;
-            }
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + classRef + ".html\" target=\"_top\"><FONT CLASS=\"NavBarFont1\"><B><font size=\"+1\"><tt>" + apiDiff.newAPIName_ + "</tt></font></B></FONT></A>&nbsp;</TD>");
-        }
-
-        if (atOverview) {
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1Rev\"> &nbsp;<FONT CLASS=\"NavBarFont1Rev\"><B>Overview</B></FONT>&nbsp;</TD>");
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Package</FONT>&nbsp;</TD>");
-            reportFile.println("      <TD BGCOLOR=\"#FFFFFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Class</FONT>&nbsp;</TD>");
-        }
-
-        String changesSummaryName = reportFileName + "-summary" + reportFileExt;
-        if (atPackage) {
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + changesSummaryName + "\"><FONT CLASS=\"NavBarFont1\"><B>Overview</B></FONT></A>&nbsp;</TD>");
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1Rev\"> &nbsp;<FONT CLASS=\"NavBarFont1Rev\"><B>Package</B></FONT>&nbsp;</TD>");
-            reportFile.println("      <TD BGCOLOR=\"#FFFFFF\" CLASS=\"NavBarCell1\"> &nbsp;<FONT CLASS=\"NavBarFont1\">Class</FONT>&nbsp;</TD>");
-        }
-        if (atClass) {
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + changesSummaryName + "\"><FONT CLASS=\"NavBarFont1\"><B>Overview</B></FONT></A>&nbsp;</TD>");
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"pkg_" + pkgName + reportFileExt + "\"><FONT CLASS=\"NavBarFont1\"><B>Package</B></FONT></A>&nbsp;</TD>");
-            reportFile.println("      <TD BGCOLOR=\"#FFFFFF\" CLASS=\"NavBarCell1Rev\"> &nbsp;<FONT CLASS=\"NavBarFont1Rev\"><B>Class</B></FONT>&nbsp;</TD>");
-        }
-
-        if (!Diff.noDocDiffs) {
-            if (atPackage) {
-                String id = (String)Diff.firstDiffOutput.get(pkgName + "!package");
-                if (id != null)
-                    reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + Diff.diffFileName + "index" + reportFileExt  + "#" + id + "\"><FONT CLASS=\"NavBarFont1\"><B>Text Changes</B></FONT></A>&nbsp;</TD>");
-                else
-                    reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <FONT CLASS=\"NavBarFont1\">Text Changes</FONT>&nbsp;</TD>");
-            } else if (atClass) {
-                String id = (String)Diff.firstDiffOutput.get(pkgName + "." + className + "!class");
-                if (id != null)
-                    reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + Diff.diffFileName + "index" + reportFileExt  + "#" + id + "\"><FONT CLASS=\"NavBarFont1\"><B>Text Changes</B></FONT></A>&nbsp;</TD>");
-                else
-                    reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <FONT CLASS=\"NavBarFont1\">Text Changes</FONT>&nbsp;</TD>");
-            } else {
-                reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"" + Diff.diffFileName + "index" + reportFileExt + "\"><FONT CLASS=\"NavBarFont1\"><B>Text Changes</B></FONT></A>&nbsp;</TD>");
-            }
-        }
-
-        if (doStats) {
-            reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"jdiff_statistics" + reportFileExt + "\"><FONT CLASS=\"NavBarFont1\"><B>Statistics</B></FONT></A>&nbsp;</TD>");
-        }
-
-        // Always have a link to the JDiff help file
-        reportFile.println("      <TD BGCOLOR=\"#EEEEFF\" CLASS=\"NavBarCell1\"> <A HREF=\"jdiff_help" + reportFileExt + "\"><FONT CLASS=\"NavBarFont1\"><B>Help</B></FONT></A>&nbsp;</TD>");
-        reportFile.println("    </TR>");
-        reportFile.println("    </TABLE>");
-        reportFile.println("  </TD>");
-
-        // The right hand side title, only added at the top
-        if (upperNavigationBar) {
-            reportFile.println("  <TD ALIGN=\"right\" VALIGN=\"top\" ROWSPAN=3><EM><b>Generated by<br><a href=\"" + JDiff.jDiffLocation + "\" class=\"staysblack\" target=\"_top\">JDiff</a></b></EM></TD>");
-        } else {
-            reportFile.println("  <TD ALIGN=\"right\" VALIGN=\"top\" ROWSPAN=3></TD>");
-        }
-        reportFile.println("</TR>");
-
-        // Links for frames and no frames
-        reportFile.println("<TR>");
-
-        // All of the previous and next links, and the frames and non-frames 
-        // links are in one table cell
-        reportFile.println("  <TD BGCOLOR=\"" + bgcolor + "\" CLASS=\"NavBarCell2\"><FONT SIZE=\"-2\">");        
-        // Display links to the previous and next packages or classes
-        if (atPackage || atClass) {
-            String elemName = "CLASS";
-            if (className == null) {
-                elemName = "PACKAGE";
-            }
-            if (prevElemLink == null) {
-                reportFile.println("&nbsp;<B>PREV " + elemName + "</B>&nbsp;");
-            } else {
-                reportFile.println("&nbsp;<A HREF=\"" + prevElemLink + "\"><B>PREV " + elemName + "</B></A>");
-            }
-            if (nextElemLink == null) {
-                reportFile.println("&nbsp;<B>NEXT " + elemName + "</B>&nbsp;");
-            } else {
-                reportFile.println("&nbsp;<A HREF=\"" + nextElemLink + "\"><B>NEXT " + elemName + "</B></A>");
-            }
-            reportFile.println("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
-        } else {
-            reportFile.println("  &nbsp;&nbsp;");        
-        }
-        // Links for frames and non-frames.
-        reportFile.println("  <A HREF=\"" + "../" + reportFileName + reportFileExt + "\" TARGET=\"_top\"><B>FRAMES</B></A>  &nbsp;");
-        if (className == null) {
-            if (level == 0) {
-                reportFile.println("  &nbsp;<A HREF=\"" + pkgName + reportFileExt + "\" TARGET=\"_top\"><B>NO FRAMES</B></A></FONT></TD>");
-            } else {
-                reportFile.println("  &nbsp;<A HREF=\"pkg_" + pkgName + reportFileExt + "\" TARGET=\"_top\"><B>NO FRAMES</B></A></FONT></TD>");
-            }
-        } else {
-            reportFile.println("  &nbsp;<A HREF=\"" + pkgName + "." + className + reportFileExt + "\" TARGET=\"_top\"><B>NO FRAMES</B></A></FONT></TD>");
-        }
-
-        // All of the details links are in one table cell
-        if (atClass) {
-            // Links to a class page's sections
-            // The meaning of these three variable is overloaded
-            boolean hasCtors = hasRemovals; 
-            boolean hasMethods = hasAdditions; 
-            boolean hasFields = hasChanges; 
-            if (hasCtors || hasMethods || hasFields) {
-                reportFile.println("  <TD BGCOLOR=\"" + bgcolor + "\" CLASS=\"NavBarCell3\"><FONT SIZE=\"-2\"> DETAIL: &nbsp;");
-                if (hasCtors) {
-                    reportFile.println("<a href=\"#constructors\">CONSTRUCTORS</a>&nbsp;|&nbsp;");
-                } else {
-                    reportFile.println("CONSTRUCTORS&nbsp;|&nbsp;");
-                }
-                if (hasMethods) {
-                    reportFile.println("<a href=\"#methods\">METHODS</a>&nbsp;|&nbsp;");
-                } else {
-                    reportFile.println("METHODS&nbsp;|&nbsp;");
-                }
-                if (hasFields) {
-                    reportFile.println("<a href=\"#fields\">FIELDS</a>");
-                } else {
-                    reportFile.println("FIELDS");
-                }
-                reportFile.println("  </FONT></TD>");
-            } else {
-                // Make the end of the table line match the length of the top
-                reportFile.println("<TD BGCOLOR=\"0xFFFFFF\" CLASS=\"NavBarCell3\"></TD>"); 
-            }
-        } else {
-            // Links to a package page's sections
-            if (hasRemovals || hasAdditions || hasChanges) {
-                reportFile.println("  <TD BGCOLOR=\"" + bgcolor + "\" CLASS=\"NavBarCell3\"><FONT SIZE=\"-2\"> DETAIL: &nbsp;");
-                if (hasRemovals) {
-                    reportFile.println("<a href=\"#Removed\">REMOVED</a>&nbsp;|&nbsp;");
-                } else {
-                    reportFile.println("REMOVED&nbsp;|&nbsp;");
-                }
-                if (hasAdditions) {
-                    reportFile.println("<a href=\"#Added\">ADDED</a>&nbsp;|&nbsp;");
-                } else {
-                    reportFile.println("ADDED&nbsp;|&nbsp;");
-                }
-                if (hasChanges) {
-                    reportFile.println("<a href=\"#Changed\">CHANGED</a>");
-                } else {
-                    reportFile.println("CHANGED");
-                }
-                reportFile.println("  </FONT></TD>");
-            } else {
-                // Make the end of the table line match the length of the top
-                reportFile.println("<TD BGCOLOR=\"0xFFFFFF\" CLASS=\"NavBarCell3\"></TD>"); 
-            }
-        }
-
-        reportFile.println("</TR>");
-        reportFile.println("</TABLE>");
-        reportFile.println("<HR>");
-        reportFile.println("<!-- End of nav bar -->");
-*/
+	    reportFile.println("  </div> <!-- End headerRight -->");
+	    reportFile.println("  </div> <!-- End header -->");
+	    reportFile.println("<div id=\"body-content\" xstyle=\"padding:12px;padding-right:18px;\">");
+	    reportFile.println("<div id=\"doc-content\" style=\"position:relative;\">");
+	    reportFile.println("<div id=\"mainBodyFluid\">");
     }
-    
+
     /** Write the start of a table. */
     public void writeTableStart(String title, int colSpan) {
         reportFile.println("<p>");
@@ -1169,10 +990,10 @@
                 pkgRef = oldDocPrefix + pkgRef + "/package-summary";
             else
                 pkgRef = newDocPrefix + pkgRef + "/package-summary";
-            reportFile.println("  <nobr><A HREF=\"" + pkgRef + ".html\" target=\"_top\"><font size=\"+1\"><tt>" + pkgName + "</tt></font></A></nobr>");
+            reportFile.println("  <nobr><A HREF=\"" + pkgRef + ".html\" target=\"_top\"><code>" + pkgName + "</code></A></nobr>");
         } else if (linkType == 2) {
             reportFile.println("  <nobr><A HREF=\"pkg_" + pkgName + reportFileExt + "\">" + pkgName + "</A></nobr>");
-        } 
+        }
         if (!useOld) {
             reportFile.println("  </TD>");
             emitComment(pkgName, possibleComment, linkType);
@@ -1225,12 +1046,12 @@
                 else
                     classRef = newDocPrefix + classRef;
             }
-            reportFile.print("  <nobr><A HREF=\"" + classRef + ".html\" target=\"_top\"><font size=\"+1\"><tt>");
+            reportFile.print("  <nobr><A HREF=\"" + classRef + ".html\" target=\"_top\"><code>");
             if (isInterface)
                 reportFile.print("<I>" + shownClassName + "</I>");
             else
                 reportFile.print(shownClassName);
-            reportFile.println("</tt></font></A></nobr>");
+            reportFile.println("</code></A></nobr>");
         } else if (linkType == 2) {
             reportFile.print("  <nobr><A HREF=\"" + fqName + reportFileExt + "\">");
             if (isInterface)
@@ -1238,7 +1059,7 @@
             else
                 reportFile.print(shownClassName);
             reportFile.println("</A></nobr>");
-        } 
+        }
         if (!useOld) {
             reportFile.println("  </TD>");
             emitComment(fqName, possibleComment, linkType);
@@ -1269,12 +1090,12 @@
         if (linkType == 0) {
             if (oldDocPrefix == null) {
                 // No link
-                reportFile.print("  <nobr>" + pkgName);
+                reportFile.print("  <nobr>" + className);
                 emitTypeWithParens(shortType);
                 reportFile.println("</nobr>");
             } else {
-                writeCtorTableEntry(pkgName, className, 
-                                    type, 1, 
+                writeCtorTableEntry(pkgName, className,
+                                    type, 1,
                                     possibleComment, true);
             }
         } else if (linkType == 1) {
@@ -1299,7 +1120,7 @@
                 }
             }
             reportFile.print("  <nobr><A HREF=\"" + memberRef + ".html#" + className +
-                             "(" + type + ")\" target=\"_top\"><font size=\"+1\"><tt>" + shownClassName + "</tt></font></A>");
+                             "(" + type + ")\" target=\"_top\"><code>" + shownClassName + "</code></A>");
             emitTypeWithParens(shortType);
             reportFile.println("</nobr>");
         }
@@ -1338,13 +1159,13 @@
             newType = "";
         String shortNewType = simpleName(memberDiff.newType_);
         // Constructors have the linked name, then the type in parentheses.
-        reportFile.print("  <nobr><A HREF=\"" + memberRef + ".html#" + className + "(" + newType + ")\" target=\"_top\"><font size=\"+1\"><tt>");
+        reportFile.print("  <nobr><A HREF=\"" + memberRef + ".html#" + className + "(" + newType + ")\" target=\"_top\"><code>");
         reportFile.print(shownClassName);
-        reportFile.print("</tt></font></A>");
+        reportFile.print("</code></A>");
         emitTypeWithParens(shortNewType);
         reportFile.println("  </nobr>");
         reportFile.println("  </TD>");
-        
+
         // Report changes in documentation
         if (reportDocChanges && memberDiff.documentationChange_ != null) {
             String oldMemberRef = null;
@@ -1363,15 +1184,15 @@
                 if (oldType.compareTo("void") == 0)
                     oldType = "";
             }
-            if (oldDocPrefix != null) 
-                memberDiff.documentationChange_ += "<A HREF=\"" + 
-                    oldMemberRef + ".html#" + className + "(" + oldType + 
-                    ")\" target=\"_self\"><font size=\"+1\"><tt>old</tt></font></A> to ";
+            if (oldDocPrefix != null)
+                memberDiff.documentationChange_ += "<A HREF=\"" +
+                    oldMemberRef + ".html#" + className + "(" + oldType +
+                    ")\" target=\"_self\"><code>old</code></A> to ";
             else 
-                memberDiff.documentationChange_ += "<font size=\"+1\"><tt>old</tt></font> to ";
-            memberDiff.documentationChange_ += "<A HREF=\"" + memberRef + 
-                ".html#" + className + "(" + newType + 
-                ")\" target=\"_self\"><font size=\"+1\"><tt>new</tt></font></A>.<br>";
+                memberDiff.documentationChange_ += "<font size=\"+1\"><code>old</code></font> to ";
+            memberDiff.documentationChange_ += "<A HREF=\"" + memberRef +
+                ".html#" + className + "(" + newType +
+                ")\" target=\"_self\"><code>new</code></A>.<br>";
         }
 
         emitChanges(memberDiff, 0);
@@ -1380,8 +1201,8 @@
         reportFile.println("</TR>");
     }
 
-    /** 
-     * Write a table entry for a method. 
+    /**
+     * Write a table entry for a method.
      *
      * linkType: 0 - no link by default, 1 = link to Javadoc HTML file
      */
@@ -1442,7 +1263,7 @@
             reportFile.print("  <nobr>");
             emitType(shortReturnType);
             reportFile.print("&nbsp;<A HREF=\"" + memberRef + ".html#" + methodName +
-               "(" + signature + ")\" target=\"_top\"><font size=\"+1\"><tt>" + methodName + "</tt></font></A>");
+               "(" + signature + ")\" target=\"_top\"><code>" + methodName + "</code></A>");
             emitTypeWithParens(shortSignature);
             reportFile.println("</nobr>");
         }
@@ -1484,23 +1305,23 @@
             memberDiff.modifiersChange_ != null &&
             memberDiff.modifiersChange_.indexOf("but is now inherited from") != -1) {
             memberRef = memberDiff.inheritedFrom_;
-            memberRef = memberRef.replace('.', '/'); 
+            memberRef = memberRef.replace('.', '/');
             memberRef = newDocPrefix + memberRef;
         }
-        
+
         String newReturnType = memberDiff.newType_;
-        String shortReturnType = simpleName(newReturnType); 
-        String shortSignature = simpleName(newSignature);        
+        String shortReturnType = simpleName(newReturnType);
+        String shortSignature = simpleName(newSignature);
         reportFile.print("  <nobr>");
-        emitTypeWithNoParens(shortReturnType); 
-        reportFile.print("&nbsp;<A HREF=\"" + memberRef + ".html#" + 
-                         memberName + "(" + newSignature + ")\" target=\"_top\"><font size=\"+1\"><tt>");
+        emitTypeWithNoParens(shortReturnType);
+        reportFile.print("&nbsp;<A HREF=\"" + memberRef + ".html#" +
+                         memberName + "(" + newSignature + ")\" target=\"_top\"><code>");
         reportFile.print(memberName);
-        reportFile.print("</tt></font></A>");
+        reportFile.print("</code></A>");
         emitTypeWithParens(shortSignature);
         reportFile.println("  </nobr>");
         reportFile.println("  </TD>");
-        
+
         // Report changes in documentation
         if (reportDocChanges && memberDiff.documentationChange_ != null) {
             String oldMemberRef = null;
@@ -1517,15 +1338,15 @@
                 }
                 oldSignature = memberDiff.oldSignature_;
             }
-            if (oldDocPrefix != null) 
-                memberDiff.documentationChange_ += "<A HREF=\"" + 
-                    oldMemberRef + ".html#" + memberName + "(" + 
-                    oldSignature + ")\" target=\"_self\"><font size=\"+1\"><tt>old</tt></font></A> to ";
+            if (oldDocPrefix != null)
+                memberDiff.documentationChange_ += "<A HREF=\"" +
+                    oldMemberRef + ".html#" + memberName + "(" +
+                    oldSignature + ")\" target=\"_self\"><code>old</code></A> to ";
             else
-                memberDiff.documentationChange_ += "<font size=\"+1\"><tt>old</tt></font> to ";
-            memberDiff.documentationChange_ += "<A HREF=\"" + memberRef + 
-                ".html#" + memberName + "(" + newSignature + 
-                ")\" target=\"_self\"><font size=\"+1\"><tt>new</tt></font></A>.<br>";
+                memberDiff.documentationChange_ += "<code>old</code> to ";
+            memberDiff.documentationChange_ += "<A HREF=\"" + memberRef +
+                ".html#" + memberName + "(" + newSignature +
+                ")\" target=\"_self\"><code>new</code></A>.<br>";
         }
 
         emitChanges(memberDiff, 1);
@@ -1534,7 +1355,7 @@
             int parentIdx = memberDiff.modifiersChange_.indexOf("now inherited from");
             if (parentIdx != -1) {
                 // Change the commentID to pick up the appropriate method
-                commentID = memberDiff.inheritedFrom_ + "." + memberName + 
+                commentID = memberDiff.inheritedFrom_ + "." + memberName +
                     "_changed(" + newSignature + ")";
             }
         }
@@ -1597,19 +1418,19 @@
             reportFile.print("  <nobr>");
             emitType(shortFieldType);
             reportFile.println("&nbsp;<A HREF=\"" + memberRef + ".html#" + fieldName +
-               "\" target=\"_top\"><font size=\"+1\"><tt>" + fieldName + "</tt></font></A></nobr>");
+               "\" target=\"_top\"><code>" + fieldName + "</code></A></nobr>");
         }
         if (!useOld) {
             reportFile.println("  </TD>");
             emitComment(commentID, possibleComment, linkType);
             reportFile.println("</TR>");
         }
-        }
+    }
 
-    /** 
+    /**
      * Write a table entry for a changed field.
      */
-    public void writeFieldChangedTableEntry(String pkgName, String className, 
+    public void writeFieldChangedTableEntry(String pkgName, String className,
                                             MemberDiff memberDiff) {
         String memberName = memberDiff.name_;
         // Generally nowhere to break a member name anyway
@@ -1637,20 +1458,20 @@
             memberDiff.modifiersChange_ != null &&
             memberDiff.modifiersChange_.indexOf("but is now inherited from") != -1) {
             memberRef = memberDiff.inheritedFrom_;
-            memberRef = memberRef.replace('.', '/'); 
+            memberRef = memberRef.replace('.', '/');
             memberRef = newDocPrefix + memberRef;
         }
 
         String newType = memberDiff.newType_;
-        String shortNewType = simpleName(newType); 
+        String shortNewType = simpleName(newType);
         reportFile.print("  <nobr>");
         emitTypeWithNoParens(shortNewType);
-        reportFile.print("&nbsp;<A HREF=\"" + memberRef + ".html#" + 
-                         memberName + "\" target=\"_top\"><font size=\"+1\"><tt>");
+        reportFile.print("&nbsp;<A HREF=\"" + memberRef + ".html#" +
+                         memberName + "\" target=\"_top\"><code>");
         reportFile.print(memberName);
-        reportFile.print("</tt></font></A></nobr>");
+        reportFile.print("</code></font></A></nobr>");
         reportFile.println("  </TD>");
-        
+
         // Report changes in documentation
         if (reportDocChanges && memberDiff.documentationChange_ != null) {
             String oldMemberRef = null;
@@ -1665,13 +1486,13 @@
                     oldMemberRef = oldDocPrefix + oldMemberRef;
                 }
             }
-            if (oldDocPrefix != null) 
-                memberDiff.documentationChange_ += "<A HREF=\"" + 
-                    oldMemberRef + ".html#" + memberName + "\" target=\"_self\"><font size=\"+1\"><tt>old</tt></font></A> to ";
+            if (oldDocPrefix != null)
+                memberDiff.documentationChange_ += "<A HREF=\"" +
+                    oldMemberRef + ".html#" + memberName + "\" target=\"_self\"><code>old</code></A> to ";
             else
-                memberDiff.documentationChange_ += "<font size=\"+1\"><tt>old</tt></font> to ";
-            memberDiff.documentationChange_ += "<A HREF=\"" + memberRef + 
-                ".html#" + memberName + "\" target=\"_self\"><font size=\"+1\"><tt>new</tt></font></A>.<br>";
+                memberDiff.documentationChange_ += "<code>old</code> to ";
+            memberDiff.documentationChange_ += "<A HREF=\"" + memberRef +
+                ".html#" + memberName + "\" target=\"_self\"><code>new</code></A>.<br>";
         }
 
         emitChanges(memberDiff, 2);
@@ -1902,14 +1723,14 @@
                     if (sepType == null)
                         sepType = p;
                     else
-                        sepType += ",</nobr> " + p + "<nobr>";                        
+                        sepType += ",</nobr> " + p + "<nobr>";
                 }
                 reportFile.print("(<code>" + sepType + "<nobr></code>)");
             }
         }
     }
 
-    /** 
+    /**
      * Emit a string which is a type by surrounding it with &lt;code&gt; tags.
      * Do not surround it with parentheses. Used to display methods' return
      * types and field types.
@@ -2106,20 +1927,20 @@
      */
     public static boolean noCommentsOnChanges = false;
 
-    /** 
-     * If set, then report changes in documentation (Javadoc comments) 
+    /**
+     * If set, then report changes in documentation (Javadoc comments)
      * between the old and the new API. The default is that this is not set.
      */
     public static boolean reportDocChanges = false;
 
-    /** 
+    /**
      * Define the prefix for HTML links to the existing set of Javadoc-
      * generated documentation for the new API. E.g. For J2SE1.3.x, use
-     * "http://java.sun.com/j2se/1.3/docs/api/"
+     * "https://java.sun.com/j2se/1.3/docs/api/"
      */
     public static String newDocPrefix = "../";
 
-    /** 
+    /**
      * Define the prefix for HTML links to the existing set of Javadoc-
      * generated documentation for the old API.
      */
diff --git a/src/jdiff/HTMLStatistics.java b/src/jdiff/HTMLStatistics.java
index 6dada5c..31fa213 100755
--- a/src/jdiff/HTMLStatistics.java
+++ b/src/jdiff/HTMLStatistics.java
@@ -46,8 +46,8 @@
 
            // writeText("<div class=\"g-section g-tpl-180\">");
            // Add the nav bar for the summary page
-            
-            
+
+
             // Write a customized navigation bar for the statistics page
             h_.writeText("<!-- Start of nav bar -->");
 
@@ -55,113 +55,121 @@
               = new SimpleDateFormat ("yyyy.MM.dd HH:mm");
             Date day = new Date();
 
-	    h_.writeText("<div id=\"gc-container\" style=\"padding-left:1em;padding-right:1em;\">");
 	    h_.writeText("<a name=\"top\"></a>");
-	    h_.writeText("<div id=\"gc-header\">");
-	    h_.writeText("  <div id=\"logo\" style=\"padding-left:1em;\">");
-	    h_.writeText("    <a href=\"../../../documentation.html\" target=\"_top\"><img style=\"border: 0;\" src=\"../../../assets-google/android-logo-sm.gif\" \"/></a>");
-	    h_.writeText("  </div> <!-- End logo -->");
-
-            h_.writeText("<div class=\"and-diff-id\">");
-            h_.writeText("<table class=\"diffspectable\">");
-            h_.writeText("<tr>");
-            h_.writeText("  <td colspan=\"2\" class=\"diffspechead\">API Diff Specification</td>");
-            h_.writeText("</tr>");
+	    h_.writeText("<div id=\"header\" style=\"margin-bottom:0;xborder-bottom:none;\">");
+	    h_.writeText("<div id=\"headerLeft\">");
+	    h_.writeText("<a href=\"../../../../index.html\" tabindex=\"-1\" target=\"_top\"><img src=\"../../../../assets/images/bg_logo.png\" alt=\"Android Developers\" /></a>");
+	    h_.writeText("</div>");
+	    h_.writeText("  <div id=\"headerRight\">");
+	    h_.writeText("  <div id=\"headerLinks\">");
+            h_.writeText("<!-- <img src=\"/assets/images/icon_world.jpg\" alt=\"\" /> -->");
+	    h_.writeText("<span class=\"text\">");
+	    h_.writeText("<!-- &nbsp;<a href=\"#\">English</a> | -->");
+	    h_.writeText("<nobr><a href=\"https://developer.android.com\" target=\"_top\">Android Developers</a> | <a href=\"https://www.android.com\" target=\"_top\">Android.com</a></nobr>");
+	    h_.writeText("</span>");
+	    h_.writeText("</div>");
+	    h_.writeText("  <div class=\"and-diff-id\" style=\"margin-top:6px;margin-right:8px;\">");
+            h_.writeText("    <table class=\"diffspectable\">");
 	    h_.writeText("      <tr>");
-	    h_.writeText("        <td class=\"diffspec\">To Version:</td>");
-	    h_.writeText("        <td class=\"diffvaluenew\">" + newAPIName + "</td>");
+	    h_.writeText("        <td colspan=\"2\" class=\"diffspechead\">API Diff Specification</td>");
 	    h_.writeText("      </tr>");
 	    h_.writeText("      <tr>");
-	    h_.writeText("        <td class=\"diffspec\">From Version:</td>");
+	    h_.writeText("        <td class=\"diffspec\" style=\"padding-top:.25em\">To Level:</td>");
+	    h_.writeText("        <td class=\"diffvaluenew\" style=\"padding-top:.25em\">" + newAPIName + "</td>");
+	    h_.writeText("      </tr>");
+	    h_.writeText("      <tr>");
+	    h_.writeText("        <td class=\"diffspec\">From Level:</td>");
 	    h_.writeText("        <td class=\"diffvalueold\">" + oldAPIName + "</td>");
 	    h_.writeText("      </tr>");
-            h_.writeText("<tr>");
-            h_.writeText("  <td class=\"diffspec\">Generated</td>");
-            h_.writeText("  <td class=\"diffvalue\">" + formatter.format( day ) + "</td>");
-            h_.writeText("</tr>");
-            h_.writeText("</table>");
-	    h_.writeText("  </div> <!-- End and-diff-id -->");
-
-	    h_.writeText("  <div class=\"and-diff-id\">");
-	    h_.writeText("    <table class=\"diffspectable\">");
 	    h_.writeText("      <tr>");
-	    h_.writeText("        <td class=\"diffspec\" colspan=\"2\"><a href=\"../changes.html\" target=\"_top\">Top of Report</a></div>");
+	    h_.writeText("        <td class=\"diffspec\">Generated</td>");
+	    h_.writeText("        <td class=\"diffvalue\">" + formatter.format( day ) + "</td>");
 	    h_.writeText("      </tr>");
  	    h_.writeText("    </table>");
-	    h_.writeText("  </div> <!-- End and-diff-id -->");
+ 	    h_.writeText("    </div><!-- End and-diff-id -->");
 
-	    h_.writeText("</div> <!-- End gc-header -->");
-	    h_.writeText("<div id=\"codesiteContent\" style=\"margin-top: 70px;margin-bottom:80px;\">");
+	    	h_.writeText("  <div class=\"and-diff-id\" style=\"margin-right:8px;\">");
+	    	h_.writeText("    <table class=\"diffspectable\">");
+	    	h_.writeText("      <tr>");
+	    	h_.writeText("        <td class=\"diffspec\" colspan=\"2\"><a href=\"../changes.html\" target=\"_top\">Top of Report</a>");
+	    	h_.writeText("      </tr>");
+ 	    	h_.writeText("    </table>");
+	    	h_.writeText("  </div> <!-- End and-diff-id -->");
 
-            // Write the title in the body with some formatting
-            h_.writeText("<div style=\"xborder:1px solid yellow;vertical-align:top;padding:1em;margin-left:0;text-align:left;\">");
-            h_.writeText(" <H1 class=\"pagecontenth1\">API&nbsp;Change&nbsp;Statistics</H1>");
-            h_.writeText("</div>");
+	    h_.writeText("  </div> <!-- End headerRight -->");
+	    h_.writeText("  </div> <!-- End header -->");
+	    h_.writeText("<div id=\"body-content\">");
+	    h_.writeText("<div id=\"doc-content\" style=\"position:relative;\">");
+	    h_.writeText("<div id=\"mainBodyFluid\">");
+
+            h_.writeText("<h1>API&nbsp;Change&nbsp;Statistics</h1>");
 
 
-            h_.writeText("<p>");
-            h_.writeText("The percent change statistic reported for all elements in each API is defined recursively as follows:</p>");
-            h_.writeText("<pre>"); 
-            h_.writeText("Percentage difference = 100 * (added + removed + 2*changed)");
-            h_.writeText("                        -----------------------------------");
-            h_.writeText("                        sum of public elements in BOTH APIs");
-            h_.writeText("</pre>"); 
-            h_.writeText("<p>where <code>added</code> is the number of packages added, <code>removed</code> is the number of packages removed, and <code>changed</code> is the number of packages changed.");
-            h_.writeText("This definition is applied recursively for the classes and their program elements, so the value for a changed package will be less than 1, unless every class in that package has changed.");
-            h_.writeText("The definition ensures that if all packages are removed and all new packages are");
-            h_.writeText("added, the change will be 100%. Values are rounded here, so a value of 0% indicates a percentage difference of less than 0.5%.</p>");
+            DecimalFormat df2 = new DecimalFormat( "#,###,###,##0.00" );
+            double dd = apiDiff.pdiff;
+            double dd2dec = new Double(df2.format(dd)).doubleValue();
 
-            h_.writeText("<p>The overall difference between the two APIs is approximately <span style=\"color:222;font-weight:bold;\">" + (int)(apiDiff.pdiff) + "%</span>.");
+            h_.writeText("<p>The overall difference between API Levels " + oldAPIName + " and " +  newAPIName + " is approximately <span style=\"color:222;font-weight:bold;\">" + dd2dec + "%</span>.");
             h_.writeText("</p>");
 
-            h_.writeText("<br><h2 class=\"pagecontenth2\">Contents</h2>");
-            h_.writeText("<dl><dt><a href=\"#packages\">Changed Packages</a></dt> <dd>Sorted by percentage difference</dd>");
-            h_.writeText("<dt><a href=\"#classes\">Changed Classes and <i>Interfaces</i></a></dt><dd>Sorted by percentage difference</dd>");
-            h_.writeText("<dt><a href=\"#numbers\">Total of Differences</a></dt><dd>Listed by number and type</dd></dl>");
-
-            h_.writeText("<br>");
-            h_.writeText("<a name=\"packages\"></a>");
-            h_.writeText("<h2 class=\"pagecontenth2\">Changed Packages, Sorted by Percentage Difference</h2>");
-            emitPackagesByDiff(apiDiff);
-
-            h_.writeText("<br>");
-            h_.writeText("<a name=\"classes\"></a>");
-            h_.writeText("<h2 class=\"pagecontenth2\">Changed Classes and <i>Interfaces</i>, Sorted by Percentage Difference</h2>");
-            emitClassesByDiff(apiDiff);
-
             h_.writeText("<br>");
             h_.writeText("<a name=\"numbers\"></a>");
-            h_.writeText("<h2 class=\"pagecontenth2\">Total of Differences, by Number and Type</h2>");
+            h_.writeText("<h2>Total of Differences, by Number and Type</h2>");
             h_.writeText("<p>");
-            h_.writeText("The table below lists the numbers of program elements (packages, classes, constructors, methods, and fields) that were removed, added or changed. The table includes only the highest-level program elements &mdash; that is, if a class with two methods was added, the number of methods added does not include those two methods, but the number of classes added does include that class.");
+            h_.writeText("The table below lists the numbers of program elements (packages, classes, constructors, methods, and fields) that were added, changed, or removed. The table includes only the highest-level program elements &mdash; that is, if a class with two methods was added, the number of methods added does not include those two methods, but the number of classes added does include that class.");
             h_.writeText("</p>");
 
             emitNumbersByElement(apiDiff);
-            
-	    h_.writeText("</div><!-- end codesitecontent -->");
-            h_.writeText("<div style=\"padding-left: 10px; padding-right: 10px; margin-top: 0; padding-bottom: 15px;\">");
-            h_.writeText("  <table style=\"width: 100%; border: none;\"><tr>");
-            h_.writeText("    <td style=\"text-align:center;font-size: 10pt; border: none; color: ccc;\"> ");
-            h_.writeText("      <span>&copy;2008 Google - ");
-            h_.writeText("            <a href=\"http://code.google.com\">Code Home</a> - ");
-            h_.writeText("            <a href=\"http://www.google.com/accounts/TOS\">Site Terms of Sservice</a> - "); 
-            h_.writeText("            <a href=\"http://www.google.com/privacy.html\">Privacy Policy</a> ");
-            h_.writeText("      </span>");
-            h_.writeText("      <div style=\"xborder 1px solid red;position:relative;margin-top:-2em;" );
-            h_.writeText("        font-size:8pt;color:aaa;text-align:right;\">");
-            h_.writeText("        <em>Generated by <a href=\"http://www.jdiff.org/\">JDiff</a></em><br><img ");
-            h_.writeText("        align=\"right\" src=\"../../../assets/jdiff_logo.gif\">");
-            h_.writeText("      </span>");
-            h_.writeText("    </td>");
-            h_.writeText(" </tr></table>");
-            h_.writeText("</div>");
-            h_.writeText("</div><!-- end gc-containter -->");
 
-            h_.writeText("<script src=\"http://www.google-analytics.com/ga.js\" type=\"text/javascript\">");
+            h_.writeText("<br>");
+            h_.writeText("<a name=\"packages\"></a>");
+            h_.writeText("<h2>Changed Packages, Sorted by Percentage Difference</h2>");
+            emitPackagesByDiff(apiDiff);
+            h_.writeText("<p style=\"font-size:10px\">* See <a href=\"#calculation\">Calculation of Change Percentages</a>, below.</p>");
+
+            h_.writeText("<br>");
+            h_.writeText("<a name=\"classes\"></a>");
+            h_.writeText("<h2>Changed Classes and <i>Interfaces</i>, Sorted by Percentage Difference</h2>");
+            emitClassesByDiff(apiDiff);
+            h_.writeText("<p style=\"font-size:10px\">* See <a href=\"#calculation\">Calculation of Change Percentages</a>, below.</p>");
+
+            h_.writeText("<br>");
+            h_.writeText("<h2 id=\"calculation\">Calculation of Change Percentages</h2>");
+            h_.writeText("<p>");
+            h_.writeText("The percent change statistic reported for all elements in the &quot;to&quot; API Level specification is defined recursively as follows:</p>");
+            h_.writeText("<pre>");
+            h_.writeText("Percentage difference = 100 * (added + removed + 2*changed)");
+            h_.writeText("                        -----------------------------------");
+            h_.writeText("                        sum of public elements in BOTH APIs");
+            h_.writeText("</pre>");
+            h_.writeText("<p>where <code>added</code> is the number of packages added, <code>removed</code> is the number of packages removed, and <code>changed</code> is the number of packages changed.");
+            h_.writeText("This definition is applied recursively for the classes and their program elements, so the value for a changed package will be less than 1, unless every class in that package has changed.");
+            h_.writeText("The definition ensures that if all packages are removed and all new packages are");
+            h_.writeText("added, the change will be 100%.</p>");
+
+            h_.writeText("      </div>	");
+            h_.writeText("      <div id=\"footer\">");
+            h_.writeText("        <div id=\"copyright\">");
+            h_.writeText("        Except as noted, this content is licensed under ");
+            h_.writeText("        <a href=\"https://creativecommons.org/licenses/by/2.5/\"> Creative Commons Attribution 2.5</a>.");
+            h_.writeText("        For details and restrictions, see the <a href=\"https://developer.android.com/license.html\">Content License</a>.");
+            h_.writeText("        </div>");
+            h_.writeText("      <div id=\"footerlinks\">");
+            h_.writeText("      <p>");
+            h_.writeText("        <a href=\"https://www.android.com/terms.html\">Site Terms of Service</a> -");
+            h_.writeText("        <a href=\"https://www.android.com/privacy.html\">Privacy Policy</a> -");
+            h_.writeText("        <a href=\"https://www.android.com/branding.html\">Brand Guidelines</a>");
+            h_.writeText("      </p>");
+            h_.writeText("    </div>");
+            h_.writeText("    </div> <!-- end footer -->");
+            h_.writeText("    </div><!-- end doc-content -->");
+            h_.writeText("    </div> <!-- end body-content --> ");
+
+            h_.writeText("<script src=\"https://www.google-analytics.com/ga.js\" type=\"text/javascript\">");
             h_.writeText("</script>");
             h_.writeText("<script type=\"text/javascript\">");
             h_.writeText("  try {");
-            h_.writeText("    var pageTracker = _gat._getTracker(\"UA-18071-1\");");
+            h_.writeText("    var pageTracker = _gat._getTracker(\"UA-5831155-1\");");
             h_.writeText("    pageTracker._setAllowAnchor(true);");
             h_.writeText("    pageTracker._initData();");
             h_.writeText("    pageTracker._trackPageview();");
@@ -182,13 +190,13 @@
      * of the values.
      */
     public void emitPackagesByDiff(APIDiff apiDiff) {
-        
+
         Collections.sort(apiDiff.packagesChanged, new ComparePkgPdiffs());
 
         // Write out the table start
-        h_.writeText("<TABLE summary=\"Packages sorted by percentage difference\" BORDER=\"1\" WIDTH=\"100%\" cellspacing=\"0\" cellpadding=\"0\">");
-        h_.writeText("<TR WIDTH=\"20%\">");
-        h_.writeText("  <TH>Percentage<br>Difference</TH>");
+        h_.writeText("<TABLE summary=\"Packages sorted by percentage difference\" WIDTH=\"100%\">");
+        h_.writeText("<TR>");
+        h_.writeText("  <TH  WIDTH=\"10%\">Percentage Difference*</TH>");
         h_.writeText("  <TH>Package</TH>");
         h_.writeText("</TR>");
 
@@ -273,9 +281,9 @@
         Collections.sort(allChangedClasses, new CompareClassPdiffs());
 
         // Write out the table start
-        h_.writeText("<TABLE summary=\"Classes sorted by percentage difference\" BORDER=\"1\" WIDTH=\"100%\" cellspacing=\"0\" cellpadding=\"0\">");
+        h_.writeText("<TABLE summary=\"Classes sorted by percentage difference\" WIDTH=\"100%\">");
         h_.writeText("<TR WIDTH=\"20%\">");
-        h_.writeText("  <TH><b>Percentage<br>Difference</b></TH>");
+        h_.writeText("  <TH WIDTH=\"10%\">Percentage<br>Difference*</TH>");
         h_.writeText("  <TH><b>Class or <i>Interface</i></b></TH>");
         h_.writeText("</TR>");
 
@@ -389,32 +397,29 @@
                  numMethodsRemoved += classDiff.methodsRemoved.size();
                  numMethodsAdded += classDiff.methodsAdded.size();
                  numMethodsChanged += classDiff.methodsChanged.size();
-                 
+
                  numFieldsRemoved += classDiff.fieldsRemoved.size();
                  numFieldsAdded += classDiff.fieldsAdded.size();
                  numFieldsChanged += classDiff.fieldsChanged.size();
             }
         }
-        
+
         // Write out the table
-        h_.writeText("<TABLE summary=\"Number of differences\" BORDER=\"1\" WIDTH=\"100%\" cellspacing=\"0\" cellpadding=\"0\">");
+        h_.writeText("<TABLE summary=\"Number of differences\" WIDTH=\"100%\">");
         h_.writeText("<TR>");
-        h_.writeText("  <TH COLSPAN=5 NOWRAP>");
-        h_.writeText("  Number of Differences</TH>");
-        h_.writeText("</TR>");
-        h_.writeText("<TR>");
-        h_.writeText("  <TH>&nbsp;</TD>");
-        h_.writeText("  <TH ALIGN=\"center\"><b>Removals</b></TH>");
+        h_.writeText("  <th>Type</th>");
         h_.writeText("  <TH ALIGN=\"center\"><b>Additions</b></TH>");
         h_.writeText("  <TH ALIGN=\"center\"><b>Changes</b></TH>");
+        h_.writeText("  <TH ALIGN=\"center\">Removals</TH>");
         h_.writeText("  <TH ALIGN=\"center\"><b>Total</b></TH>");
         h_.writeText("</TR>");
 
         h_.writeText("<TR>");
         h_.writeText("  <TD>Packages</TD>");
-        h_.writeText("  <TD ALIGN=\"right\">" + numPackagesRemoved + "</TD>");
+
         h_.writeText("  <TD ALIGN=\"right\">" + numPackagesAdded + "</TD>");
         h_.writeText("  <TD ALIGN=\"right\">" + numPackagesChanged + "</TD>");
+        h_.writeText("  <TD ALIGN=\"right\">" + numPackagesRemoved + "</TD>");
         int numPackages = numPackagesRemoved + numPackagesAdded + numPackagesChanged;
         h_.writeText("  <TD ALIGN=\"right\">" + numPackages + "</TD>");
         h_.writeText("</TR>");
@@ -425,9 +430,10 @@
 
         h_.writeText("<TR>");
         h_.writeText("  <TD>Classes and <i>Interfaces</i></TD>");
-        h_.writeText("  <TD ALIGN=\"right\">" + numClassesRemoved + "</TD>");
+
         h_.writeText("  <TD ALIGN=\"right\">" + numClassesAdded + "</TD>");
         h_.writeText("  <TD ALIGN=\"right\">" + numClassesChanged + "</TD>");
+        h_.writeText("  <TD ALIGN=\"right\">" + numClassesRemoved + "</TD>");
         int numClasses = numClassesRemoved + numClassesAdded + numClassesChanged;
         h_.writeText("  <TD ALIGN=\"right\">" + numClasses + "</TD>");
         h_.writeText("</TR>");
@@ -438,9 +444,9 @@
 
         h_.writeText("<TR>");
         h_.writeText("  <TD>Constructors</TD>");
-        h_.writeText("  <TD ALIGN=\"right\">" + numCtorsRemoved + "</TD>");
         h_.writeText("  <TD ALIGN=\"right\">" + numCtorsAdded + "</TD>");
         h_.writeText("  <TD ALIGN=\"right\">" + numCtorsChanged + "</TD>");
+        h_.writeText("  <TD ALIGN=\"right\">" + numCtorsRemoved + "</TD>");
         int numCtors = numCtorsRemoved + numCtorsAdded + numCtorsChanged;
         h_.writeText("  <TD ALIGN=\"right\">" + numCtors + "</TD>");
         h_.writeText("</TR>");
@@ -451,9 +457,9 @@
 
         h_.writeText("<TR>");
         h_.writeText("  <TD>Methods</TD>");
-        h_.writeText("  <TD ALIGN=\"right\">" + numMethodsRemoved + "</TD>");
         h_.writeText("  <TD ALIGN=\"right\">" + numMethodsAdded + "</TD>");
         h_.writeText("  <TD ALIGN=\"right\">" + numMethodsChanged + "</TD>");
+        h_.writeText("  <TD ALIGN=\"right\">" + numMethodsRemoved + "</TD>");
         int numMethods = numMethodsRemoved + numMethodsAdded + numMethodsChanged;
         h_.writeText("  <TD ALIGN=\"right\">" + numMethods + "</TD>");
         h_.writeText("</TR>");
@@ -464,9 +470,9 @@
 
         h_.writeText("<TR>");
         h_.writeText("  <TD>Fields</TD>");
-        h_.writeText("  <TD ALIGN=\"right\">" + numFieldsRemoved + "</TD>");
         h_.writeText("  <TD ALIGN=\"right\">" + numFieldsAdded + "</TD>");
         h_.writeText("  <TD ALIGN=\"right\">" + numFieldsChanged + "</TD>");
+        h_.writeText("  <TD ALIGN=\"right\">" + numFieldsRemoved + "</TD>");
         int numFields = numFieldsRemoved + numFieldsAdded + numFieldsChanged;
         h_.writeText("  <TD ALIGN=\"right\">" + numFields + "</TD>");
         h_.writeText("</TR>");
@@ -476,12 +482,13 @@
         numChanged += numFieldsChanged;
 
         h_.writeText("<TR>");
-        h_.writeText("  <TD><b>Total</b></TD>");
-        h_.writeText("  <TD ALIGN=\"right\">" + numRemoved + "</TD>");
-        h_.writeText("  <TD ALIGN=\"right\">" + numAdded + "</TD>");
-        h_.writeText("  <TD ALIGN=\"right\">" + numChanged + "</TD>");
+        h_.writeText("  <TD style=\"background-color:#FAFAFA\"><b>Total</b></TD>");
+
+        h_.writeText("  <TD  style=\"background-color:#FAFAFA\" ALIGN=\"right\"><strong>" + numAdded + "</strong></TD>");
+        h_.writeText("  <TD  style=\"background-color:#FAFAFA\" ALIGN=\"right\"><strong>" + numChanged + "</strong></TD>");
+        h_.writeText("  <TD  style=\"background-color:#FAFAFA\" ALIGN=\"right\"><strong>" + numRemoved + "</strong></TD>");
         int total = numRemoved + numAdded + numChanged;
-        h_.writeText("  <TD ALIGN=\"right\">" + total + "</TD>");
+        h_.writeText("  <TD  style=\"background-color:#FAFAFA\" ALIGN=\"right\"><strong>" + total + "</strong></TD>");
         h_.writeText("</TR>");
 
         h_.writeText("</TABLE>");
diff --git a/src/jdiff/JDiff.java b/src/jdiff/JDiff.java
index 14a7a97..c5cc25a 100755
--- a/src/jdiff/JDiff.java
+++ b/src/jdiff/JDiff.java
@@ -270,13 +270,13 @@
     /** If set, then read in two XML files and compare their APIs. */
     static boolean compareAPIs = false;
 
-    /** 
-     * The file separator for the local filesystem, forward or backward slash. 
+    /**
+     * The file separator for the local filesystem, forward or backward slash.
      */
     static String DIR_SEP = System.getProperty("file.separator");
 
     /** Details for where to find JDiff. */
-    static final String jDiffLocation = "http://www.jdiff.org";
+    static final String jDiffLocation = "https://www.jdiff.org";
     /** Contact email address for the primary JDiff maintainer. */
     static final String authorEmail = "mdoar@pobox.com";
 
diff --git a/src/jdiff/MergeChanges.java b/src/jdiff/MergeChanges.java
index 7ef0a84..1474949 100755
--- a/src/jdiff/MergeChanges.java
+++ b/src/jdiff/MergeChanges.java
@@ -190,11 +190,11 @@
         int endRemoved = classDiff.methodsRemoved.lastIndexOf(removedMethod);
         int startAdded = classDiff.methodsAdded.indexOf(removedMethod);
         int endAdded = classDiff.methodsAdded.lastIndexOf(removedMethod);
-        if (startRemoved != -1 && endRemoved != -1 && 
+        if (startRemoved != -1 && endRemoved != -1 &&
             startAdded != -1 && endAdded != -1) {
             // Find the index of the current removed method
             int removedIdx = -1;
-            for (int i = startRemoved; i <= endRemoved; i++) {                
+            for (int i = startRemoved; i <= endRemoved; i++) {
                 if (removedMethod.equalSignatures(classDiff.methodsRemoved.get(i))) {
                     removedIdx = i;
                     break;
@@ -204,7 +204,7 @@
                 System.out.println("Error: removed method index not found");
                 System.exit(5);
             }
-            // Find the index of the added method with the same signature, if 
+            // Find the index of the added method with the same signature, if
             // it exists, and make sure it is defined locally.
             int addedIdx = -1;
             for (int i = startAdded; i <= endAdded; i++) {
@@ -274,7 +274,7 @@
         }
         // Native or not
         if (Diff.showAllChanges && 
-	    oldMethod.isNative_ != newMethod.isNative_) {
+        oldMethod.isNative_ != newMethod.isNative_) {
             String changeText = "";
             if (oldMethod.isNative_)
                 changeText += "Changed from native to non-native.";
@@ -284,7 +284,7 @@
         }
         // Synchronized or not
         if (Diff.showAllChanges && 
-	    oldMethod.isSynchronized_ != newMethod.isSynchronized_) {
+        oldMethod.isSynchronized_ != newMethod.isSynchronized_) {
             String changeText = "";
             if (oldMethod.isSynchronized_)
                 changeText += "Changed from synchronized to non-synchronized.";
@@ -340,4 +340,4 @@
     /** Set to enable increased logging verbosity for debugging. */
     private static boolean trace = false;
 
-}
+}
\ No newline at end of file
diff --git a/src/jdiff/RootDocToXML.java b/src/jdiff/RootDocToXML.java
index 5717287..cb2f0e2 100755
--- a/src/jdiff/RootDocToXML.java
+++ b/src/jdiff/RootDocToXML.java
@@ -82,7 +82,7 @@
 	    }
 	} else {
 	    xsdFileName = outputDirectory;
-	    if (!xsdFileName.endsWith(JDiff.DIR_SEP)) 
+	    if (!xsdFileName.endsWith(JDiff.DIR_SEP))
 		 xsdFileName += JDiff.DIR_SEP;
 	}
         xsdFileName += "api.xsd";
@@ -91,7 +91,7 @@
             PrintWriter xsdFile = new PrintWriter(fos);
             // The contents of the api.xsd file
             xsdFile.println("<?xml version=\"1.0\" encoding=\"iso-8859-1\" standalone=\"no\"?>");
-            xsdFile.println("<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">");
+            xsdFile.println("<xsd:schema xmlns:xsd=\"https://www.w3.org/2001/XMLSchema\">");
             xsdFile.println("");
             xsdFile.println("<xsd:annotation>");
             xsdFile.println("  <xsd:documentation>");
@@ -770,16 +770,16 @@
             int val = Character.getNumericValue(c);
 //            if (s.indexOf("which is also a test for non-printable") != -1)
 //                System.out.println("** Char " + i + "[" + c + "], val =" + val); //DEBUG
-            // Ranges from http://www.unicode.org/unicode/reports/tr20/
+            // Ranges from https://www.unicode.org/unicode/reports/tr20/
             // Should really replace 0x2028 and  0x2029 with <br/>
             if (val == 0x0 ||
-                inRange(val, 0x2028, 0x2029) || 
-                inRange(val, 0x202A, 0x202E) || 
-                inRange(val, 0x206A, 0x206F) || 
-                inRange(val, 0xFFF9, 0xFFFC) || 
+                inRange(val, 0x2028, 0x2029) ||
+                inRange(val, 0x202A, 0x202E) ||
+                inRange(val, 0x206A, 0x206F) ||
+                inRange(val, 0xFFF9, 0xFFFC) ||
                 inRange(val, 0xE0000, 0xE007F)) {
                 if (trace) {
-                    System.out.println("Warning: changed non-printing character  " + sa[i] + " in " + doc.name()); 
+                    System.out.println("Warning: changed non-printing character  " + sa[i] + " in " + doc.name());
                 }
                 sa[i] = '#';
             }
@@ -1110,31 +1110,31 @@
      */
     public static boolean doExclude = false;
 
-    /** 
+    /**
      * Exclude program elements marked with this String, e.g. "@exclude".
      */
     public static String excludeTag = null;
 
-    /** 
-     * The base URI for locating necessary DTDs and Schemas. By default, this 
-     * is "http://www.w3.org". A typical value to use local copies of DTD files
+    /**
+     * The base URI for locating necessary DTDs and Schemas. By default, this
+     * is "https://www.w3.org". A typical value to use local copies of DTD files
      * might be "file:///C:/jdiff/lib"
      */
-    public static String baseURI = "http://www.w3.org";
+    public static String baseURI = "https://www.w3.org";
 
-    /** 
+    /**
      * If set, then strip out non-printing characters from documentation.
      * Default is that this is set.
      */
     static boolean stripNonPrintables = true;
 
-    /** 
+    /**
      * If set, then add the information about the source file and line number
      * which is available in J2SE1.4. Default is that this is not set.
      */
     static boolean addSrcInfo = false;
 
-    /** 
+    /**
      * If set, scan classes with no packages. 
      * If the source is  a jar file this may duplicates classes, so 
      * disable it using the -packagesonly option. Default is that this is 
diff --git a/src/jdiff/XMLToAPI.java b/src/jdiff/XMLToAPI.java
index a7fe33a..1246553 100755
--- a/src/jdiff/XMLToAPI.java
+++ b/src/jdiff/XMLToAPI.java
@@ -60,9 +60,9 @@
             }
 
             if (validateXML) {
-                parser.setFeature("http://xml.org/sax/features/namespaces", true);
-                parser.setFeature("http://xml.org/sax/features/validation", true);
-                parser.setFeature("http://apache.org/xml/features/validation/schema", true);
+                parser.setFeature("https://xml.org/sax/features/namespaces", true);
+                parser.setFeature("https://xml.org/sax/features/validation", true);
+                parser.setFeature("https://apache.org/xml/features/validation/schema", true);
             }
 
             parser.setContentHandler(handler);
