Merge "Start catching broken @see tags in frameworks/support."
diff --git a/res/assets/templates-sdk/body_tag.cs b/res/assets/templates-sdk/body_tag.cs
index 335eec5..1649ffa 100644
--- a/res/assets/templates-sdk/body_tag.cs
+++ b/res/assets/templates-sdk/body_tag.cs
@@ -1 +1,17 @@
-<body>
+<body class="gc-documentation <?cs
+  if:(reference.gms || reference.gcm)
+    ?>google<?cs
+  /if ?><?cs
+  if:(guide||develop||training||reference||tools||sdk)
+    ?>develop<?cs
+    if:reference
+      ?> reference api apilevel-<?cs var:class.since ?><?cs var:package.since ?><?cs
+    /if ?><?cs
+  elif:design
+    ?>design<?cs
+  elif:distribute
+    ?>distribute<?cs
+  /if ?>"><?cs
+if:dac && !page.not-api
+  ?><div id="doc-api-level" class="<?cs var:class.since ?><?cs var:package.since ?>" style="display:none"></div><?cs
+/if ?>
diff --git a/res/assets/templates-sdk/class.cs b/res/assets/templates-sdk/class.cs
index 5fb2a9d..d014edd 100644
--- a/res/assets/templates-sdk/class.cs
+++ b/res/assets/templates-sdk/class.cs
@@ -13,9 +13,10 @@
 ?><?cs def:write_method_summary(methods, included) ?>
 <?cs set:count = #1 ?>
 <?cs each:method = methods ?>
-  <tr <?cs
-      if:method.since
-        ?>data-version-added="<?cs var:method.since ?>"<?cs
+  <?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
+  <tr class="api apilevel-<?cs var:method.since ?>"<?cs
+      if:method.since ?>
+      data-version-added="<?cs var:method.since ?>"<?cs
       /if ?><?cs
       if:method.deprecatedsince
         ?> data-version-deprecated="<?cs var:method.deprecatedsince ?>"<?cs
@@ -50,9 +51,9 @@
 ?><?cs def:write_field_summary(fields, included) ?>
 <?cs set:count = #1 ?>
 <?cs each:field=fields ?>
-  <tr <?cs
-      if:field.since
-        ?>data-version-added="<?cs var:field.since ?>"<?cs
+  <tr class="api apilevel-<?cs var:field.since ?>"<?cs
+      if:field.since ?>
+      data-version-added="<?cs var:field.since ?>"<?cs
       /if ?><?cs
       if:field.deprecatedsince
         ?> data-version-deprecated="<?cs var:field.deprecatedsince ?>"<?cs
@@ -77,9 +78,9 @@
 ?><?cs def:write_constant_summary(fields, included) ?>
 <?cs set:count = #1 ?>
     <?cs each:field=fields ?>
-    <tr <?cs
-        if:field.since
-          ?>data-version-added="<?cs var:field.since ?>"<?cs
+    <tr class="api apilevel-<?cs var:field.since ?>"<?cs
+        if:field.since ?>
+        data-version-added="<?cs var:field.since ?>"<?cs
         /if ?><?cs
         if:field.deprecatedsince
           ?> data-version-deprecated="<?cs var:field.deprecatedsince ?>"<?cs
@@ -100,9 +101,9 @@
 ?><?cs def:write_attr_summary(attrs, included) ?>
 <?cs set:count = #1 ?>
     <?cs each:attr=attrs ?>
-    <tr <?cs
-        if:attr.since
-          ?>data-version-added="<?cs var:attr.since ?>"<?cs
+    <tr class="api apilevel-<?cs var:attr.since ?>"<?cs
+        if:attr.since ?>
+        data-version-added="<?cs var:attr.since ?>"<?cs
         /if ?><?cs
         if:attr.deprecatedsince
           ?> data-version-deprecated="<?cs var:attr.deprecatedsince ?>"<?cs
@@ -123,9 +124,9 @@
 ?><?cs def:write_inners_summary(classes) ?>
 <?cs set:count = #1 ?>
   <?cs each:cl=class.inners ?>
-    <tr <?cs
-        if:cl.since
-          ?>data-version-added="<?cs var:cl.since ?>"<?cs
+    <tr class="api apilevel-<?cs var:cl.since ?>"<?cs
+        if:cl.since ?>
+        data-version-added="<?cs var:cl.since ?>"<?cs
         /if ?><?cs
         if:cl.deprecatedsince
           ?> data-version-deprecated="<?cs var:cl.deprecatedsince ?>"<?cs
@@ -156,14 +157,18 @@
 ?>
 <?cs def:write_field_details(fields) ?>
 <?cs each:field=fields ?>
-<div <?cs
-     if:field.since
-       ?>data-version-added="<?cs var:field.since ?>"<?cs
+<?cs # this next line must be exactly like this to be parsed by eclipse ?>
+<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
+<A NAME="<?cs var:field.anchor ?>"></A>
+<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
+<div class="api apilevel-<?cs var:field.since ?>"<?cs
+     if:field.since ?>
+     data-version-added="<?cs var:field.since ?>"<?cs
      /if ?><?cs
      if:field.deprecatedsince
        ?> data-version-deprecated="<?cs var:field.deprecatedsince ?>"<?cs
      /if ?> >
-    <h3 class="api-name" id="<?cs var:field.anchor ?>"><?cs var:field.name ?></h3>
+    <h3 class="api-name"><?cs var:field.name ?></h3>
     <div class="api-level">
       <?cs call:since_tags(field) ?>
       <?cs call:federated_refs(field) ?>
@@ -191,14 +196,17 @@
 
 <?cs def:write_method_details(methods) ?>
 <?cs each:method=methods ?>
-<div <?cs
-     if:method.since
-       ?>data-version-added="<?cs var:method.since ?>"<?cs
+<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
+<A NAME="<?cs var:method.anchor ?>"></A>
+<?cs # The apilevel-N class MUST BE LAST in the sequence of class names ?>
+<div class="api apilevel-<?cs var:method.since ?>"<?cs
+     if:method.since ?>
+     data-version-added="<?cs var:method.since ?>"<?cs
      /if ?><?cs
      if:method.deprecatedsince
        ?> data-version-deprecated="<?cs var:method.deprecatedsince ?>"<?cs
      /if ?>>
-    <h3 class="api-name" id="<?cs var:method.anchor ?>"><?cs var:method.name ?></h3>
+    <h3 class="api-name"><?cs var:method.name ?></h3>
     <div class="api-level">
       <div><?cs call:since_tags(method) ?></div>
       <?cs call:federated_refs(method) ?>
@@ -218,7 +226,9 @@
 
 <?cs def:write_attr_details(attrs) ?>
 <?cs each:attr=attrs ?>
-<h3 class="api-name" id="<?cs var:attr.anchor ?>"><?cs var:attr.name ?></h3>
+<?cs # the A tag in the next line must remain where it is, so that Eclipse can parse the docs ?>
+<A NAME="<?cs var:attr.anchor ?>"></A>
+<h3 class="api-name"><?cs var:attr.name ?></h3>
 <?cs call:show_annotations_list(attr) ?>
 <?cs call:description(attr) ?>
 <?cs if:subcount(attr.methods) ?>
@@ -257,9 +267,9 @@
 <?cs # Includes api-info-block DIV at top of page. Standard Devsite uses right nav. ?>
 <?cs if:dac ?><?cs include:"page_info.cs" ?><?cs /if ?>
 <?cs # This DIV spans the entire document to provide scope for some scripts ?>
-<div id="jd-content" <?cs
-     if:class.since
-       ?>data-version-added="<?cs var:class.since ?>"<?cs
+<div class="api apilevel-<?cs var:class.since ?>" id="jd-content"<?cs
+     if:class.since ?>
+     data-version-added="<?cs var:class.since ?>"<?cs
      /if ?><?cs
      if:class.deprecatedsince
        ?> data-version-deprecated="<?cs var:class.deprecatedsince ?>"<?cs
@@ -413,9 +423,9 @@
 <tr><th><h3>Inherited XML attributes</h3></th></tr>
 <?cs each:cl=class.inherited ?>
 <?cs if:subcount(cl.attrs) ?>
-<tr <?cs
-    if:cl.since
-      ?>data-version-added="<?cs var:cl.since ?>"<?cs
+<tr class="api apilevel-<?cs var:cl.since ?>"<?cs
+    if:cl.since ?>
+    data-version-added="<?cs var:cl.since ?>"<?cs
     /if ?><?cs
     if:cl.deprecatedsince
       ?> data-version-deprecated="<?cs var:cl.deprecatedsince ?>"<?cs
@@ -442,9 +452,9 @@
   <tr><th colspan="2"><h3>Enum values</h3></th></tr>
 <?cs set:count = #1 ?>
   <?cs each:field=class.enumConstants ?>
-  <tr <?cs
-      if:field.since
-        ?>data-version-added="<?cs var:field.since ?>"<?cs
+  <tr class="api apilevel-<?cs var:field.since ?>"<?cs
+      if:field.since ?>
+      data-version-added="<?cs var:field.since ?>"<?cs
       /if ?><?cs
       if:field.deprecatedsince
         ?> data-version-deprecated="<?cs var:field.deprecatedsince ?>"<?cs
@@ -477,9 +487,9 @@
 <tr><th><h3>Inherited constants</h3></th></tr>
 <?cs each:cl=class.inherited ?>
 <?cs if:subcount(cl.constants) ?>
-  <tr <?cs
-      if:cl.since
-        ?>data-version-added="<?cs var:cl.since ?>"<?cs
+  <tr class="api apilevel-<?cs var:cl.since ?>"<?cs
+      if:cl.since ?>
+      data-version-added="<?cs var:cl.since ?>"<?cs
       /if ?><?cs
       if:cl.deprecatedsince
         ?> data-version-deprecated="<?cs var:cl.deprecatedsince ?>"<?cs
@@ -516,9 +526,9 @@
 <tr><th><h3>Inherited fields</h3></th></tr>
 <?cs each:cl=class.inherited ?>
 <?cs if:subcount(cl.fields) ?>
-  <tr <?cs
-      if:cl.since
-        ?>data-version-added="<?cs var:cl.since ?>"<?cs
+  <tr class="api apilevel-<?cs var:cl.since ?>"<?cs
+      if:cl.since ?>
+      data-version-added="<?cs var:cl.since ?>"<?cs
       /if ?><?cs
       if:cl.deprecatedsince
         ?> data-version-deprecated="<?cs var:cl.deprecatedsince ?>"<?cs
@@ -582,9 +592,9 @@
 <tr><th><h3>Inherited methods</h3></th></tr>
 <?cs each:cl=class.inherited ?>
 <?cs if:subcount(cl.methods) ?>
-<tr <?cs
-    if:cl.since
-      ?>data-version-added="<?cs var:cl.since ?>"<?cs
+<tr class="api apilevel-<?cs var:cl.since ?>"<?cs
+    if:cl.since ?>
+    data-version-added="<?cs var:cl.since ?>"<?cs
     /if ?><?cs
     if:cl.deprecatedsince
       ?> data-version-deprecated="<?cs var:cl.deprecatedsince ?>"<?cs
@@ -685,6 +695,31 @@
 
 </div><!-- end jd-content -->
 
+<?cs if:devsite ?>
+
+<div class="data-reference-resources-wrapper">
+  <?cs if:subcount(class.package) ?>
+  <ul data-reference-resources>
+    <?cs call:list("Annotations", class.package.annotations) ?>
+    <?cs call:list("Interfaces", class.package.interfaces) ?>
+    <?cs call:list("Classes", class.package.classes) ?>
+    <?cs call:list("Enums", class.package.enums) ?>
+    <?cs call:list("Exceptions", class.package.exceptions) ?>
+    <?cs call:list("Errors", class.package.errors) ?>
+  </ul>
+  <?cs elif:subcount(package) ?>
+  <ul data-reference-resources>
+    <?cs call:class_link_list("Annotations", package.annotations) ?>
+    <?cs call:class_link_list("Interfaces", package.interfaces) ?>
+    <?cs call:class_link_list("Classes", package.classes) ?>
+    <?cs call:class_link_list("Enums", package.enums) ?>
+    <?cs call:class_link_list("Exceptions", package.exceptions) ?>
+    <?cs call:class_link_list("Errors", package.errors) ?>
+  </ul>
+  <?cs /if ?>
+</div>
+<?cs /if ?>
+
 <?cs if:!devsite ?>
 <?cs include:"footer.cs" ?>
 <?cs include:"trailer.cs" ?>
diff --git a/res/assets/templates-sdk/classes.cs b/res/assets/templates-sdk/classes.cs
index f10eb71..bc6b98d 100644
--- a/res/assets/templates-sdk/classes.cs
+++ b/res/assets/templates-sdk/classes.cs
@@ -11,15 +11,22 @@
 <p>These are the API classes. See all
 <a href="packages.html">API packages</a>.</p>
 
+<div class="jd-letterlist"><?cs
+  each:letter=docs.classes ?>
+    <a href="#letter_<?cs name:letter ?>"><?cs
+      name:letter ?></a>&nbsp;&nbsp;<?cs
+  /each?>
+</div>
+
 <?cs each:letter=docs.classes ?>
 <?cs set:count = #1 ?>
 <h2 id="letter_<?cs name:letter ?>"><?cs name:letter ?></h2>
 <table>
     <?cs set:cur_row = #0 ?>
     <?cs each:cl = letter ?>
-        <tr <?cs
-            if:cl.since
-              ?>data-version-added="<?cs var:cl.since ?>"<?cs
+        <tr class="api apilevel-<?cs var:cl.since ?>"<?cs
+            if:cl.since ?>
+            data-version-added="<?cs var:cl.since ?>"<?cs
             /if ?><?cs
             if:cl.deprecatedsince
               ?> data-version-deprecated="<?cs var:cl.deprecatedsince ?>"<?cs
diff --git a/res/assets/templates-sdk/head_tag.cs b/res/assets/templates-sdk/head_tag.cs
index 374218b..bb698b9 100644
--- a/res/assets/templates-sdk/head_tag.cs
+++ b/res/assets/templates-sdk/head_tag.cs
@@ -20,7 +20,8 @@
     if:library.root ?>
       {% setvar book_path %}/reference/<?cs var:library.root ?>/_book.yaml{% endsetvar %}<?cs
     /if ?>
-    {% include "_shared/_reference-head-tags.html" %}<?cs
+    {% include "_shared/_reference-head-tags.html" %}
+    <meta name="body_class" value="api apilevel-<?cs var:class.since ?><?cs var:package.since ?>" /><?cs
   else ?><?cs # If NOT dac... ?>
     <meta name="hide_page_heading" value="true" />
     <meta name="book_path" value="<?cs
diff --git a/res/assets/templates-sdk/macros_override.cs b/res/assets/templates-sdk/macros_override.cs
index 8ef81cf..b475798 100644
--- a/res/assets/templates-sdk/macros_override.cs
+++ b/res/assets/templates-sdk/macros_override.cs
@@ -23,9 +23,9 @@
   <?cs set:count = #1 ?>
   <table class="jd-sumtable-expando">
     <?cs each:cl=classes ?>
-      <tr <?cs
-          if:cl.type.since
-            ?>data-version-added="<?cs var:cl.type.since ?>"<?cs
+      <tr class="api apilevel-<?cs var:cl.type.since ?>"<?cs
+          if:cl.type.since ?>
+          data-version-added="<?cs var:cl.type.since ?>"<?cs
           /if ?><?cs
           if:cl.type.deprecatedsince
             ?> data-version-deprecated="<?cs var:cl.type.deprecatedsince ?>"<?cs
diff --git a/res/assets/templates-sdk/package.cs b/res/assets/templates-sdk/package.cs
index 7595e40..ab66449 100644
--- a/res/assets/templates-sdk/package.cs
+++ b/res/assets/templates-sdk/package.cs
@@ -15,9 +15,9 @@
 <?cs include:"header.cs" ?>
 <?cs # Includes api-info-block DIV at top of page. Standard Devsite uses right nav. ?>
 <?cs if:dac ?><?cs include:"page_info.cs" ?><?cs /if ?>
-<div id="jd-content" <?cs
-     if:package.since
-       ?>data-version-added="<?cs var:package.since ?>"<?cs
+<div class="api apilevel-<?cs var:package.since ?>" id="jd-content"<?cs
+     if:package.since ?>
+     data-version-added="<?cs var:package.since ?>"<?cs
      /if ?><?cs
      if:package.deprecatedsince
        ?> data-version-deprecated="<?cs var:package.deprecatedsince ?>"<?cs
diff --git a/res/assets/templates-sdk/packages.cs b/res/assets/templates-sdk/packages.cs
index caf8fba..3fcfb81 100644
--- a/res/assets/templates-sdk/packages.cs
+++ b/res/assets/templates-sdk/packages.cs
@@ -13,13 +13,7 @@
 <?cs set:count = #1 ?>
 <table>
 <?cs each:pkg = docs.packages ?>
-    <tr <?cs
-        if:pkg.since
-          ?>data-version-added="<?cs var:pkg.since ?>"<?cs
-        /if ?><?cs
-        if:pkg.deprecatedsince
-          ?> data-version-deprecated="<?cs var:pkg.deprecatedsince ?>"<?cs
-        /if ?> >
+    <tr class="api apilevel-<?cs var:pkg.since ?>" >
         <td class="jd-linkcol"><?cs call:package_link(pkg) ?></td>
         <td class="jd-descrcol" width="100%"><?cs call:tag_list(pkg.shortDescr) ?></td>
     </tr>
diff --git a/res/assets/templates/macros.cs b/res/assets/templates/macros.cs
index 13a884f..6590b51 100644
--- a/res/assets/templates/macros.cs
+++ b/res/assets/templates/macros.cs
@@ -393,13 +393,7 @@
   set:count = #1 ?>
   <table class="jd-sumtable-expando"><?cs
       each:cl=classes ?>
-        <tr <?cs
-            if:cl.type.since
-              ?>data-version-added="<?cs var:cl.type.since ?>"<?cs
-            /if ?><?cs
-            if:cl.type.deprecatedsince
-              ?> data-version-deprecated="<?cs var:cl.type.deprecatedsince ?>"<?cs
-            /if ?> >
+        <tr class="<?cs if:count % #2 ?>alt-color<?cs /if ?> api apilevel-<?cs var:cl.type.since ?>" >
               <td><?cs call:type_link(cl.type) ?></td>
               <td width="100%"><?cs call:short_descr(cl) ?>&nbsp;</td>
           </tr><?cs set:count = count + #1 ?><?cs
@@ -413,7 +407,7 @@
     <li><h2 class="hide-from-toc"><?cs var:label ?></h2>
       <ul><?cs
       each:cl=classes ?>
-        <li><?cs call:type_link2(cl.type,"true") ?></li><?cs
+        <li class="api apilevel-<?cs var:cl.type.since ?>"><?cs call:type_link2(cl.type,"true") ?></li><?cs
       /each ?>
       </ul>
     </li><?cs
@@ -426,7 +420,7 @@
     <li><h2 class="hide-from-toc"><?cs var:label ?></h2>
       <ul><?cs
       each:cl=classes ?>
-          <li<?cs if:class.name == cl.label?> class="selected"<?cs /if ?>><?cs call:type_link2(cl,"true") ?></li><?cs
+          <li class="<?cs if:class.name == cl.label?>selected <?cs /if ?>api apilevel-<?cs var:cl.since ?>"><?cs call:type_link2(cl,"true") ?></li><?cs
       /each ?>
       </ul>
     </li><?cs
@@ -436,7 +430,7 @@
 # A list of links to packages, for use in the side navigation of packages (panel nav) ?><?cs
 def:package_link_list(packages) ?><?cs
   each:pkg=packages ?>
-    <li<?cs if:(class.package.name == pkg.name) || (package.name == pkg.name)?> class="selected"<?cs /if ?>><?cs call:package_link(pkg) ?></li><?cs
+    <li class="<?cs if:(class.package.name == pkg.name) || (package.name == pkg.name)?>selected <?cs /if ?>api apilevel-<?cs var:pkg.since ?>"><?cs call:package_link(pkg) ?></li><?cs
   /each ?><?cs
 /def ?>
 
diff --git a/src/com/google/doclava/AndroidAuxSource.java b/src/com/google/doclava/AndroidAuxSource.java
index cfcc0ac..1c97b18 100644
--- a/src/com/google/doclava/AndroidAuxSource.java
+++ b/src/com/google/doclava/AndroidAuxSource.java
@@ -146,12 +146,11 @@
       // Document required permissions
       if ((type == TYPE_CLASS || type == TYPE_METHOD || type == TYPE_FIELD)
           && annotation.type().qualifiedNameMatches("android", "annotation.RequiresPermission")) {
-        ArrayList<AnnotationValueInfo> values = null;
+        ArrayList<AnnotationValueInfo> values = new ArrayList<>();
         boolean any = false;
         for (AnnotationValueInfo val : annotation.elementValues()) {
           switch (val.element().name()) {
             case "value":
-              values = new ArrayList<AnnotationValueInfo>();
               values.add(val);
               break;
             case "allOf":
@@ -163,7 +162,7 @@
               break;
           }
         }
-        if (values == null || values.isEmpty()) continue;
+        if (values.isEmpty()) continue;
 
         ClassInfo permClass = annotation.type().findClass("android.Manifest.permission");
         ArrayList<TagInfo> valueTags = new ArrayList<>();
diff --git a/src/com/google/doclava/Doclava.java b/src/com/google/doclava/Doclava.java
index fe63038..fbde7d8 100644
--- a/src/com/google/doclava/Doclava.java
+++ b/src/com/google/doclava/Doclava.java
@@ -121,7 +121,6 @@
   public static boolean referenceOnly = false;
   public static boolean staticOnly = false;
   public static boolean yamlV2 = false; /* whether to build the new version of the yaml file */
-  public static boolean devsite = false; /* whether to build docs for devsite */
   public static AuxSource auxSource = new EmptyAuxSource();
   public static Linter linter = new EmptyLinter();
   public static boolean android = false;
@@ -195,7 +194,6 @@
     HashSet<String> stubPackages = null;
     HashSet<String> stubImportPackages = null;
     boolean stubSourceOnly = false;
-    boolean keepStubComments = false;
     ArrayList<String> knownTagsFiles = new ArrayList<String>();
 
     root = r;
@@ -304,8 +302,6 @@
         }
       } else if (a[0].equals("-stubsourceonly")) {
         stubSourceOnly = true;
-      } else if (a[0].equals("-keepstubcomments")) {
-        keepStubComments = true;
       } else if (a[0].equals("-sdkvalues")) {
         sdkValuePath = a[1];
       } else if (a[0].equals("-api")) {
@@ -382,7 +378,6 @@
       } else if (a[0].equals("-yamlV2")) {
         yamlV2 = true;
       } else if (a[0].equals("-devsite")) {
-        devsite = true;
         // Don't copy any assets to devsite output
         includeAssets = false;
         USE_DEVSITE_LOCALE_OUTPUT_PATHS = true;
@@ -392,8 +387,7 @@
           System.out.println("  ... Generating static html only for devsite");
         }
         if (yamlNavFile == null) {
-          // Use _toc.yaml as default to avoid clobbering possible manual _book.yaml files
-          yamlNavFile = "_toc.yaml";
+          yamlNavFile = "_book.yaml";
         }
       } else if (a[0].equals("-android")) {
         auxSource = new AndroidAuxSource();
@@ -431,8 +425,9 @@
       }
       // If no custom template path is provided, and this is a devsite build,
       // then use the bundled templates-sdk/ files by default
-      if (templates.isEmpty() && devsite) {
+      if (templates.isEmpty() && USE_DEVSITE_LOCALE_OUTPUT_PATHS) {
         resourceLoaders.add(new ClassResourceLoader(Doclava.class, "/assets/templates-sdk"));
+        System.out.println("\n#########  OK, Using templates-sdk ############\n");
       }
 
       templates = ClearPage.getBundledTemplateDirs();
@@ -453,11 +448,7 @@
       if (NAVTREE_ONLY) {
         if (AT_LINKS_NAVTREE) {
           AtLinksNavTree.writeAtLinksNavTree(javadocDir);
-        } else if (yamlV2) {
-          // Generate DAC-formatted left-nav for devsite
-          NavTree.writeYamlTree2(javadocDir, yamlNavFile);
         } else {
-          // This shouldn't happen; this is the legacy DAC left nav file
           NavTree.writeNavTree(javadocDir, "");
         }
         return true;
@@ -528,19 +519,17 @@
         } else if(gcmRef){
           refPrefix = "gcm-";
         }
+        NavTree.writeNavTree(javadocDir, refPrefix);
 
         // Write yaml tree.
-        if (yamlNavFile != null) {
+        if (yamlNavFile != null){
+          NavTree.writeYamlTree(javadocDir, yamlNavFile);
           if (yamlV2) {
-            // Generate DAC-formatted left-nav for devsite
+            // Generate both for good measure, to make transitions easier, but change the filename
+            // for the new one so there's yet another explicit opt-in required by fixing the name.
+            yamlNavFile = "_NEW" + yamlNavFile;
             NavTree.writeYamlTree2(javadocDir, yamlNavFile);
-          } else {
-            // Generate legacy devsite left-nav (shows sub-classes nested under parent class)
-            NavTree.writeYamlTree(javadocDir, yamlNavFile);
           }
-        } else {
-          // This shouldn't happen; this is the legacy DAC left nav file
-          NavTree.writeNavTree(javadocDir, refPrefix);
         }
 
         // Packages Pages
@@ -568,7 +557,7 @@
       if (!sTaglist.isEmpty()) {
         PageMetadata.WriteListByLang(sTaglist);
         // For devsite (ds) reference only, write samples_metadata to out dir
-        if ((devsite) && (!DEVSITE_STATIC_ONLY)) {
+        if ((USE_DEVSITE_LOCALE_OUTPUT_PATHS) && (!DEVSITE_STATIC_ONLY)) {
           PageMetadata.WriteSamplesListByLang(sTaglist);
         }
       }
@@ -580,7 +569,7 @@
         || privateApiFile != null || privateDexApiFile != null || apiMappingFile != null) {
       Stubs.writeStubsAndApi(stubsDir, apiFile, dexApiFile, proguardFile, removedApiFile,
           removedDexApiFile, exactApiFile, privateApiFile, privateDexApiFile, apiMappingFile,
-          stubPackages, stubImportPackages, stubSourceOnly, keepStubComments);
+          stubPackages, stubImportPackages, stubSourceOnly);
     }
 
     Errors.printErrors();
@@ -869,9 +858,6 @@
     if (option.equals("-stubsourceonly")) {
       return 1;
     }
-    if (option.equals("-keepstubcomments")) {
-      return 1;
-    }
     if (option.equals("-sdkvalues")) {
       return 2;
     }
@@ -1220,7 +1206,7 @@
 
     // Write the lists for JD documents (if there are HTML directories to process)
     // Skip this for devsite builds
-    if ((inputPathHtmlDirs.size() > 0) && (!devsite)) {
+    if ((inputPathHtmlDirs.size() > 0) && (!USE_DEVSITE_LOCALE_OUTPUT_PATHS)) {
       Data jddata = makeHDF();
       Iterator counter = new Iterator();
       for (String htmlDir : inputPathHtmlDirs) {
@@ -1582,11 +1568,8 @@
     setPageTitle(data, "Class Index");
     ClearPage.write(data, "classes.cs", packageDir + "classes" + htmlExtension);
 
-    if (!devsite) {
-      // Index page redirects to the classes.html page, so use the same directory
-      // This page is not needed for devsite builds, which should instead use _redirects.yaml
-      writeIndex(packageDir);
-    }
+    // Index page redirects to the classes.html page, so use the same directory
+    writeIndex(packageDir);
   }
 
   // we use the word keywords because "index" means something else in html land
diff --git a/src/com/google/doclava/MemberInfo.java b/src/com/google/doclava/MemberInfo.java
index 2854ab5..797b1b9 100644
--- a/src/com/google/doclava/MemberInfo.java
+++ b/src/com/google/doclava/MemberInfo.java
@@ -59,7 +59,7 @@
 
   public String anchor() {
     if (mSignature != null) {
-      return mName + mSignature.replace(" ", "%20");
+      return mName + mSignature;
     } else {
       return mName;
     }
diff --git a/src/com/google/doclava/NavTree.java b/src/com/google/doclava/NavTree.java
index 3375df5..b4861c8 100644
--- a/src/com/google/doclava/NavTree.java
+++ b/src/com/google/doclava/NavTree.java
@@ -26,7 +26,6 @@
 
 public class NavTree {
 
-  /* @deprecated This method was used for an older version of DAC, circa 2012, retired May 2018 */
   public static void writeNavTree(String dir, String refPrefix) {
     List<Node> children = new ArrayList<Node>();
     for (PackageInfo pkg : Doclava.choosePackages()) {
diff --git a/src/com/google/doclava/Stubs.java b/src/com/google/doclava/Stubs.java
index 930d52c..0ef3749 100644
--- a/src/com/google/doclava/Stubs.java
+++ b/src/com/google/doclava/Stubs.java
@@ -49,8 +49,7 @@
   public static void writeStubsAndApi(String stubsDir, String apiFile, String dexApiFile,
       String keepListFile, String removedApiFile, String removedDexApiFile, String exactApiFile,
       String privateApiFile, String privateDexApiFile, String apiMappingFile,
-      HashSet<String> stubPackages, HashSet<String> stubImportPackages, boolean stubSourceOnly,
-      boolean keepStubComments) {
+      HashSet<String> stubPackages, HashSet<String> stubImportPackages, boolean stubSourceOnly) {
     // figure out which classes we need
     final HashSet<ClassInfo> notStrippable = new HashSet<ClassInfo>();
     Collection<ClassInfo> all = Converter.allClasses();
@@ -260,7 +259,7 @@
         if (shouldWriteStub(cl.containingPackage().name(), stubPackages, stubPackageWildcards)) {
           // write out the stubs
           if (stubsDir != null) {
-            writeClassFile(stubsDir, notStrippable, cl, keepStubComments);
+            writeClassFile(stubsDir, notStrippable, cl);
           }
           // build class list for api file or keep list file
           if (apiWriter != null || dexApiWriter != null || keepListWriter != null) {
@@ -589,7 +588,7 @@
     return dir + cl.name() + ".java";
   }
 
-  static void writeClassFile(String stubsDir, HashSet<ClassInfo> notStrippable, ClassInfo cl, boolean keepStubComments) {
+  static void writeClassFile(String stubsDir, HashSet<ClassInfo> notStrippable, ClassInfo cl) {
     // inner classes are written by their containing class
     if (cl.containingClass() != null) {
       return;
@@ -609,7 +608,7 @@
     PrintStream stream = null;
     try {
       stream = new PrintStream(new BufferedOutputStream(new FileOutputStream(file)));
-      writeClassFile(stream, notStrippable, cl, keepStubComments);
+      writeClassFile(stream, notStrippable, cl);
     } catch (FileNotFoundException e) {
       System.err.println("error writing file: " + filename);
     } finally {
@@ -619,7 +618,7 @@
     }
   }
 
-  static void writeClassFile(PrintStream stream, HashSet<ClassInfo> notStrippable, ClassInfo cl, boolean keepStubComments) {
+  static void writeClassFile(PrintStream stream, HashSet<ClassInfo> notStrippable, ClassInfo cl) {
     PackageInfo pkg = cl.containingPackage();
     if (cl.containingClass() == null) {
         stream.print(parseLicenseHeader(cl.position()));
@@ -627,7 +626,7 @@
     if (pkg != null) {
       stream.println("package " + pkg.name() + ";");
     }
-    writeClass(stream, notStrippable, cl, keepStubComments);
+    writeClass(stream, notStrippable, cl);
   }
 
   private static String parseLicenseHeader(/* @Nonnull */ SourcePositionInfo positionInfo) {
@@ -678,11 +677,7 @@
     return builder.toString();
   }
 
-  static void writeClass(PrintStream stream, HashSet<ClassInfo> notStrippable, ClassInfo cl, boolean keepStubComments) {
-    if (keepStubComments) {
-      writeComment(stream, cl);
-    }
-
+  static void writeClass(PrintStream stream, HashSet<ClassInfo> notStrippable, ClassInfo cl) {
     writeAnnotations(stream, cl.annotations(), cl.isDeprecated());
 
     stream.print(cl.scope() + " ");
@@ -757,14 +752,14 @@
 
     for (ClassInfo inner : cl.getRealInnerClasses()) {
       if (notStrippable.contains(inner) && !inner.isDocOnly()) {
-        writeClass(stream, notStrippable, inner, keepStubComments);
+        writeClass(stream, notStrippable, inner);
       }
     }
 
 
     for (MethodInfo method : cl.constructors()) {
       if (!method.isDocOnly()) {
-        writeMethod(stream, method, true, keepStubComments);
+        writeMethod(stream, method, true);
       }
     }
 
@@ -811,7 +806,7 @@
         }
       }
       if (!method.isDocOnly()) {
-        writeMethod(stream, method, false, keepStubComments);
+        writeMethod(stream, method, false);
       }
     }
     // Write all methods that are hidden or removed, but override abstract methods or interface methods.
@@ -828,7 +823,7 @@
           (overriddenMethod.isAbstract() || overriddenMethod.containingClass().isInterface())) {
         method.setReason("1:" + classContainingMethod.qualifiedName());
         cl.addMethod(method);
-        writeMethod(stream, method, false, keepStubComments);
+        writeMethod(stream, method, false);
       }
     }
 
@@ -840,7 +835,7 @@
 
     for (FieldInfo field : cl.selfFields()) {
       if (!field.isDocOnly()) {
-        writeField(stream, field, keepStubComments);
+        writeField(stream, field);
       }
     }
 
@@ -858,10 +853,7 @@
     stream.println("}");
   }
 
-  static void writeMethod(PrintStream stream, MethodInfo method, boolean isConstructor, boolean keepStubComments) {
-    if (keepStubComments) {
-      writeComment(stream, method);
-    }
+  static void writeMethod(PrintStream stream, MethodInfo method, boolean isConstructor) {
     String comma;
 
     writeAnnotations(stream, method.annotations(), method.isDeprecated());
@@ -932,10 +924,7 @@
     }
   }
 
-  static void writeField(PrintStream stream, FieldInfo field, boolean keepStubComments) {
-    if (keepStubComments) {
-      writeComment(stream, field);
-    }
+  static void writeField(PrintStream stream, FieldInfo field) {
     writeAnnotations(stream, field.annotations(), field.isDeprecated());
 
     stream.print(field.scope() + " ");
@@ -1101,16 +1090,6 @@
     stream.println(";");
   }
 
-  static void writeComment(PrintStream stream, DocInfo doc) {
-    if (!doc.isHiddenOrRemoved() && !doc.comment().isDocOnly() && !"".equals(doc.getRawCommentText())) {
-      String newLineSeparator = System.getProperty("line.separator");
-      stream.println("/**");
-      stream.print(" * ");
-      stream.println(doc.getRawCommentText().replace(newLineSeparator, newLineSeparator + " *"));
-      stream.println(" */");
-    }
-  }
-
   public static void writeXml(PrintStream xmlWriter, Collection<PackageInfo> pkgs, boolean strip) {
     if (strip) {
       Stubs.writeXml(xmlWriter, pkgs);